Created
September 2, 2021 19:35
-
-
Save Tsuey/674f757e9cf79cdb81c4de93e1fae7f0 to your computer and use it in GitHub Desktop.
Boring CEDA Notes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
These are several referential files, all of which except "BUILDER.BAT" are already | |
included in the "Build" off Google Drive (inside the "z_Extra" folder). | |
Nothing here is important -- unless you're bored, or interested in Blender hacks, etc. | |
It's easy to lose track of plaintext-based notes that aren't going to be shipped, | |
so all plaintext-based notes are amassed here. | |
Summary of all these files: | |
BUILDER.BAT | |
RoboCopy batch script to instantly produce a VPK'able "Build" | |
Decompiles of Influential Maps to Mini-Remix.txt | |
Discord Downloads.txt | |
EXPLANATION.TXT | |
Documentation/notes. | |
LOADINGSCREEN_SCENE_PLACEHOLDER.bsp | |
LOADINGSCREEN_SCENE_PLACEHOLDER.vmf | |
Not included -- will always be in "z_Extra" by necessity. | |
QUICKNOTES.TXT | |
Registry Hammer Config -- Main.reg | |
Valve Wiki Notes.txt | |
Settings/notes. | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#### BUILDER.BAT #### | |
####################### | |
:: ############################################################################# | |
:: ############################################################################# | |
:: GOAL | |
:: ==== | |
:: CAUTION :: THIS IS NOT MEANT TO PRODUCE A FULL BACKUP. THAT IS WHAT | |
:: "CHECKPOINT" ZIP'S ARE FOR. THIS WILL, HOWEVER, PRODUCE | |
:: A FULL "PRACTICAL BACKUP" OF IMPORTANT FILES TO VPK. | |
:: Create a BAT/batch file to auto-COPY the small amount of actually-critical | |
:: files to increase productivity while keeping "Build Saves" aggressive. This | |
:: means excluding worthless files like previous NAV runs and Hammer VMX's. | |
:: While these builds target easy VPK'ing, do include all "src" assets so others | |
:: can help and keeps priority on all the files Valve will finally be sent. The | |
:: point is to not include reference-only decompiles, tools, LNK/URL files, etc. | |
:: EXCLUSIONS (ARCWEAVE) | |
:: ===================== | |
:: References (currently 98/100 of them since the 2 PDF's need to at least wait | |
:: until ZIP files are supported) need to go on Arcweave instead, for visibility: | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_REFERENCES\ | |
:: Also, PDF/ODT/DOCX design docs have been backed up, but will never be edited | |
:: again since Arcweave should be severely abused to communicate design instead. | |
:: Over time, all existing design doc visions need to be aggregated there. | |
:: EXCLUSIONS (OTHER) | |
:: ================== | |
:: Obsoleted and anticipatory obsoletions that are excluded from this BAT: | |
:: #1 | |
:: "automatic_door_concepts" BSP/VMF is 100% within "ceda_testing_vs.bsp" | |
:: and is fully obsolete... so don't be distracted by all its past backups. | |
:: #2 | |
:: This file: | |
:: \_LOADINGSCREEN_SCENE\LOADINGSCREEN_SCENE_mergeprocess.vmf | |
:: Will be obsoleted very soon as its remnants are copied into main VMF. | |
:: #3 | |
:: All "ceda_courtyard_frame"-based files -- still not sure how these will | |
:: be used, but "/materialsrc/" & "/modelsrc/" will eventually need their | |
:: assets, whichever I decide to finally use (some mixture of these): | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame.vmf | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame\ceda_courtyard_frame -- Final -- Frame Start Here for Serious Work Later.blend | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame\ceda_courtyard_frame -- Final -- Frame Start Here for Serious Work Later.smd | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame\ceda_courtyard_frame -- Final -- Test Diversion with Facade.blend | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame\ceda_courtyard_frame -- Final -- Test Diversion with Facade.smd | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame\Test Compile 06 -- Increased bbox to 4000x4000 to eliminate forced draw distance and culling\ceda_courtyard_frame.qc | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame\Test Compile 06 -- Increased bbox to 4000x4000 to eliminate forced draw distance and culling\ceda_courtyard_frame.smd | |
:: \_LOADINGSCREEN_SCENE\ceda_courtyard_frame\Test Compile 06 -- Increased bbox to 4000x4000 to eliminate forced draw distance and culling\ceda_courtyard_frame_anims\idle.smd | |
:: ############################################################################# | |
:: ############################################################################# | |
:: TODO / WARNINGS | |
:: =============== | |
:: Everything isn't quite up to standards this first time around -- so for the | |
:: next build (and for reference into the future), avoid these types of problems: | |
:: #1 | |
:: Currently these files: | |
:: "ceda_easel01a" (materials/materialsrc) | |
:: "ceda_easel02" (models/modelsrc) | |
:: Have a naming discrepancy. This was because adding multiple skins to | |
:: the "01" model didn't work out, PLUS it was better to create a NEW model | |
:: than lossy-decompile and replace Valve's. Also, replacing Valve's likely | |
:: would have required VPK'ing them since, like the "insect_fx.pcf" file, | |
:: it needs to override Valve's by VPK load order (inconveniencing my work). | |
:: #2 | |
:: Unnecessary JPG/PNG files (materials/materialsrc). | |
:: I didn't forget to include BLEND files this time, but don't forget in | |
:: the future, either, since the SMD are not absolute 100% proof of source. | |
:: Same applies for XCF/GIMP files -- unless the edit is painfully simple | |
:: like my handful of TOOL texture edits (which went straight to TGA). | |
:: SUMMARY OF ALL INCLUSIONS (AND WHY) | |
:: =================================== | |
:: Everything in the next ######## block is straight BAT script -- but here all | |
:: of it is thoroughly explained and individually listed. | |
:: Always copy/backup everything in these 4 folders. This means they'll need to | |
:: be aggressively maintained. | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\materials\ | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\materialsrc\ | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\models\ | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\ | |
:: These 2 folders only have single files in them -- but might not always. It'll | |
:: always be harmless to "build" the backup for all files in these folders... | |
:: currently just "ceda_testing_vs.txt" and "\vscripts\ceda_testing_vs.nut": | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\missions\ | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\scripts\ | |
:: These 7 specific files are all that's needed from their respective folders. | |
:: Completed ignored are files for previous NAV (NAV01-0X) runs, Hammer VMX's, | |
:: compile LOG, PRT Portal files, as well as the "\mapsrc\" version of the BSP | |
:: since that will always lack String Tables that are added on first-run. | |
:: Also "particles" is treated like a "particlesrc", so throw in the ORIGINAL. | |
:: The rest of the folder is extra Particle Editor bloat. Also "pak01_dir.vpk" | |
:: is excluded, since that's built with only "insect_fx.pcf" for convenience | |
:: since just that 1 file needs to override Valve's VPK load order of theirs. | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\addonimage.jpg | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\addoninfo.txt | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\maps\ceda_testing_vs.bsp | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\maps\ceda_testing_vs.nav | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\mapsrc\ceda_testing_vs.vmf | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\particles\insect_fx.pcf | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\particles\ORIGINAL -- insect_fx.pcf | |
:: Lastly, instead of replicating the original folder structure, this is where | |
:: I'll throw miscellaneous stuff into a special "z_Extra" folder. This is for | |
:: random TXT file notes, Hammer Config REG's, and the LOADING SCREEN map files. | |
:: The TXT files are included just in case their stuff is interesting to anyone, | |
:: or opens some door for others to request files I've excluded. | |
:: The "LOADINGSCREEN_SCENE_PLACEHOLDER" BSP/VMF will always be a necessary evil. | |
:: Its specific camera angle and lighting justifies the separate map, and removes | |
:: need to bloat the main VMF with point_templates for the SI prop_dynamics etc. | |
:: It's "throwaway slop" that doesn't need on-grid OCD and only needs to look | |
:: good for one single screenshot, that I'll extensively edit afterwards anyway. | |
:: Its facade can be sloppily updated whenever needed, so let's back it up. | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_ANNOYING_MODEL_COMPLICATIONS\EXPLANATION.TXT | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_ANNOYING_MODEL_COMPLICATIONS\QUICKNOTES.TXT | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES\_MIX -- QC Contents Ladder Tests\_ASSETS\Discord Downloads.txt | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES\_MIX -- QC Contents Ladder Tests\Valve Wiki Notes.txt | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES\_STYLES_AND_STANDARDS_GUIDES\Decompiles of Influential Maps to Mini-Remix.txt | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES\Registry Hammer Config -- Main.reg | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_LOADINGSCREEN_SCENE\LOADINGSCREEN_SCENE_PLACEHOLDER.bsp | |
:: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_LOADINGSCREEN_SCENE\LOADINGSCREEN_SCENE_PLACEHOLDER.vmf | |
:: ############################################################################# | |
:: ############################################################################# | |
:: ROBOCOPY DETAILS | |
:: ================ | |
:: As far as the parameters go: /XJ (Exclude Junctions) is useful but not here | |
:: since there will never be any of those; /V (Verbose) isn't needed since it's | |
:: unlikely any issues (like skipped/in-use files) will occur; /TEE (Dump console | |
:: in addition to TXT) isn't needed since /LOG: won't be needed since it's so | |
:: few files they can quickly be manually reviewed; /R:1 /W:0 (1 million Retries | |
:: with 30 second Waits is the default) is just bloat as nothing should fail... | |
:: and if anything does fail, simply terminate the offending EXE's. | |
:: Other than that, /COPYALL isn't needed since /E copies subfolders including | |
:: those which are empty (/S is identical but excludes empty) -- it's possible | |
:: that it requires Admin in some scenarios (it's equivalent to /COPY:DATSOU, | |
:: which includes Security/Owner/Auditing info), so that's another reason to | |
:: not use it... its default is /COPY:DAT (Data/Attributes/Timestamps both | |
:: Modified and Created). AVOID /MIR and /PURGE as they're destructive. Lastly, | |
:: be careful to only use ""'s on paths if required, i.e. it requires C:\ and | |
:: will fail with "C:\", but would be OK with "C:\Left 4 Dead 2" -- however, | |
:: caution that "C:\Left 4 Dead 2\" will fail. RoboCopy is great but sensitive. | |
:: Directory Timestamps with /DCOPY:T aren't important here. | |
:: Sources: | |
:: https://en.wikipedia.org/wiki/Robocopy#Syntactic_focus_on_copying_folders | |
:: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy | |
:: https://ss64.com/nt/robocopy.html | |
:: Format for copying Data/Attributes/Timestamps recursively with empty folders: | |
:: robocopy "C:\Build\Source" "C:\Build\Destination" /E | |
:: Format for copying "file.ext" from Source to Destination (/E isn't needed | |
:: because that only specifies subfolders, which this use won't be copying), | |
:: and Data/Attributes/Timestamps are the standard constant with RoboCopy... | |
:: note that unlike COPY/XCOPY, the first two parameters MUST be folder paths | |
:: and single trailing backlashes will break it -- the SS64 site, however, says | |
:: that's because it's treated as an escape character and // will work, or even | |
:: curiously "/.", but ideally just don't include the trailing / at all: | |
:: robocopy "C:\Build\Source" "C:\Build\Destination" "file.ext" | |
:: ############################################################################# | |
:: ############################################################################# | |
:: FINAL | |
:: ===== | |
:: CAUTION: **DO NOT Run as Admin**. RoboCopy starts in "C:\Windows\System32\" | |
:: if you do that and would not find any files. None of these files should ever | |
:: require Admin to be copied, anyway (and if "Run as Admin" is needed, it's | |
:: better to do this in a manually opened console after a CD / Change Directory). | |
:: Always backup everything in these 4 folders and aggressively maintain them. | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\materials" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\materials" /E | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\materialsrc" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\materialsrc" /E | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\models" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\models" /E | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\modelsrc" /E | |
:: Always backup these 2 folders even though they may always be very few files. | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\missions" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\missions" /E | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\scripts" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\scripts" /E | |
:: Always backup these 7 very specific files to exclude excess bloat like VMX's. | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built" "addonimage.jpg" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built" "addoninfo.txt" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\maps" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\maps" "ceda_testing_vs.bsp" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\maps" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\maps" "ceda_testing_vs.nav" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\mapsrc" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\mapsrc" "ceda_testing_vs.vmf" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\particles" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\particles" "insect_fx.pcf" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\particles" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\particles" "ORIGINAL -- insect_fx.pcf" | |
:: These 8 may change in the future, but good references and LOADING SCREEN need. | |
:: Disregards all the original folder structure and places them all in "z_Extra". | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_ANNOYING_MODEL_COMPLICATIONS" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "EXPLANATION.TXT" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_ANNOYING_MODEL_COMPLICATIONS" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "QUICKNOTES.TXT" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES\_MIX -- QC Contents Ladder Tests\_ASSETS" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "Discord Downloads.txt" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES\_MIX -- QC Contents Ladder Tests" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "Valve Wiki Notes.txt" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES\_STYLES_AND_STANDARDS_GUIDES" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "Decompiles of Influential Maps to Mini-Remix.txt" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_SOURCED_ASSET_FILES" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "Registry Hammer Config -- Main.reg" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_LOADINGSCREEN_SCENE" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "LOADINGSCREEN_SCENE_PLACEHOLDER.bsp" | |
robocopy "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\_LOADINGSCREEN_SCENE" "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\__BUILDER\Built\z_Extra" "LOADINGSCREEN_SCENE_PLACEHOLDER.vmf" | |
pause | |
:: ############################################################################# | |
:: ############################################################################# | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#### Decompiles of Influential Maps to Mini-Remix.txt #### | |
############################################################ | |
Goals | |
----- | |
+ Versus Tutorial geometry and attacks should lightly | |
call back to the actual official Valve maps that | |
they'll end up playing -- feel familiar, yet different | |
+ Covertly establish some transferable muscle memory | |
Dead Center and No Mercy | |
------------------------ | |
+ Most played pub campaigns by far, all maps for these | |
campaigns are hyper-relevant | |
+ Tutorial should have elements reminiscent of both | |
+ Starts immediately reminiscent of Dead Center 3 | |
Dead Air 4 | |
---------- | |
+ Boomer's starting area | |
+ Needs expanding / more differences, tease underground | |
+ Thematic "full circle" of CEDA's testing facility: the | |
player sees the "breakball" in its destroyed form early | |
on, and later gets to destroy it themselves AND wipe | |
Death Charge? | |
------------- | |
+ Mildly obligated to allow the player to get their first | |
Death Charge -- probably better to save it for an actual | |
game though, as taking a Survivor permanently out of play | |
limits where the tutorial can go | |
+ Far too frustrating to have Survivors defib the deceased | |
+ Blood Harvest 1 probably out of the question | |
+ Something like Dark Carnival 2 that only wastes their time | |
would be best... and keep the Death Charge "Achievement" | |
exclusive to actual play | |
+ A Tutorial should only, at most, reward easier Achievements | |
Both Survivor groups in one map? | |
-------------------------------- | |
+ Technically, can only go the Passing 3 route of "team 4" | |
Survivor bots which don't appear on the HUD | |
+ Technically, the game doesn't want this to be done, and | |
may having all 7 Survivors (8?) strikes me as over-done | |
Swamp Fever 1 | |
------------- | |
+ Maybe "lambda Chargers" for the other SI? | |
+ Like if the Sacrifice 1 Tank died while chained up | |
Dark Carnival 1 | |
--------------- | |
+ Only used for CEDA trailer parking area reference | |
Expired Urgency | |
--------------- | |
+ Everything here used to be hyper-active and panicked | |
+ Parish 2/5 bombing runs except year+ distant aftermath | |
Courtyard | |
--------- | |
+ Swamp Fever 4 mansion except it's all around you | |
+ Parish 2 is the best example of a thematically sensible | |
and fun gauntlet/crescendo... a "maze of tents" in the | |
courtyard isn't going to cut it, but it's not FAR off | |
since it could be reminiscent but with a LOT more CHOICE | |
+ Passing 1 park area except larger and more tents | |
+ Hard Rain 1/4 slight drizzle that comes and goes | |
+ Sacrifice 1/2 establish the skybox/lighting aesthetic | |
+ Dead Air 1/2 verticality to keep it interesting, this | |
should be a possible Survival holdout spot and be the | |
perfect Hunter/Jockey heaven | |
+ Dead Air 3 example of wider combat space with 2 holdouts | |
+ Blood Harvest 5 possible example of militarization | |
+ Surely the military lended resources to CEDA's own HQ | |
+ The Witch needs to be tutorialized somewhere, and given | |
the extent of detail this Courtyard is desired to have, | |
perhaps "stretch" out this segment by introducing Witch | |
Underground | |
----------- | |
+ Dark Carnival 3, Passing 2, No Mercy 2/3, Death Toll 2, | |
and Blood Harvest 2/3 offer good visual and gameplay | |
opportunities for the underground segment | |
+ Garage with car alarm tutorialized somewhere within it, | |
maybe reminiscent of taking the "dark right" en route | |
to Dead Air 3 end safe room | |
+ Charger/Spitter/Tank domain | |
Last Stand | |
---------- | |
+ Need to teach "obscured markers" in the Tutorial if we | |
intend to "port" these over to the other campaigns | |
DeadLine2 | |
--------- | |
+ Mostly follow "tutorial_standards_vs.bsp" name convention | |
+ At its heart, CEDA is the first Infected-exclusive map | |
Irrelevant Maps | |
--------------- | |
+ Nothing about CEDA will be Swamp/stream-related | |
+ Cities/towns/streets are not relevant, at most there would | |
be an optional glimpse of a Dead Center 2-like street at start | |
+ Dark Carnival 4's strongarm Tank horde is a gimmick or | |
easter egg and shouldn't be taught in a Tutorial... it is | |
simply far too niche | |
+ Dead Air 5 is a boring finale and a template of what to avoid | |
+ Scavenge would not make sense anywhere in this map, Survival | |
however could, but the focus is on Infected play, shortcuts | |
with regard to "Courtyard accessibility" (i.e. deadends are | |
OK for behind-the-scenes Infected but BAD for Survivors) may | |
eliminate chance for Survival... again, not a priority | |
+ Parish 2's Park Scavenge would play far too similarly anyway, | |
so thematically / gameplay Scavenge does not make any sense | |
+ Parish 4 is bombed constantly but has insignificant signs of | |
decay or destruction... so nothing to learn in that regard | |
+ Elevator rides too boring for a Tutorial, but some "lull" | |
time will be needed for Survivors to heal up, ala Dead Center 2, | |
perhaps they find their way into an armory or military setup, | |
maybe they re-gear at the center of the Courtyard? | |
+ Particle effects limited to bugs/insectswarm not pyrotechnics | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#### Discord Downloads.txt #### | |
################################# | |
[8:14 PM] NF: | |
_____________ | |
prefabs of infected ladders that can be turned into props using propper later | |
on. the infected ladders are width 32 and have the built in "guards" along | |
their sides (4 units each side) to prevent players from getting stuck on them | |
https://cdn.discordapp.com/attachments/860045725449846824/866155828020248606/infected_ladder_32.vmf | |
https://cdn.discordapp.com/attachments/860045725449846824/866155829522333706/infected_ladder_64.vmf | |
https://cdn.discordapp.com/attachments/860045725449846824/866155830796746812/infected_ladder_128.vmf | |
https://cdn.discordapp.com/attachments/860045725449846824/866155832219664424/infected_ladder_256.vmf | |
https://cdn.discordapp.com/attachments/860045725449846824/866155833602867240/infected_ladder_512.vmf | |
2.43 KB (all this size except 256 which is 2.42 KB) | |
[12:45 AM] Syberian Husky: | |
__________________________ | |
- Added Infected Ladder Models | |
- Added Infected Ladder Side Clips (bumpers) | |
- Added My VMFs | |
- Added .qc files | |
Sizes 32 | 64 | 128 | 256 | 512 | 1024 | |
Definitely the most pain-in-the-ass propper models I have ever done, the | |
material file wouldn't create properly. just added it manually. | |
https://cdn.discordapp.com/attachments/860045725449846824/866948870542065674/inf_ladders.zip | |
81.68 KB | |
Tsuey | |
_____ | |
The rest. | |
Using ONLY the knowledge here: | |
https://developer.valvesoftware.com/wiki/Studiomdl_Data | |
It should be possible to merge the "ladder" and "guard clips" | |
into the same SMD, separating them into different bones, then | |
use $jointcontents (instead of $contents) to specify which bone | |
is "solid" "ladder" (the main climbable portion) and which is | |
just "solid" (the "guard clips"), while also changing the clips | |
to use NODRAW, and overall merge them without requiring Propper. | |
The end result would still (given Collision Group test failures) | |
absolutely require a "env_physics_blocker" to complement it so | |
Survivors can't climb it -- so, its use is niche. | |
See "Valve Wiki Notes.txt" for more research and such niche uses. | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#### EXPLANATION.TXT #### | |
########################### | |
At minimum, a VPK is necessary for this file: | |
C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting_vpker\particles | |
insect_fx.pcf | |
29.8 KB (30,542 bytes) | |
Modifying an existing PCF is OK, it's better than modifying the | |
"particles_manifest.txt" which may interfere with a lot of mods | |
that are more likely to do that -- no one / few will have modified | |
this specific insects particle file. It's also OK because this is | |
a Valve file modified with Valve's own Particle Editor. | |
So a VPK for that will always be necessary when "loosely" testing | |
with "gameinfo.txt", but when shipped in VPK's will override the | |
PCF file that already exists inside of Valve's VPK's. | |
INSERT_ANNOYING_MODEL_COMPLICATIONS | |
This subfolder: | |
\_ANNOYING_MODEL_COMPLICATIONS | |
Has this folder and file: | |
\models | |
props_interiors 4x "ceda_easel01.mdl" | |
props_misc 3x "ceda_banner.mdl" (- phy file) | |
pak01_dir.vpk | |
Those are the same thing. The files needed to be VPK'd, because | |
same-named files already existing inside VPK's, which override | |
"loosely" placed files in "gameinfo.txt" folders. While placing | |
the model files in "left4dead2" directly did work, that's messy. | |
So overall the above files are the "final result" used for testing, | |
which produced this ANNOYING_MODEL_COMPLICATION: | |
1. Hammer still showed the additional skin I added | |
2. For the model with a phy, it's collision in the viewer | |
showed correctly, and was even a fully collidable physics | |
object in-game | |
3. However, visually, it 100% refused to display, both | |
in the Hammer model viewer and in-game... hence, fuck | |
My 1st attempt: | |
\modelsrc_buggedsoredid | |
"ceda_easel01.qc" looks 100% correct: | |
studio "ceda_easel01.smd" | |
$texturegroup "skinfamilies" | |
{ | |
{ "ceda_easel01" } | |
{ "ceda_easel01a" } | |
{ "ceda_easel01b" } | |
} | |
As does "ceda_easel01.smd": | |
triangles | |
ceda_easel01 | |
Ignore my placing the new "a" before Valve's "b", I | |
explain that more later -- first-timer mistake -- but | |
there's nothing here that is indicative of a problem. | |
IN_THEORY, here's what _COULD_ be the problem: | |
The "01" and "01b" materials are in Valve's VPK | |
The "01a" is within my CEDA Testing "gameinfo.txt" mod | |
Maybe it's flipping out from the files being in different | |
locations? Maybe the fact that the model is "disappeared" | |
simply means it cannot find the skin? | |
IF_THAT_WERE_THE_CASE, then surely my new "skin 3" would | |
have worked while Valve's skins 1-2 did not... but all 3 | |
of them failed. | |
My 2nd and 3rd attempt: | |
\models_buggedsoredid2 Compiled only, includes rail this time | |
\modelsrc_buggedsoredid2 Sources again, did rail this time | |
I created a new "hotel_stair_rail001.mdl" and a new | |
"hotel_stair_rail003.mdl" to establish a baseline that | |
the decompiler/compiler is even producing valid data | |
(I already knew it was by opening the produced SMD's | |
in Blender anyway, though)... which led me to believe | |
that I'll just remove_the_damn_skins to solve the problem. | |
Crowbar: | |
"Remove path from material file names" | |
Was temporarily unchecked (re-checked later after this | |
test concluded it made_no_difference), which to the | |
following file changes: | |
ceda_easel01.qc | |
$cdmaterials "models\props_interiors\" | |
$cdmaterials "" | |
$texturegroup "skinfamilies" | |
{ | |
{ "models\props_interiors\ceda_easel01" } | |
{ "ceda_easel01b" } | |
{ "ceda_easel01a" } | |
} | |
ceda_easel01.smd | |
triangles | |
models\props_interiors\ceda_easel01 | |
And: | |
ceda_banner.qc | |
$cdmaterials "models\props_misc\" | |
$cdmaterials "" | |
$texturegroup "skinfamilies" | |
{ | |
{ "Models\props_misc\hotel_banner" } | |
{ "mall_banner" } | |
{ "cedahq_banner" } | |
} | |
ceda_banner.smd | |
triangles | |
Models\props_misc\hotel_banner | |
Looking inside Valve's *.mdl files, the 1st skin DOES | |
have the full path -- so while "technically" this is | |
more "true" to Valve's *.mdl file... | |
IT MADE ABSOLUTELY NO DIFFERENCE AND ISSUE PERSISTS. | |
The "3rd" attempt was simply changing this: | |
$cdmaterials "" | |
To this: | |
// $cdmaterials "" | |
Since while the hell is it setting it to something, then blanking | |
that setting? Anyway, that didn't make any difference either. | |
SOLUTION | |
See: | |
\zz_cedatesting\modelsrc | |
I changed the file names in the *.qc file. | |
I changed the material names in the *.smd file. | |
Compiled. | |
They worked. | |
Can't have multiple skins, but dammit my model finally works, | |
and these resources were only help in terms of verifying that | |
I have no earthly idea what_the_fuck is wrong as the files seem | |
perfectly correct: | |
https://developer.valvesoftware.com/wiki/$texturegroup | |
https://developer.valvesoftware.com/wiki/Multiple_Skins_for_a_Single_Model | |
https://www.google.com/search?q=l4d2+model+compiled+is+invisible | |
CONCLUSION | |
Overall: problem is solved, and by compiling brand new *.mdl files | |
I am 100% lossless in terms of the "inexact science" of decompiling | |
Valve's models to begin with -- since we're not working off *.dmx | |
files provided directly from Valve, the least we can do with decompiles | |
is to NOT MODIFY THE ORIGINAL. | |
This whole problem was mostly me being insistent upon adding new skins | |
to Valve's existing model -- when the 1st time I compiled, I added my | |
new "a" skin BEFORE Valve's old "b" skin which would've messed up the | |
skin # ordering anyway... I corrected for that later, but the result | |
still didn't work, forcing me to create new model files. | |
Ultimately, for the better. | |
PHYSICS MESH | |
There's still 1 problem, here: | |
\props_urban | |
Valve's collision mesh is 100% hostile to Smoker pulls, since this | |
was only intended as a "stair railing" that touches nearby walls. | |
At first I tried to do this: | |
$collisionmodel "ceda_rail_a.smd" | |
Resulting collision mesh in Hammer wasn't bounding box, but it | |
like connected the extremes of the visible model and made a collision | |
mesh that was even WORSE than Valve's. | |
There's 2 reasons I'm going to assume that happened: | |
1. A "_physics.smd" variant really is needed, because | |
the visible *.smd file has the material, and the | |
one for physics simply says "phy" in place of materials. | |
2. Perhaps the original mesh was too complex as collision... | |
I doubt this is the case, but using the original model | |
for the collision mesh is TOO LAZY, even in this case !! | |
So, I copied the original mesh, changed the material to "phy", | |
then forced myself to learn some Blender stuff... after going | |
through the tremendous hassle of finding Version 2.7 to be | |
compatible with my version, and finding a compatible Source Tools, | |
all stuff I won't cover here: | |
How to use Modifiers in Blender 2.7 | |
https://www.youtube.com/watch?v=iqfRlyKxQ2Q | |
Blender Beginners Tutorial: Create A Cube With A Square Or Oblong Hole Through It The Easy Way | |
https://www.youtube.com/watch?v=dB4Ucmar2og | |
Move 3D Cursor to center in Blender 3D | |
https://www.youtube.com/watch?v=ZxMqIfUYb6c | |
https://www.google.com/search?q=blender+decimate | |
https://www.google.com/search?q=blender+quick+model+level+of+detail | |
OPTION #1: | |
Open Blender, right-click default cube, "x" -> Delete | |
Also... there's 2 more things to delete: | |
Camera -> "x" -> Delete | |
Lamp -> "x" -> Delete | |
File -> Import -> Source Engine: | |
C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban | |
-> ceda_rail_a_physics.smd | |
Movement: | |
Zoom in/out with mousewheel up/down | |
Pan around by depressing mousewheel as a button | |
Hold shift combined with either above to move around completely | |
"z" to show model in Wireframe, be sure to right-click | |
select it since deceptively it may not even be selected, | |
and its selection is necessary for "Modifiers" to appear | |
Expand the right panel (with all the little tabs) and | |
find the "blue wrench" that is the Modifiers panel | |
For whatever reason, an existing "Armature" modifier is | |
already there. Deleting (with the top-right x) or "Applying" | |
doesn't appear to make any difference, so just "Apply" to | |
get rid of (since adding another modifier may complain | |
about the first one) | |
Add Modifier -> Generate -> Decimate | |
Collapse -> Ratio or Planar -> Angle Limit | |
Angle Limit 56 degrees looks best, whereas with Collapse | |
some of the higher detail is lost. | |
Overall, THIS_WORKS, but the resulting geometry is still | |
a little excessive and "Decimate" cannot create "cubes" | |
out of the mesh, instead they're more triangular. | |
So I'm going to make it by hand instead. | |
OPTION #2: | |
Repeat all the above, except before adding the Modifier. | |
Shift+A -> Add -> Mesh -> Cube | |
Left-click and drag the box in place to match Valve's | |
visible original (smooth/cylindrical) railing model | |
Make sure the collision (cube) is "GENEROUSLY" inside | |
Valve's original cylindrical mesh | |
Tab to enter "Edit Mode" | |
Ctrl+Right-click all 4 vertices on one side | |
Press "7" (on NUMPAD, **not** the other one) to get a | |
top-down perspective, then zoom out | |
Then left-click drag and let-go left-click to get it to | |
both extreme ends... | |
NOTE: Previously for some reason I had to drag | |
with right-click and "set" it to final position | |
with left-click, there's some different behavior | |
going on here, maybe if staying in top-down view | |
it's less picky and works with only left-clicks. | |
NOTE: Also, I forget if it was Shift or Ctrl, but | |
probably Shift, if dragging when NOT in top-down | |
view, holding Shift will "snap" it to specific | |
angles to have better control over how it lands. | |
Ctrl+C and Ctrl+V are copy/paste (at least it keeps that | |
familiar and simple)... so copy that up to create the | |
rest of the "elongated cubes" inside of Valve's cylinders | |
Shift + right-click **THEN** Ctrl+J to select all 4 cubes | |
I've elongated then "join" them as one mesh | |
After "Join", if I press "r" to begin rotating it, it does | |
not rotate about the scene's "0 0 0" origin | |
To fix that, select the newly-joined object | |
Shift+S -> "Cursor to Center" | |
Then while in "Object Mode" (the opposite of Tab -> "Edit Mode"), | |
on the left-hand panel click "Set Origin" | |
Then "Origin to 3D Cursor" | |
Now the origin is correct !! | |
** The above YouTube video acknowledges that it's | |
annoying to move it accidentally, Shift+S = MAGIC | |
Cool Blender things to remember: | |
Numpad is amazing: | |
Rotating the view in increments is sweet, using | |
all the numpad keys, where "7" is instant top-down | |
Rotation is amazing: | |
Press "r" to rotate THEN_DO_NOT_MOVE_THE_MOUSE, | |
because that's a nightmare... instead, immediately | |
press "x", "y" or "z", where "z" is to "twist" it | |
left or right, then immediately just start typing | |
in a number for it to rotate exactly | |
Blender is like... "difficult to learn, easy to master": | |
... in a way, it's hard to learn all these keybinds | |
but productively it's better to only have keybinds | |
as options since this stuff becomes extremely fluid | |
to work with very quickly !! | |
The rest: | |
Right panel, 3rd tab, that looks like a "sun window and a mirror", | |
scroll down to "Source Engine Export". | |
Change from DMX to SMD, that makes the exporter appear to | |
care less about having an "Engine Path"... we're not doing | |
anything complex here, merely exporting face/vertex data | |
that's the same as what was Imported in the beginning. | |
Keep "Up Axis" as Z, then click "Export". | |
Gave 1 warning, but IDK what it is / how to view it, both | |
files/exports gave a warning, but 0 Errors, and resulting | |
SMD file looks A-OK !! | |
Then in the SMD file: | |
version 1 | |
nodes | |
0 "root" -1 | |
end | |
skeleton | |
time 0 | |
0 0 0 0 0 0 0 | |
end | |
triangles | |
no_material | |
0 -1.000006 32.999844 41.010731 | |
Replace "root" with "static_prop". | |
Find/Replace all "no_material" with "phy". | |
Update the QC to point to this new "_physics.smd" file. | |
Don't worry about the whitespace/tabulation... I'm sure | |
it purges them, plus given the "newline data format" of | |
this, it's clearly very strict and won't complain as long | |
as the newline / material / vertex data order is left alone. | |
Crowbar -> Compile | |
Window -> "Toggle System Console" == NOTHING_TO_WORRY_ABOUT: | |
Blender Source Tools: exporting Cube.003 | |
- Baking... | |
Smart Projection time: 0.00 | |
- C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\mod | |
elsrc\props_urban\Cube.003.smd | |
- No skeleton to export | |
WARNING: 48 faces on Cube.003 did not have a Material or Texture assigned | |
- Exported 48 polys | |
- Exported 0 materials | |
SMD Cube.003 exported in under 1 second | |
0 Errors and 1 Warnings | |
Warning: 48 faces on Cube.003 did not have a Material or Texture assigned | |
1 files exported in 0.1 seconds with 0 Errors and 1 Warnings | |
Info: 1 files exported in 0.1 seconds with 0 Errors and 1 Warnings | |
read blend: C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedat | |
esting\modelsrc\props_urban\ceda_rail_b_physics.blend | |
Blender Source Tools: exporting Cube.003 | |
- Baking... | |
Smart Projection time: 0.00 | |
- C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\mod | |
elsrc\props_urban\Cube.003.smd | |
- No skeleton to export | |
WARNING: 48 faces on Cube.003 did not have a Material or Texture assigned | |
- Exported 48 polys | |
- Exported 0 materials | |
SMD Cube.003 exported in under 1 second | |
0 Errors and 1 Warnings | |
Warning: 48 faces on Cube.003 did not have a Material or Texture assigned | |
1 files exported in 0.0 seconds with 0 Errors and 1 Warnings | |
Info: 1 files exported in 0.0 seconds with 0 Errors and 1 Warnings | |
QUICK HAMMER NOTES | |
Miscellaneous Hammer tips... because this has turned into a notes doc: | |
Carving is bad, mkay? | |
Create Cube -> "Make Hollow" -> Ungroup = instant Skybox | |
Also a better way of doing what Carve can also | |
do, but Carve would result in inconsistent wall | |
thickness... and feels very niche in usage | |
Can make ANYTHING hollow, including these: | |
https://developer.valvesoftware.com/wiki/Hammer_Torus_Properties | |
[ and ] Brackets control grid | |
Ctrl+E centers current solid in active viewport | |
ctrl+F splits faces | |
Alt+E opens face scaling | |
Vertex editing: | |
VERY_SIMILAR_TO_BLENDER once you know how it works, | |
except Hammer is easier since you can drag a box | |
around vertices to select -- whereas in Blender you | |
have to (apparently) CTRL+click each individually. | |
Yellow dots = edges, white dots = vertices | |
Click the icon (or Shift+V) to toggle between | |
modes of what is displayed (between yellow/white) | |
Drag 2 vertices on top of each other to merge them | |
https://developer.valvesoftware.com/wiki/Concave | |
"If a brush is convex, then any imaginary | |
line you could draw from one vertex to another | |
will never be outside the brush. Therefore, | |
if such a line can be drawn, the brush is concave." | |
Spacebar + LMB = the KEY to efficiently looking around, | |
even in the fixed-perspective viewports | |
Hammer -- my adventure (and notes) regarding (99% non-critical) grid misalignment: | |
X/Y (top-down) view alignment jiggle tests | |
-- jiggle the X/Y first THEN the Z which is likely also unaligned | |
THE FOLLOWING STUFF NEEDS TO BE MANUALLY RE-ALIGNED | |
OR SERVE AS GENERAL NOTES FOR THE FUTURE | |
jockey easel (prop_physics, i merely pasted it in then rotated it) | |
all light-related rotating door | |
env_soundscapes at rotating door area are misaligned only on Z | |
the triggers for the sliding glass doors also Z misaligned | |
ALL sliding door brushes and glass (as copied from Dead Air 4) | |
are misaligned on ONLY Z and need fixing | |
rotating door func_detail "glass/wall front" misaligned very | |
slightly on Z -- no idea how that happened | |
rotating door area entirely: | |
all the brushes are OK on X/Y, but slightly misaligned | |
on Z... by vertices, where jiggling will NOT fix it, | |
this was an early construction oversight and likely | |
a copy/pasted brush that are already problematic to begin with | |
^^ re-seat the entire area with +500 X shifts or something | |
all fred/etc props at rotating door, but brushwork all aligned | |
also ignore ragdolls as they are all aligned | |
ignore decals/overlays all good | |
use ctrl+e in 3d view to rapidly jump to entity in top-down view | |
selecting brushes and entities at once and moving them prioritizes | |
keeping brush to grid so thats how props get unaligned | |
info_particle_systems do not get unaligned but light/beam do | |
of course cautious that when using carve it carves stuff that is | |
hidden from view due to quickhide or visgroups so move it | |
away at a fixed +1000 X or something | |
jiggle central env_cubemap it got misaligned | |
if you place an entity and then rotate it there is a medium chance | |
it may misalign to grid -- BUT if you PASTE in an entity | |
it should be assumed that it is not aligned | |
plant and long blue chairs misaligned Z only | |
charger area: | |
left monitor only | |
back chair BUT NOT DESK | |
breakwall DOOR portal is thinner than 1 unit | |
breakwall both trashbins are unaligned | |
breakwall table also unaligned | |
outside both phones AND monitor unaligned (rotation on Z or something | |
messed up the monitor) ++ chair there also unaligned | |
all geometry is generally OK even if copy/pasted from another map or | |
area the exception is ROTATED GEOMETRY which should always | |
instead be used as a "stencil" to manually vertex edit it later | |
DELIBERATELY MISALIGNED: | |
handrail in corner beside Boomer room, needs to be in order | |
to link up with other handrails, but its only 1 prop_static | |
... it's OK'er to do this with POINT entities because they | |
will always maintain their positions to floating-point accuracy | |
unlike brushes: | |
https://developer.valvesoftware.com/wiki/Reshaping_Solids#Decimal_Loss_after_Reload | |
https://github.com/crashfort/HammerPatch | |
"In default Hammer, unless your geometry is of perfectly straight | |
angles, the vertices will move every time you open the map. This | |
is because the vertices' positions are recalculated every time | |
from plane points. This is a lossy process and will only get worse | |
every time the map is loaded. In HammerPatch, all vertices are | |
saved separately and are restored on load to overwrite Hammer's | |
estimations." | |
^^ basically: tolerate Hammer's "estimations" but brushes should | |
be on grid to prevent its estimations from being inaccurate | |
^^ just the VERTICES need to be on grid, not necessarily edges, | |
but if building more brushes along that edge there may be issues, | |
in that maybe export with Propper to create point entities instead | |
both smoker bed metal brushes are unaligned | |
even if geometry isnt 100% symmetry that's not something Valve's | |
planes / vertex focused system cares about, that's just a things | |
humans care about, and that needs to be disregarded when we are | |
talking about less than 1 unit worth of asymmetry no one can notice | |
DELIBERATELY MISALIGNED: | |
wound model inside of smoker, again this is a POINT entity | |
smoker biohazard infodecal misaligned only on Z | |
smoker particle systems misaligned only on Z all 3 | |
smoker beveled xray board misaligned only on Z and only jiggling it at the | |
top will force align it (not the bottom where the bevel is) | |
smoker xray board texture toggle above is misaligned only on Z | |
smoker vent wall decal is unaligned, b/c I added it through the decal placer | |
and it places it onto the wall like that -- a point entity, so not | |
a big deal, but still annoying it did that, and yes the wall itself | |
is in fact aligned so not my fault, the outlet decal is OK though | |
NOTE: | |
the outline for point entities is the prop/model's bounds, just | |
because the bounding box is off-grid, as long as it "snaps" when | |
jiggled then that means it's on-grid | |
xray board light spot is unaligned | |
boomer only the far whiteboard overlay misaligned only on Z | |
boomer room all window brushes misaligned on Z and were floating above ground | |
by just 1 unit each | |
boomer breakwall ALL ENTITIES (except the portal) misaligned on Z only | |
boomer security camera misaligned on Z only | |
boomer door is off Z axis (while the bottom of the door is flush with the | |
floor geometry, re-aligning it has the model's wireframe hover | |
negligibly above the floor, not even an entire unit, which is normal) | |
boomer all roadside fence models and most rock debris are misaligned Z only | |
boomer door glass is unaligned: | |
good experimental test case since any rotated doors in Valve's | |
maps would also be guilty of this... and modifying a thin | |
piece of glass like that to be symmetrical seems difficult | |
DELIBERATELY MISALIGNED... but it's just a couple corner Z vertices: | |
the orange beveled ledges do not align with grid on Z axis | |
but this would mean Valve is guilty of that too BUT it's | |
not the type of misalignment that would cause issues and | |
fixing it haphazardly would likely create new issues | |
... it's not a rotated or angled brush, and Source Engine can | |
generate a clean "plane" across it, so while it's not 100% | |
correct, knowing that it's acceptably incorrect makes the diff | |
NOTE: | |
powers of 1: aligning vertices by 1-units is ok | |
powers of 2: brushes should STRIVE to be 2/4/8/64/128 units long | |
rare exceptions are OK as long as geometry doesn't tear | |
geometric tearing was previously observed by stupidly resizing | |
a brush that was rotated (rather than adjusting its vertices), | |
that specific spot caused a dark anomalous shadow and the angled | |
wall needed to be re-created twice, last time vertex by vertex | |
brush too long on Z: | |
middle yellow walls, facing smoker/boomer side of map, left and | |
right side, decrease height of both those walls, texture will | |
remain unchanged -- repeat the same for yellow wall behind the | |
reception desk | |
boomer easel misaligned on Z only | |
boomer room all 3 lights misaligned on X/Y some Z only | |
boomer brush table is misaligned on Z | |
boomer room body overlay misaligned on Z | |
all boomer room chairs need jiggling on X/Y/Z... and most tables but do all | |
central courtyard placeholder and func_illusionary rotated references | |
^^ note that while my main room brushes are exactly aligned to grid, | |
the reference func_illusionary built around it for some reason isn't | |
so even THAT is unaligned as are all the rotated references | |
^^ overall 99% of my problems (if the func_illusionary/reference brushes | |
are disregarded entirely) are point-based entities, so overall my problems | |
are not as bad as hypothetically feared | |
floor brushes should be aligned with wall brushes... keep wall brushes | |
the desired visible height for material editing to make sense, but floors | |
can extend underneath the walls provided it makes a tightly sealed box | |
finally: | |
create a "Verified" visgroup, all entities up to that point have been verified | |
as being aligned to grid (or OK that they're not / deliberate) and so future | |
working conditions can eliminate visibility of past work completed | |
That's all. | |
###################################################################### | |
###################################################################### | |
###################################################################### | |
###################################################################### | |
A "2-DIMENSIONAL MY ASS" NIGHTMARE | |
================================== | |
Random other confusions: | |
Physics SMD's are supposed to be simpler -- but their file | |
sizes are less than the visible model SMD? Wtf? | |
Valve employees must have used / and \ so interchangeably | |
that the compiler does not care -- but damn, other areas | |
in-game and with VScript sure do OVER-care. | |
Most of the following pertains to items in this folder: | |
\_ANNOYING_MODEL_COMPLICATIONS\props_urban | |
Final bullshit: | |
Crowbar's "studiomdl.exe" output complains about my model: | |
SMD MODEL ceda_rail_a_physics.smd | |
Processing LOD for material: hotel_stair002 | |
WARNING: Model has 2-dimensional geometry (less than 0.500 inches thick on any axis)!!! | |
<< exactly 24 lines of that >> | |
WARNING: COSTLY COLLISION MODEL!!!! (24 parts - 3 allowed) | |
WARNING: Error with convex elements of ceda_rail_a_physics.smd, building single convex!!!! | |
Model has 1 convex sub-parts | |
Collision model completed. | |
The resulting collision mesh in Hammer's model browser is then | |
broken -- it's the "single shape" around the whole thing that | |
isn't a bounding box but is just as bad as one. | |
My QC files contain this: | |
$collisionmodel "ceda_rail_a_physics.smd" | |
{ | |
$mass 28.96061 | |
$inertia 1 | |
$damping 0 | |
$rotdamping 0 | |
$rootbone " " | |
$concave | |
$maxconvexpieces 3 | |
} | |
And both say "24 parts - 3 allowed", so changing this to 24 | |
should_in_theory resolve my problem: | |
https://www.google.com/search?q=WARNING%3A+Model+has+2-dimensional+geometry+(less+than+0.500+inches+thick+on+any+axis)!!! | |
https://www.google.com/search?q=WARNING%3A+Error+with+convex+elements+of+ceda_rail_a_physics.smd%2C+building+single+convex!!!! | |
https://www.google.com/search?q=WARNING%3A+COSTLY+COLLISION+MODEL!!!!+(24+parts+-+3+allowed) | |
https://web.archive.org/web/20110420082232/http://forums.steampowered.com/forums/showthread.php?t=964995&highlight=WARNING%3A+Model+2-dimensional+geometry | |
"Note: Make sure your polygons are all in the same smoothing group." | |
https://developer.valvesoftware.com/w/index.php?title=$maxconvexpieces&redirect=no | |
https://developer.valvesoftware.com/wiki/$collisionmodel | |
"Set the Console Variable vcollide_wireframe 1 to view collision meshes in-game." | |
https://developer.valvesoftware.com/wiki/Compiling_a_model | |
https://developer.valvesoftware.com/wiki/Costly_collision_model | |
A "costly collision model" has over 20 "convex pieces". Had I | |
instead used the Modifier approach, my geometry would've been | |
a LOT more complex. The fact I "optimized cubes" by having the | |
vertical one bisect the 3 horizontal ones may be causing this | |
smoothing group / 2-dimensional geometry issue, but I'm going | |
to ignore that for now. | |
This railing is in fact a COSTLY collision model... there's quite | |
a lot going on for it when typical collision models are merely | |
boxes. Source / L4D2 are optimized, surely the Atlas Ball has a | |
very complex collision model... curiously, though: | |
$collisionmodel "atlas_physics.smd" | |
{ | |
$mass 1000 | |
$inertia 1 | |
$damping 0 | |
$rotdamping 0 | |
$rootbone " " | |
$concave | |
$maxconvexpieces 8 | |
} | |
So I'm going to bite my tongue and change my limit to 24 for now. | |
Brute-forcing one error doesn't make the other go away: | |
This: | |
WARNING: Model has 2-dimensional geometry (less than 0.500 inches thick on any axis)!!! | |
WARNING: Error with convex elements of ceda_rail_a_physics.smd, building single convex!!!! | |
Model has 1 convex sub-parts | |
Persists, and is game-breaking enough to break the whole deal. | |
Starting from the beginning: | |
Modifier -> Decimate -> Planar -> 24 angle (for both) | |
That still isn't considerate of the collision/geometry INSIDE of | |
the railing -- which I definitely do not want, and will likely | |
cause further compiler complaints anyway. | |
This: | |
Tab -> Edit Mode -> Add -> "Extrude Region" | |
Is the "legit way" to get 1 entire cohesive mesh, starting from | |
just 1 cube, instead of having 3 elongated cubes with 1 long vertical | |
cube bisecting them all. | |
So, I did apply the "Decimate -> 24 angle", but won't export it | |
as SMD... because I'll just create a proper mesh this time, | |
using my original piece of shit for reference to get the sizing | |
exactly right... since it WAS perfect, except because Valve... | |
Blender Notes: | |
While in Tab (Edit Mode), Ctrl+Tab allows selection between | |
Vertices, Edges, or Faces -- Faces is MUCH MORE USEFUL for extrusions | |
Ctrl+LMB is needed to select multiple Verts/Edges/Faces | |
Shift+LMB is needed to select multiple objects i.e. cubes | |
"p" can be used to re-separate objects after a Ctrl+J joining | |
Hold Ctrl to "snap to" (unknown grid increments) to at least keep | |
all extrusions at the same length, **THEN** later on can zoom-in | |
all the way, with all those vertices selected, to align them with | |
my previous "4 elongated cube collision model" mesh exactly | |
When Blender selects TOO MANY faces at once: | |
Is there an easier way to select multiple faces? | |
https://steamcommunity.com/app/365670/discussions/0/1483235412211197953/ | |
"a" will, as long as it's not in "c" (Circle Select) mode, will | |
de-select any faces that are selected | |
When using Ctrl+RMB, extra undesirable faces are selected, which | |
can be avoided in 2 ways: | |
1. Use Shift+RMB instead | |
2. Press "c" then LMB the faces (no Ctrl/Shift needed to | |
maintain the selection), then RMB to exit | |
Then extrude non-annoyingly only the exact desired faces. | |
Result: | |
Me after all this shit: | |
Jesse lovingly crafting his wooden box in that daydream (Breaking Bad) | |
https://www.youtube.com/watch?v=-8T0RakfupU | |
Both physics / collision models still complain, 26 lines instead of 24 now: | |
WARNING: Model has 2-dimensional geometry (less than 0.500 inches thick on any axis)!!! | |
WARNING: COSTLY COLLISION MODEL!!!! (26 parts - 3 allowed) | |
WARNING: Error with convex elements of ceda_rail_a_physics.smd, building single convex!!!! | |
Model has 1 convex sub-parts | |
Remember I can avoid the cap I just reverted it to 3. Now I've permanently | |
set it to 30 since messing around with an arbitrary "safety limit" when | |
getting close to it is going to be required is now a waste of my time. | |
The only remotely practical way to detail all the difficulties experienced | |
is to describe all the files in the hellish folder: | |
\_ANNOYING_MODEL_COMPLICATIONS\props_urban | |
\ceda_rail_a.qc | |
\ceda_rail_a.smd | |
\ceda_rail_a_anims\ref.smd | |
\ceda_rail_a_physics -- Blender Source Tools Export Cube.003.smd | |
\ceda_rail_a_physics -- Blender Source Tools Export EXTRUDE REMAKE Cube.000.smd | |
\ceda_rail_a_physics -- Blender Source Tools Import Original.smd | |
\ceda_rail_a_physics -- SIMPLER GEO BUT SOURCE COLLISION HATES INTERSECTIONS.smd | |
\ceda_rail_a_physics -- Step 0 -- Immediate Export Changing Nothing.smd | |
\ceda_rail_a_physics -- Step A -- Thinned the sides.smd | |
\ceda_rail_a_physics -- STILL FREAKING COMPLAINS IT'S 2-DIMENSIONAL !!!!.smd | |
\ceda_rail_a_physics.blend | |
\ceda_rail_a_physics.blend1 | |
\ceda_rail_a_physics.smd | |
\ceda_rail_a_physics_EXTRUDE_REMAKE.blend | |
\ceda_rail_a_physics_EXTRUDE_REMAKE.blend1 | |
\ceda_rail_a_physics_modifier -- Pre-Decimate.blend | |
\ceda_rail_a_physics_modifier.blend | |
\ceda_rail_a_physics_modifier.blend1 | |
\ceda_rail_b.qc | |
\ceda_rail_b.smd | |
\ceda_rail_b_anims\ref.smd | |
\ceda_rail_b_physics -- Blender Source Tools Export Cube.003.smd | |
\ceda_rail_b_physics -- Blender Source Tools Export EXTRUDE REMAKE Cube.004.smd | |
\ceda_rail_b_physics -- Blender Source Tools Import Original.smd | |
\ceda_rail_b_physics -- SIMPLER GEO BUT SOURCE COLLISION HATES INTERSECTIONS.smd | |
\ceda_rail_b_physics -- Step 0 -- Immediate Export Changing Nothing.smd | |
\ceda_rail_b_physics -- Step A -- Thinned the sides.smd | |
\ceda_rail_b_physics -- STILL FREAKING COMPLAINS IT'S 2-DIMENSIONAL !!!!.smd | |
\ceda_rail_b_physics.blend | |
\ceda_rail_b_physics.blend1 | |
\ceda_rail_b_physics.smd | |
\ceda_rail_b_physics_EXTRUDE_REMAKE.blend | |
\ceda_rail_b_physics_EXTRUDE_REMAKE.blend1 | |
\ceda_rail_b_physics_modifier -- Pre-Decimate.blend | |
\ceda_rail_b_physics_modifier.blend | |
\ceda_rail_b_physics_modifier.blend1 | |
\hotel_stair_rail001.dx90.vtx | |
\hotel_stair_rail001.mdl | |
\hotel_stair_rail001.phy | |
\hotel_stair_rail001.vvd | |
\hotel_stair_rail001_physics -- Original GCFScape Extract then Crowbar Decompile.smd | |
\hotel_stair_rail001_physics -- Step 0 -- Immediate Export Changing Nothing.blend | |
\hotel_stair_rail001_physics -- Step A -- Thinned the sides.blend | |
\hotel_stair_rail001_physics -- Step A -- Thinned the sides.blend1 | |
\hotel_stair_rail001_physics -- Step B -- Copied upwards twice.blend | |
\hotel_stair_rail001_physics -- Step B -- Copied upwards twice.blend1 | |
\hotel_stair_rail001_physics -- Step C -- Redo everything because shift drag screwed me.blend | |
\hotel_stair_rail001_physics -- Step C -- Redo everything because shift drag screwed me.blend1 | |
\hotel_stair_rail003.dx90.vtx | |
\hotel_stair_rail003.mdl | |
\hotel_stair_rail003.phy | |
\hotel_stair_rail003.vvd | |
\hotel_stair_rail003_physics -- Original GCFScape Extract then Crowbar Decompile.smd | |
\hotel_stair_rail003_physics -- Step 0 -- Immediate Export Changing Nothing.blend | |
\hotel_stair_rail003_physics -- Step A -- Thinned the sides.blend | |
\hotel_stair_rail003_physics -- Step A -- Thinned the sides.blend1 | |
\hotel_stair_rail003_physics -- Step B -- Copied upwards twice.blend | |
\hotel_stair_rail003_physics -- Step B -- Copied upwards twice.blend1 | |
\hotel_stair_rail003_physics -- Step C -- Redo everything because shift drag screwed me.blend | |
\hotel_stair_rail003_physics -- Step C -- Redo everything because shift drag screwed me.blend1 | |
\models\props_urban\ceda_rail_a.dx90.vtx | |
\models\props_urban\ceda_rail_a.mdl | |
\models\props_urban\ceda_rail_a.phy | |
\models\props_urban\ceda_rail_a.vvd | |
\models\props_urban\ceda_rail_b.dx90.vtx | |
\models\props_urban\ceda_rail_b.mdl | |
\models\props_urban\ceda_rail_b.phy | |
\models\props_urban\ceda_rail_b.vvd | |
Conclusions: | |
Valve's original had 3 convex pieces. | |
Mine has 6? | |
"WARNING: COSTLY COLLISION MODEL!!!! (6 parts - 3 allowed)" | |
But I copy/pasted Valve's model 3 times... I'm not following on | |
internal mechanics of the MDL (or PHY? this was all over a collision | |
model, not even a real model, hopefully real models are easier), | |
fundamentally, in some way, to fail to understand why it's not 3*3. | |
"smd_bone_vis" isn't exported by the plugin -- just the SMD... so, | |
it's not like Source "studiomdl.exe" was "confused" and didn't see | |
a bone for the physics model -- I still have no earthly idea why | |
my first attempt was refused, and why it was so much extra convex, | |
where that was 24 and my final here is 6. | |
All Internet resources say, "oh maybe you have a random bit of geometry | |
somewhere" -- no, I absolutely do not. I have no idea what caused | |
the "2-dimensionality" of it, AND_IT_DEFINITELY_WAS_NOT_INTERSECTING_SOLIDS | |
like I originally thought (my only thought as to how 1st try didn't work). | |
Blender is one huge GameShark code, like this process was to copy/paste | |
each one upwards exactly 14 units... a bit of a spatially complex task | |
that could be completed in mere seconds: | |
ctrl c v | |
then g (translate) | |
z (lock to z axis) | |
14 (move up 14) | |
enter (commit) | |
shift+RMB select all 3 | |
ctrl+j join | |
"Active" object? Yeah I tried a lot of that, none of it worked: | |
https://blender.stackexchange.com/questions/21047/which-object-should-be-selected-when-selected-to-active-is-check-for-texture-bak/21050#21050 | |
https://blender.stackexchange.com/questions/39784/snapping-two-objects-by-edge-in-object-mode | |
Active/Closest/Median/Center... still idk wtf: | |
https://blender.stackexchange.com/questions/110274/i-dont-understand-the-options-under-which-part-to-snap-onto-the-target | |
The process for "snapping" a vertex/edge/face to another part of | |
the model is OVERWHELMINGLY_CONVOLUTED, I'd hope it has improved | |
since Blender 2.7 which I'm forced to use here right now: | |
https://blender.stackexchange.com/questions/73177/snap-two-objects-face-to-face-in-object-mode | |
https://blender.stackexchange.com/questions/165654/how-can-i-align-two-faces-in-edit-mode | |
Copy/paste of the process: | |
Select the object you want to snap it to the other object | |
switch to edit mode | |
switch to face selection | |
Select the face you want it to be the one touching the other object | |
Hit Shift+S | |
choose Cursor to selected | |
Hit Ctrl + Alt + Shift + C and choose Origin to 3D Cursor | |
switch to object mode | |
Select the object you want to snap another object to it | |
Enter to edit mode | |
Switch to Face Selection | |
Select the face you want to snap the other object to | |
Hit Shift+S | |
choose Cursor to selected | |
switch to object mode | |
Select the object you want to snap it to the other object | |
Hit Shift+S and choose selected to cursor | |
That's it | |
you need to set the origin of the snapped object back to normal using Ctrl + Alt + Shift + C and choose Origin to Geometry | |
Which DOES_NOT_EVEN_HELP, so I just ended up using the "Red Magnet" | |
and Shift+RMB drag (with LMB to commit after moving), while holding | |
down Ctrl if "Red Magnet" isn't active. The above "exploits" the | |
3D Cursor by moving it to exact coordinates. | |
CAUTION: | |
"right click drag then left click to commit if dragging | |
w/o gizmo... but hold ctrl to not move undesirably b/c | |
that made me redo everything (or make sure the magnet | |
is colored red meaning its active to avoid needing ctrl)" | |
The bone is irrelevant since it's not even exported: | |
smd_bone_vis is a mesh instead of a bone | |
https://steamcommunity.com/groups/BlenderSourceTools/discussions/0/1638668751261536191/ | |
https://steamcommunity.com/groups/BlenderSourceTools | |
https://steamcommunity.com/id/artfunkel | |
Everyone finds snapping leaves much to be desired: | |
https://docs.blender.org/manual/es/2.79/editors/3dview/object/editing/transform/control/snap.html | |
https://blender.community/c/rightclickselect/F5cbbc/?sorting=hot | |
Source could JUST SAY "1 unit" instead of "1 inch", where 12 inches | |
equals 1 foot: | |
https://developer.valvesoftware.com/wiki/Dimensions | |
No help for "2-dimensional" problems: | |
https://developer.valvesoftware.com/wiki/Collision_mesh | |
https://www.mapcore.org/topic/24071-warning-model-has-2-dimensional-geometry/ | |
https://www.google.com/search?q=%22Model+has+2-dimensional+geometry%22+%2B+blender | |
My 1st mesh was very simple -- except for the 24 convex vs. only 6 now. | |
But at least I'm not this guy -- who can only respond by REDOING the mesh: | |
"WARNING: COSTLY COLLISION MODEL!!!! (9611 parts - 40 allowed)" | |
... and remember, Atlas is ONLY 8 convex pieces, and that's the | |
entire model, not just the Ball. | |
FINAL COMPILE LOG -- HOLY SHIT TBH (NO ERRORS) | |
Compiling with Crowbar 0.71: "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban" (folder + subfolders) ... | |
Compiling "ceda_rail_a.qc" ... | |
Output from compiler "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\studiomdl.exe": | |
Using shader api: shaderapiempty.dll | |
qdir: "c:\program files (x86)\steam\steamapps\common\left 4 dead 2\zz_cedatesting\modelsrc\props_urban\" | |
gamedir: "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\" | |
g_path: "ceda_rail_a.qc" | |
Building binary model files... | |
Working on "ceda_rail_a.qc" | |
SMD MODEL ceda_rail_a.smd | |
SMD MODEL ceda_rail_a_anims\ref.smd | |
SMD MODEL ceda_rail_a_physics.smd | |
Processing LOD for material: hotel_stair002 | |
Model has 6 convex sub-parts | |
Collision model completed. | |
--------------------- | |
writing C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_a.mdl: | |
bones 964 bytes (1) | |
animation x y ips angle | |
animations 112 bytes (1 anims) (1 frames) [0:00] | |
sequences 220 bytes (1 seq) | |
ik/pose 164 bytes | |
eyeballs 0 bytes (0 eyeballs) | |
flexes 0 bytes (0 flexes) | |
textures 72 bytes | |
keyvalues 0 bytes | |
bone transforms 0 bytes | |
Collision model volume 2214.38 in^3 | |
Please check if you need to delete C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_a.phz | |
collision 0 bytes | |
total 1724 | |
--------------------- | |
writing C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_a.vvd: | |
vertices 18864 bytes (393 vertices) | |
tangents 6288 bytes (393 vertices) | |
total 25216 bytes | |
--------------------- | |
Generating optimized mesh "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_a.dx90.vtx": | |
body parts: 8 bytes | |
models: 20 bytes | |
model LODs: 12 bytes | |
meshes: 9 bytes | |
strip groups: 25 bytes | |
strips: 27 bytes | |
verts: 3537 bytes | |
indices: 2268 bytes | |
bone changes: 16 bytes | |
everything: 5946 bytes | |
Completed "ceda_rail_a.qc" | |
CDynamicFunction: Loading library 'Kernel32.dll' (75F20000) | |
CDynamicFunction: Lookup of 'TryEnterCriticalSection' in 'Kernel32.dll': 771E25D0 | |
CDynamicFunction: Loading library 'psapi.dll' (756C0000) | |
CDynamicFunction: Lookup of 'GetProcessMemoryInfo' in 'psapi.dll': 756C155C | |
CDynamicFunction: Closing library 'psapi.dll' (756C0000) | |
CDynamicFunction: Closing library 'Kernel32.dll' (75F20000) | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_a.dx90.vtx" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_a.mdl" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_a.phy" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_a.vvd" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Deleted empty temporary compile folder "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban". | |
... Compiling "ceda_rail_a.qc" finished. Check above for any errors. | |
Compiling "ceda_rail_b.qc" ... | |
Output from compiler "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\studiomdl.exe": | |
Using shader api: shaderapiempty.dll | |
qdir: "c:\program files (x86)\steam\steamapps\common\left 4 dead 2\zz_cedatesting\modelsrc\props_urban\" | |
gamedir: "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\" | |
g_path: "ceda_rail_b.qc" | |
Building binary model files... | |
Working on "ceda_rail_b.qc" | |
SMD MODEL ceda_rail_b.smd | |
SMD MODEL ceda_rail_b_anims\ref.smd | |
SMD MODEL ceda_rail_b_physics.smd | |
Processing LOD for material: hotel_stair002 | |
Model has 6 convex sub-parts | |
Collision model completed. | |
--------------------- | |
writing C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_b.mdl: | |
bones 964 bytes (1) | |
animation x y ips angle | |
animations 112 bytes (1 anims) (1 frames) [0:00] | |
sequences 220 bytes (1 seq) | |
ik/pose 164 bytes | |
eyeballs 0 bytes (0 eyeballs) | |
flexes 0 bytes (0 flexes) | |
textures 72 bytes | |
keyvalues 0 bytes | |
bone transforms 0 bytes | |
Collision model volume 549.38 in^3 | |
Please check if you need to delete C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_b.phz | |
collision 0 bytes | |
total 1724 | |
--------------------- | |
writing C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_b.vvd: | |
vertices 18864 bytes (393 vertices) | |
tangents 6288 bytes (393 vertices) | |
total 25216 bytes | |
--------------------- | |
Generating optimized mesh "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models/props_urban/ceda_rail_b.dx90.vtx": | |
body parts: 8 bytes | |
models: 20 bytes | |
model LODs: 12 bytes | |
meshes: 9 bytes | |
strip groups: 25 bytes | |
strips: 27 bytes | |
verts: 3537 bytes | |
indices: 2520 bytes | |
bone changes: 16 bytes | |
everything: 6198 bytes | |
Completed "ceda_rail_b.qc" | |
CDynamicFunction: Loading library 'Kernel32.dll' (75F20000) | |
CDynamicFunction: Lookup of 'TryEnterCriticalSection' in 'Kernel32.dll': 771E25D0 | |
CDynamicFunction: Loading library 'psapi.dll' (756C0000) | |
CDynamicFunction: Lookup of 'GetProcessMemoryInfo' in 'psapi.dll': 756C155C | |
CDynamicFunction: Closing library 'psapi.dll' (756C0000) | |
CDynamicFunction: Closing library 'Kernel32.dll' (75F20000) | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_b.dx90.vtx" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_b.mdl" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_b.phy" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Moved compiled model file "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban\ceda_rail_b.vvd" to "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban\models\props_urban" | |
CROWBAR: Deleted empty temporary compile folder "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\models\props_urban". | |
... Compiling "ceda_rail_b.qc" finished. Check above for any errors. | |
... Compiling with Crowbar 0.71: "C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\zz_cedatesting\modelsrc\props_urban" (folder + subfolders) finished. | |
OVERALL: FUCK. But I'm done. And learned too much, and too little. | |
###################################################################### | |
###################################################################### | |
###################################################################### | |
###################################################################### | |
THE SEQUEL :: BOOMER_CHAIR | |
========================== | |
Wasted a good hour of my life trialing so many things for something | |
that should be so trivial... and was, when you know how... | |
I simply want this chair model (either, both exact same results): | |
models/props_interiors/chair_cafeteria_atrium.mdl | |
models/props_interiors/chair_cafeteria.mdl | |
To start resting on top of the table. With nothing unusual and just | |
like the other chairs in this area, the chair immediately "falls" | |
through the table -- for no apparent reason, yet | |
The easiest solution: | |
Flag the chair as Start Asleep | |
Flawless solution... except for the glaring issue that if | |
the table is scratched out from under it, without scratching | |
the chair, the chair will persist floating | |
NOTE: "Start Asleep" as an entity flag 100% works and it | |
does as it is told, **HOWEVER** once actually fully spawned | |
it's permanently (and aggressively) a client-side entity | |
that cannot accept a "Wake" input thereafter -- the chair | |
model is low-level (compiled?) forced to be this way | |
The brute-force solution that is the ONLY THING that works: | |
Place a INVISIBLE_METAL **world** brush underneath the chair | |
and 100% force the table to be stationary... like by putting | |
a dead Tank ragdoll over it "weighing" it down... the chair | |
could still be hit off, though | |
It's also possible that it needs to be thick (i.e. not 1 unit) | |
The func_brush with INVISIBLE_METAL material that's Killed: | |
INVISIBLE_METAL only works if it is a **world** brush... the | |
attempt was to Kill "boomer_chair_debrisfix" (this brush name) | |
"OnAwakened" of the table | |
The env_physexplosion solution: | |
Doesn't work. The idea was to, "OnAwakened" for the table once | |
it is hit (with it set to Start Asleep too), to "Explode" the | |
entity -- the problems are (1) "OnAwakened" actually happens | |
immediately on map load as it settles into the world, maybe it | |
is a L4D2 thing, it seems inconsistent with in-editor writings, | |
and (2) the env_physexplosion only affects server-side entities | |
The idea here was that the env_physexplosion would apply its | |
explosive force to "Wake" client-side physics objects, without | |
being able to actually input "Wake" to them... this did not work | |
The func_clip_vphysics solution: | |
Added a "boomer_chair_debrisfix_filter" that filters the chair | |
model and a NODRAW-textured (copying Dead Center 2's setup) | |
clip that... didn't work, it only works for server-side entities | |
The prop_physics_override solution: | |
Again, not a solution, like everything else. The chair simply | |
did not appear at all | |
The prop_physics_multiplayer solution: | |
Has options to "Auto Detect" (Client-side non-solid), but also | |
has options to "allegedly force" it to be "Server-side non-solid" | |
and "Server-side solid" -- if either option is used, again the | |
chair model will refuse to spawn/exist | |
It MUST be "Auto Detect" to work -- explicitly stating any of | |
the others will NOT work... wtf even? | |
Conclusion: Going the full extent of introducing a Tank ragdoll THIS EARLY | |
on goes against logic, that should be saved for a high-impact moment... | |
akin to the Sacrifice 1 boxcar Tank... so the table and chair need to remain | |
interactable, the only (sane) option is to keep the entities named to underscore | |
my disappointment with this, but start the chair as "Start Asleep" spawnflags | |
hoping a better solution comes along. | |
FINALLY: | |
Start Asleep + Debris + Force server-side (Multiplayer only) | |
That last flag is available on both normal and _multiplayer prop_physics, | |
but I suspected all along that "Debris" (I need to be able to walk through | |
the chair like all the others) and I also need it to be server-side, | |
so I had assumed that "Debris" would "nullify" the "Force server-side" | |
Turns out you can have both at the same time | |
This still doesn't solve the problem that "OnAwakened" fires immediately, | |
but getting warmer finally | |
Final solution: | |
If the table was "Start Asleep" but the chair was not, when the chair | |
touched the table the chair got Slept which meant when the table was | |
scratched the chair persisted floating ("ent_fire boomer_chair wake" | |
did successfully drop it, at least) | |
Luckily, no "OnAwakened" I/O was needed (given it is unreliable as | |
seen earlier), because of this setup: | |
Chair = Debris + Force server-side (DO NOT Start Asleep) | |
prop_physics_multiplayer with "Auto Detect", did | |
not try an ordinary prop_physics | |
Table = Generate output on +USE... the default... that's it | |
Result: Because the chair is server-side it will now collide with | |
the table, and fall from 1 unit above the table down onto it, then | |
finally when the table is scratched the chair will fall | |
Holy shit. | |
It's amazing how difficult model compiler flags can make things when this | |
kind of stuff really shouldn't be forcefully embedded into the model file at all. | |
Or at least have prop_physics_override/prop_physics_multiplayer override it. | |
###################################################################### | |
###################################################################### | |
###################################################################### | |
###################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#### QUICKNOTES.TXT #### | |
########################## | |
ceda_courtyard_frame | |
-------------------- | |
see my notes in Discord chat for the full depth of reasoning behind this process, i.e. | |
that this cannot be done with Propper since Hammer's grid is less precise, the whole | |
point of using blender is keeping what I see to greater precision since studiomodels | |
are based purely off vertex data whereas hammer brushes are based off lossy planes, | |
and even Hammer's arch (198 angle / 5 side) tool creates primitives that are off-grid, | |
and "Snap Selected to Grid (Individually)" after selecting all vertices in edit mode | |
does not work with l4d2's hammer and disconnect vertices, and even if the extreme ends | |
of the pentagon's edges were on-grid, that doesn't help balconies etc. that must be | |
placed along the edge, which is where blender / 3d packages come in to "snap along face", | |
and the overall vmf/bsp lossy quality of off-grid vertices with hammer -- so where | |
propper comes in to save on world geometry costs, blender comes in to prevent mass off-grid, | |
while my 45-degree rotated door has an off-grid func_breakable glass, small exceptions | |
that are few and far between are acceptable, but NOT an entire courtyard map centerpiece... | |
oh and having the starting lobby room not at the map's 0 0 0 origin is OK because even if | |
I wanted the courtyard to be the map's exact center it is impossible to know the exact | |
center of a pentagon (it can only be approximated), but crafty's exported obj file will | |
still represent all the geometry as it extends outward from the model's own 0 0 0 origin, | |
the only real downside/challenge anticipated is the very complex collision for these models | |
steps | |
----- | |
open loading screen reference and copy out just brush geometry (excluding windows) | |
open ceda_testing_vs, ensure the non-rotated reference is exactly aligned, then copy both inner and outer | |
create new "ceda_courtyard_frame.vmf" | |
paste the inner/outer reference brushes in exactly preserving distance from map origin | |
paste in the loading screen reference, except far away from the reference geometry as it'll be moved later | |
save vmf and compile "ceda_courtyard_frame.bsp", keep them transparent textured so both boxes remain post-compile | |
crafty open the vmf then also bsp and export both as obj, "ceda_courtyard_frame_vmf.obj" / _bsp.obj | |
import both into blender and compare them most likely 100% identical since everything in hammer was on-grid | |
imported obj file has wrong up axis, to fix simply rotate it (about the origin that it thankfully preserved): | |
r > x > -90 > enter | |
increase draw distance aka "clipping plane" with n > start/end change end to 10000 | |
blender scenes > metric > scale change to like 10 or 100 to get much smaller grid segments than hammer offers | |
actually set it to 10000 because 1000 the grid lines mess up when zoomed in that close | |
floating point inconsistency with vertices introduced: | |
proof: | |
n > shift+s > "cursor to selected" | |
Y for one vertex is shown as -14349.9976km and -14350.0012km for another | |
this is a result of either crafty's obj export or blender's import process | |
it'd have been OK if they were "wrong" with the same upper/lower rounding | |
fixing it: | |
export the 2 boxes as smd | |
manually round the values to nearest | |
re-import | |
(much easier than doing "shift+s selection to cursor") | |
format explanation: | |
this is what i exported from blender: | |
0 517.000000 -194.999878 241.000107 -0.000000 0.000000 1.000000 -0.402623 0.160006 0 | |
this is the format: | |
https://developer.valvesoftware.com/wiki/Studiomdl_Data | |
<int|Parent bone> <float|PosX PosY PosZ> <normal|NormX NormY NormZ> <normal|U V> <int|links> <int|Bone ID> <float|Weight> [...] | |
this is my format: | |
bone x y z normx normy normz uv 0 | |
rounded to this format (importing smd requires the norm and uv even if all 0's, but keep | |
the normals since it's the u/v that doesn't matter... at least not for this test run): | |
0 517 -195 241 -0 0 1 0 0 0 | |
it might've been the normx/y/z that made studiomdl.exe think my collision model | |
was "2 dimensional", no idea though, and that wouldn't make sense at all, but it | |
is literally the only difference between their formatting I could find, actually | |
it's possible that this, in the working smd: | |
0.000000 0.000000 1 0 1.000000 | |
is good, but "0.5 0.7 0" in non-working was bad, i.e. maybe it felt it was of | |
2-dimensions because it had non-0 u/v values but specified as "phy" at the same | |
time, who knows, but at least the format is consistent with what is imported | |
copy/paste the initial reference boxes 4 times rotating each by 108 | |
set "origin to geometry" first before copy/paste | |
may not be significant surprisingly, but ensure we're rotating about box's origin | |
then do the copy/pastes | |
then, press n, make sure 3d cursor is at 0 0 0, then set origin back to 3d cursor | |
r > z > -108 > enter (do this for 4 copy/pastes) | |
going counter-clockwise | |
then in blender move those copies so the vertices of the corners line up as close as possible | |
the metrics / grid size earlier actually wasn't that important | |
use a combination/process of EXACTLY: | |
right-click select the misaligned/bad box | |
tab > rmb select vertex nearest to the aligned/good box | |
shift+s > cursor to selected | |
tab out of edit mode > set origin > origin to 3d cursor | |
rmb select the good box | |
tab > rmb select vertex nearest the bad box | |
shift+s > cursor to selected | |
tab out of edit mode | |
rmb select the bad box | |
shift+s > selection to cursor | |
bad box == good box... done | |
repeat | |
to efficiently "cheese" as-exact-as-possible line-up of the vertices | |
NOTE: | |
see this file: | |
"Export After Importing the Rounded to Prove Blender Z Viewport Only LOOKS Inaccurate.smd" | |
that has clean 0 decimals | |
the clean "1 0 0" normals did change to "0.577349 0.577349 -0.577349" for w/e reason | |
the problem is that blender's viewport, when zoomed in an OBSCENE amount, shows that | |
both vertices height-wise don't have their edges perfectly aligned | |
i think the internal data for the file is 100% OK, it's just the graphical rendering | |
that chokes up this close | |
the above "combination/process" works well enough, but also when zoomed in all the | |
way, the corners do not visually align perfectly... but dragging the gizmo | |
to align them only makes it worse | |
bottom-line: believe the exported smd rounding proof and action-by-action, do NOT | |
believe what is actually shown | |
this will get a lot noisier after extrusions etc., but the goal is to be 100% thorough and | |
precise up to before all of that | |
from blender use source tools to export as smd | |
compile the smd with crowbar then add to the final desired map as a model at 0 0 0 origin | |
end result is that this process has been validated and so MOST courtyard geometry will be made in blender (NOT hammer) | |
the "visleaf splitting" geometry will still need to be made in hammer, and be | |
aligned to grid, which WILL INEVITABLY NOT align with the *visible* geometry, | |
but this whole process is about the *visible* geometry with collision where | |
needed (things like balconies should have their collision in the model thus | |
done in blender, since if those were done in hammer they'd have been func_detail | |
and not split visleaves either way -- HINTS etc. could alternatively be used | |
which would, in hammer, "complement" the courtyard's collision model... since | |
we don't necessarily need to create walls in hammer to forcefully split leaves!) | |
blender will have "snap to face" tools to align balconies (adequately exactly) to angled pentagon faces | |
hammer will be used for "point-based" model/prop placement ignoring brushes entirely (if they align with frame) | |
the "frame" will ultimately be the lower steps but maybe the balconies etc. should be separate models | |
separate models (for frame/base, balconies, railings, etc.) may be best to "limit the damage" of complex collision | |
blender hotkey notes as reminder (for version 2.70 and blender source tools 2.1.0) | |
---------------------------------------------------------------------------------- | |
right-click to select stuff | |
x to delete camera and lamp | |
zoom in/out mousewheel up/down | |
pan around by depressing mousewheel | |
hold shift combined with either above | |
after selecting the blue wrench is modifiers i.e. decimate | |
shift+a > add > mesh > cube | |
tab enters "edit mode" | |
ctrl + right-click to multi-select vertices | |
7 on numpad for top-down perspective then other nums to orient | |
left-click drag and let-go left-click are only in "confident" modes | |
sometimes it is necessary to drag with right-click and "commit" with left | |
ctrl+c/v copy/paste easy | |
shift + right-click then ctrl+j to join multiple cubes etc. | |
r to begin rotating immediately press x/y/z to constrain to axis and type in values | |
shift+s > "cursor to center" to move 3d cursor | |
exit tab's edit mode then "origin to 3d cursor" is on the left | |
"sun window and a mirror" (3rd tab right panel) > change dmx to smd > export | |
window > "toggle system console" to see errors/warnings if any | |
tab > edit mode > add > "extrude region" extrudes a new face out of existing selected face | |
while in tab (edit mode), ctrl+tab allows selection between vertices/edges/faces | |
ctrl+right-click may select extra undesirable faces so use shift+right-click instead | |
ctrl+left-click needed to select multiple verts/edges/faces | |
shift+left-click needed to select multiple objects i.e. cubes | |
p can be used to re-separate objects after a ctrl+j joining | |
hold ctrl to "snap to" grid to keep extrusions at same length but note its unreliable | |
make the magnet icon red by clicking it to force always-on "snap to" | |
a vs c (circle select) mode idk the difference yet but it exists | |
gameshark code for copy/pasting a selected object upwards exactly 14 units: | |
-- ctrl c v | |
-- then g (translate) | |
-- z (lock to z axis) | |
-- type 14 (to move up 14 units) | |
-- enter (commit) | |
-- shift+right-click select all 3 | |
-- ctrl+j to join | |
shift+s "cursor to selected" is how you can sorta "snap" by manipulating 3d cursor exactly | |
ctrl+alt+shift+c is expedited way to get to (requires being out of tab edit mode) "origin to 3d cursor" | |
n > clip > start/end to set the "draw distance" aka "clipping plane" | |
n > also exposes x/y/z coords for 3d cursor and other cool hidden stuff | |
z shows wireframe | |
alt+z shows textured/material mode (for when importing a *.obj automatically imports associated *.mtl) | |
z will revert the alt+z whenever pressed in addition to showing the wireframe | |
a to "de-select all" (objects, vertices, etc.) | |
hammer notes to not confuse the two | |
----------------------------------- | |
brackets control grid sizes | |
ctrl+e centers current object in 2d viewports | |
ctrl+f splits faces | |
alt+e opens face scaling | |
when in vertex/clip tool mode press icon to change types of the mode | |
if "$maxconvexpieces" in model's qc needs to be over 20 it is considered costly | |
atlas only has 8 convex pieces as the engine likely treats balls as simpler than they are | |
i still have no idea why my lesser-geometry collision model in blender had 24 convex pieces | |
-- and i made that thing from scratch, whereas valve's had 3, and the final working one where | |
-- i simply resized valve's and copy/pasted it 3 times only had 6 instead of expected 9 | |
space + left-click to efficiently look around | |
todon't | |
------- | |
consider creating a "Verified" visgroup, all entities up to that point have been verified | |
as being aligned to grid (or OK that they're not / deliberate) and so future working | |
conditions can eliminate visibility of past work completed... I'm hesitant since this may | |
be confusing as nothing in the map is final until shipping so "verified" is misleading, | |
so instead keep tabs on all the "checkpoint backups" and what new stuff is added and | |
ensure it is all aligned to grid -- the "reference boxes" above are current HUGE outlier | |
todo quicklist | |
-------------- | |
block out the rest of the map -- most importantly, for now, the first 2 minutes and the last 2 | |
minutes of the tutorial, those areas should be established early on to get a "feel" | |
for everything... everything in-between is 100% devoted to blocking and iterative | |
ironing down the specifics... secure 4 minutes for beginning/end, figure out rest 11 | |
(final tank area reminiscent of portal 2 underground old aperture / bioshock, a large | |
area that forces tank to practice throwing rocks at survivors in beginning with no | |
horde as a distraction, then things open up slowly in some way so tank can't instantly | |
wipe with punches, then finally reveal/expose access to breakball for the wipe, this | |
would be a large area like the beginning with a lot of visual attraction) | |
finish barbed hole, definitely add smoke or something as it's a bit strange the hole is so huge | |
from just the 1 rescue chopper but the whole point is to make this an outdoorsy indoor area | |
i.e. first 3/5 of tutorial is like that or outdoors, remaining 2/5 underground | |
even though players are not meant to see it, resolve the entryway -- the "blocklight" does nothing | |
and does not enforce darkness, figure that out, add some smoke/fire (pipebomb explosion) | |
re-make all 4*2 reference boxes using -108 rotations starting from non-rotated each time | |
then align the reference boxes to grid but practice first to un-rotate and see if still symmetrical | |
all while doing this in the SAME VMF LOAD SESSION, to accurately align their | |
corners as visually-precise as possible THEN edit their vertices so they are | |
all on-grid -- will NOT solve the fact that the edge remains off-grid, but | |
this will establish walls for "visleaf" cutting and major "accurate enough" | |
collision so the model doesn't need to have all collision... ceda_courtyard_frame | |
should definitely have collision (and lighting/shadows) for balconies etc. though | |
but in blender at least all those elements can align/snap precisely to 108-degree | |
angled faces (which hammer could NEVER do) | |
finish destroying remaining pillars | |
finish mergeprocess using main map skybox bounds as template | |
start a new map and find a working "blocklos" alternative for survivors... | |
simply, spawn survivors, with a "blocklos" wall in between, if they can shoot | |
through it (spoiler: they will) then find something they cant, as long as it | |
does not block smoker tongue -- all else fails, create a 100% custom tool material | |
connect the scripting dots more perhaps 2 smoker spawns at beginning from different upper angles etc. | |
also what is the "left path" for smoker to take? how does that thick flooring get destroyed? | |
also is there a "left path" for the boomer? maybe the "authorized personnel only" revolving | |
door, change that to just a normal-looking "airlock", block it off entirely, then add another | |
destroyed/underground path so boomer could alternatively boomer on survivors from below | |
through a grating (teaching the same as the rocks/barricade) | |
texture revamp the whole thing, put all those extracted/converted favorites to use | |
start ceda breakball (see concepts) and courtyard center as they direct appearance of everything else | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#### Registry Hammer Config -- Main.reg #### | |
############################################## | |
Windows Registry Editor Version 5.00 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer] | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\2D Views] | |
"Crosshairs"=dword:00000000 | |
"GroupCarve"=dword:00000001 | |
"Scrollbars"=dword:00000001 | |
"RotateConstrain"=dword:00000001 | |
"Draw Vertices"=dword:00000001 | |
"Draw Models"=dword:00000001 | |
"Default Grid"=dword:00000040 | |
"WhiteOnBlack"=dword:00000001 | |
"GridHigh1024"=dword:00000001 | |
"GridHigh10"=dword:00000001 | |
"GridIntensity"=dword:0000001e | |
"HideSmallGrid"=dword:00000001 | |
"Nudge"=dword:00000001 | |
"OrientPrimitives"=dword:00000000 | |
"AutoSelect"=dword:00000000 | |
"SelectByHandles"=dword:00000000 | |
"GridHighSpec"=dword:00000008 | |
"KeepCloneGroup"=dword:00000001 | |
"Gridhigh64"=dword:00000000 | |
"GridDots"=dword:00000000 | |
"Centeroncamera"=dword:00000000 | |
"Usegroupcolors"=dword:00000001 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\3D Views] | |
"Hardware"=dword:00000000 | |
"Reverse Y"=dword:00000000 | |
"BackPlane"=dword:00002710 | |
"UseMouseLook"=dword:00000001 | |
"ModelDistance"=dword:00002710 | |
"DetailDistance"=dword:00002710 | |
"AnimateModels"=dword:00000001 | |
"ForwardSpeedMax"=dword:000003e8 | |
"TimeToMaxSpeed"=dword:000001f4 | |
"FilterTextures"=dword:00000001 | |
"ReverseSelection"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Arch] | |
"Wall Width"=dword:00000040 | |
"Arc_"="360.000000" | |
"Sides"=dword:00000006 | |
"Start Angle_"="198.000000" | |
"Add Height"=dword:00000020 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar0] | |
"BarID"=dword:0000e80a | |
"XPos"=dword:0000003a | |
"YPos"=dword:fffffffe | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81b | |
"MRUDockLeftPos"=dword:0000003a | |
"MRUDockTopPos"=dword:00000000 | |
"MRUDockRightPos"=dword:000000dc | |
"MRUDockBottomPos"=dword:00000020 | |
"MRUFloatStyle"=dword:00002004 | |
"MRUFloatXPos"=dword:ffffffff | |
"MRUFloatYPos"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar1] | |
"BarID"=dword:0000e810 | |
"XPos"=dword:fffffffe | |
"YPos"=dword:fffffffe | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81b | |
"MRUDockLeftPos"=dword:00000000 | |
"MRUDockTopPos"=dword:00000000 | |
"MRUDockRightPos"=dword:0000003e | |
"MRUDockBottomPos"=dword:00000020 | |
"MRUFloatStyle"=dword:00002004 | |
"MRUFloatXPos"=dword:ffffffff | |
"MRUFloatYPos"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar10] | |
"BarID"=dword:0000e80b | |
"XPos"=dword:fffffffe | |
"YPos"=dword:fffffffe | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81d | |
"MRUDockLeftPos"=dword:00000000 | |
"MRUDockTopPos"=dword:00000000 | |
"MRUDockRightPos"=dword:00000099 | |
"MRUDockBottomPos"=dword:000000ac | |
"MRUFloatStyle"=dword:00001000 | |
"MRUFloatXPos"=dword:ffffffff | |
"MRUFloatYPos"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar11] | |
"BarID"=dword:0000e80f | |
"XPos"=dword:fffffffe | |
"YPos"=dword:0000017b | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81d | |
"MRUDockLeftPos"=dword:00000000 | |
"MRUDockTopPos"=dword:0000017b | |
"MRUDockRightPos"=dword:00000099 | |
"MRUDockBottomPos"=dword:000001e1 | |
"MRUFloatStyle"=dword:00001000 | |
"MRUFloatXPos"=dword:0000039f | |
"MRUFloatYPos"=dword:00000193 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar2] | |
"BarID"=dword:0000e809 | |
"XPos"=dword:fffffffe | |
"YPos"=dword:fffffffe | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81c | |
"MRUDockLeftPos"=dword:00000000 | |
"MRUDockTopPos"=dword:00000000 | |
"MRUDockRightPos"=dword:00000039 | |
"MRUDockBottomPos"=dword:000001cf | |
"MRUFloatStyle"=dword:00002004 | |
"MRUFloatXPos"=dword:ffffffff | |
"MRUFloatYPos"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar3] | |
"BarID"=dword:0000e80c | |
"XPos"=dword:000000da | |
"YPos"=dword:fffffffe | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81b | |
"MRUDockLeftPos"=dword:000000da | |
"MRUDockTopPos"=dword:00000000 | |
"MRUDockRightPos"=dword:000003eb | |
"MRUDockBottomPos"=dword:00000020 | |
"MRUFloatStyle"=dword:00002004 | |
"MRUFloatXPos"=dword:ffffffff | |
"MRUFloatYPos"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar4] | |
"BarID"=dword:0000e801 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar5] | |
"BarID"=dword:0000e81b | |
"Bars"=dword:00000005 | |
"Bar#0"=dword:00000000 | |
"Bar#1"=dword:0000e810 | |
"Bar#2"=dword:0000e80a | |
"Bar#3"=dword:0000e80c | |
"Bar#4"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar6] | |
"BarID"=dword:0000e81c | |
"Bars"=dword:00000003 | |
"Bar#0"=dword:00000000 | |
"Bar#1"=dword:0000e809 | |
"Bar#2"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar7] | |
"BarID"=dword:0000e81d | |
"Bars"=dword:00000006 | |
"Bar#0"=dword:00000000 | |
"Bar#1"=dword:0000e80b | |
"Bar#2"=dword:0000e807 | |
"Bar#3"=dword:0000e80f | |
"Bar#4"=dword:0000e808 | |
"Bar#5"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar8] | |
"BarID"=dword:0000e808 | |
"XPos"=dword:fffffffe | |
"YPos"=dword:000001df | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81d | |
"MRUDockLeftPos"=dword:00000000 | |
"MRUDockTopPos"=dword:000001df | |
"MRUDockRightPos"=dword:00000099 | |
"MRUDockBottomPos"=dword:00000286 | |
"MRUFloatStyle"=dword:00001000 | |
"MRUFloatXPos"=dword:00000305 | |
"MRUFloatYPos"=dword:000001ee | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Barstate-Bar9] | |
"BarID"=dword:0000e807 | |
"XPos"=dword:fffffffe | |
"YPos"=dword:000000a8 | |
"Docking"=dword:00000001 | |
"MRUDockID"=dword:0000e81d | |
"MRUDockLeftPos"=dword:00000000 | |
"MRUDockTopPos"=dword:000000a8 | |
"MRUDockRightPos"=dword:00000099 | |
"MRUDockBottomPos"=dword:0000017d | |
"MRUFloatStyle"=dword:00001000 | |
"MRUFloatXPos"=dword:000002bd | |
"MRUFloatYPos"=dword:000000b9 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\BarState-Summary] | |
"Bars"=dword:0000000c | |
"ScreenCX"=dword:00000500 | |
"ScreenCY"=dword:00000300 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Configured] | |
"Installed"=dword:5dbbed31 | |
"Configured"=dword:00000002 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Custom2DColors] | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\EntityReportDlg] | |
"FilterByKeyvalue"=dword:00000000 | |
"FilterByClass"=dword:00000000 | |
"FilterByHidden"=dword:00000001 | |
"FilterByType"=dword:00000000 | |
"Exact"=dword:00000000 | |
"FilterClass"="PROP_STATIC" | |
"FilterKey"="TARGETNAME" | |
"FilterValue"="XXXX" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\FloatingBarSize] | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\FloatingBarSize\Filter Control] | |
"floatX"=dword:00000099 | |
"floatY"=dword:000000d5 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\General] | |
"TextureFileCount"=dword:00000000 | |
"TextureFile0"="textures.wad" | |
"Brightness"=dword:0000000a | |
"Max Cameras"=dword:00000064 | |
"Undo Levels"=dword:00000032 | |
"Locking Textures"=dword:00000001 | |
"Scale Locking Textures"=dword:00000000 | |
"Texture Alignment"=dword:00000000 | |
"Independent Windows"=dword:00000000 | |
"Perforce Integration"=dword:00000000 | |
"Load Default Positions"=dword:00000001 | |
"GroupWhileIgnore"=dword:00000000 | |
"StretchArches"=dword:00000001 | |
"Show Helpers"=dword:00000001 | |
"Visible Map Errors"=dword:00000000 | |
"Time Between Saves"=dword:0000000f | |
"Max Autosave Space"=dword:00000064 | |
"Max Saves Per Map"=dword:00000005 | |
"Autosaves Enabled"=dword:00000000 | |
"Closed Correctly"=dword:00000001 | |
"Autosave Dir"="C:\\HammerAutosave\\" | |
"Show Hidden Targets As Broken"=dword:00000000 | |
"Directory"="C:\\Program Files (x86)\\Steam\\steamapps\\common\\left 4 dead 2\\bin" | |
"Last Good Save"="C:\\Program Files (x86)\\Steam\\steamapps\\common\\Left 4 Dead 2\\zz_hex_editing\\__DEVELOPMENT\\_VMF_UPDATES\\c1m3_mall.vmf" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Model Browser] | |
"Position"="315 91 1186 699" | |
"Filter"="ceda" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Particle Browser] | |
"Position"="-8 -8 1284 772" | |
"Filter"="ceda" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Paste Special] | |
"Copies"=dword:00000001 | |
"Group"=dword:00000000 | |
"Offset"="0 0 0" | |
"Rotate"="0.0 0.0 0.0" | |
"Center"=dword:00000001 | |
"MakeNamesUnique"=dword:00000000 | |
"AddPrefix"=dword:00000000 | |
"Prefix"="" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Recent File List] | |
"File1"="C:\\Program Files (x86)\\Steam\\steamapps\\common\\Left 4 Dead 2\\zz_cedatesting\\mapsrc\\ceda_testing_vs.vmf" | |
"File2"="C:\\Program Files (x86)\\Steam\\steamapps\\common\\Left 4 Dead 2\\zz_cedatesting\\_LOADINGSCREEN_SCENE\\ceda_courtyard_frame.vmf" | |
"File3"="C:\\Program Files (x86)\\Steam\\steamapps\\common\\Left 4 Dead 2\\zz_cedatesting\\_LOADINGSCREEN_SCENE\\LOADINGSCREEN_SCENE_mergeprocess.vmf" | |
"File4"="C:\\Program Files (x86)\\Steam\\steamapps\\common\\Left 4 Dead 2\\zz_cedatesting\\_SOURCED_ASSET_FILES\\_STYLES_AND_STANDARDS_GUIDES\\Decompiles of Influential Maps to Mini-Remix\\Focus (BSPSource 1.3.18 Includes LMP's)\\c8m4_interior_d.vmf" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Run Map] | |
"QBSP"=dword:00000001 | |
"Vis"=dword:00000001 | |
"Light"=dword:00000001 | |
"HDRLight"=dword:00000001 | |
"No Game"=dword:00000001 | |
"Game Parms"="-toconsole -dev -console +sv_lan 1" | |
"WaitForKeypress"=dword:00000001 | |
"Mode"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\RunMapExpert] | |
"LastSequence"=dword:00000003 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Settings] | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\SoundBrowser] | |
"Sound Type"=dword:00000000 | |
"Sound Autoplay"=dword:00000000 | |
"Sound Filter"="ceda" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Splitter] | |
"DrawType0,0"=dword:00000009 | |
"DrawType0,1"=dword:00000001 | |
"DrawType1,0"=dword:00000001 | |
"DrawType1,1"=dword:00000002 | |
"SplitterWidth"=dword:00000216 | |
"SplitterHeight"=dword:00000134 | |
"WindowPlacement"="(-8 -32) (-1 -1) (462 27 912 27) 3" | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Texture Browser] | |
"Position"="-8 -8 1288 732" | |
"ShowSize"=dword:00000000 | |
[HKEY_CURRENT_USER\Software\Valve\Hammer\Torus] | |
"Wall Width"=dword:00000019 | |
"Arc_"="360.000000" | |
"Sides"=dword:00000006 | |
"Start Angle_"="0.000000" | |
"Rotation Arc_"="180.000000" | |
"Rotation Start Angle_"="0.000000" | |
"Rotation Sides"=dword:00000005 | |
"Add Height"=dword:00000000 | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#### Valve Wiki Notes.txt #### | |
################################ | |
OVERVIEW: | |
$contents "solid" "ladder" | |
The above literally creates a solid, climbable ladder. | |
It is assumed that "notsolid" would make it non-solid and the ladder would | |
therefore not work, as similarly confirmed with "DisableCollision" on test | |
spawns with prop_dynamic. | |
Tested "monster" and "grate" as well: "monster" didn't change anything (tried | |
throwing bile at it as maybe it'll silhouette like an NPC, all team collision | |
to it was the same, etc.); and "grate" didn't allow shooting through even | |
the thickest of walls. Overall, neither of these appear useful. | |
^^ The fleeting hope was that "monster" could produce Infected-only | |
collision... but it's nothing like it; doesn't even act as "flesh" | |
and still bullet-holes/decals when shot. | |
In theory, recompiling all the QC's with "ladder" contents could make ALL models | |
climbable, in addition to LUMP 18 BRUSHES hexedits for all baked-in brushes. | |
There's 3 "problems" with this "QC ladder": | |
1. Survivors are aggressively magnetic to it when running off the | |
top, where regular func_simpleladder's they "bounce" off if at | |
higher speeds. Luckily, SI Player ladder interaction is completely | |
different and makes an effort to avoid magnetism if moving fast. | |
RESOLUTION: Not a problem if "QC ladders" are only used | |
for SI Players -- but 100% invisible Survivor-climbable | |
"QC ladders" are still justified, since additional clips | |
could reduce this sensation. | |
2. All geometry for the model is climbable, and this means the sides | |
of the ladder, or its back. | |
RESOLUTION: | |
Separating the "guard clips" into a separate model is viable, | |
but also bad since it requires a 2nd prop_dynamic entity/edict. | |
$jointcontents can, instead, technically have "ladder" on the | |
climbable portion of the ladder, then the "guard clips" as a | |
different bone that are just "solid". | |
3. Both teams (Survivor + Infected) will always be able to climb it. | |
RESOLUTION: None -- 100% requires a 2nd clip to block Survivor. | |
Overall: | |
Cloning func_simpleladder brushes is still objectively better in the | |
sense that they'll almost always require 1 less edict. However, there | |
are some times where env_physics_blocker complement the clones, which | |
totals to 3 edicts, and "QC ladders" could reduce those to 2 -- but | |
it's arguably more effort than it's worth. | |
If bones and $jointcontents works, it'd be a great way to get the best | |
of both worlds with 1 prop_dynamic (still requiring env_physics_blocker | |
to block Survivors from touching it, sadly). | |
The best possible solution would be if "func_simpleladder" was updated | |
to accept "studiomodels" instead of its current limit of "brush models". | |
That's because "func_simpleladder" supports team-based exclusivity. | |
So, while "QC ladders" are cool, the uses are niche: | |
1. No Mercy 5 satellite ladder -- there's no good options to | |
clone for this since it needs to be really short. Angling | |
it results in its appearance glitching out when far away. | |
Will still require a Survivor-only env_physics_blocker. | |
2. Dead Center 1 elevator shaft -- instead of a LUMP 18 BRUSHES | |
BSP hexedit (which also requires env_physics_blockers for | |
Survivors), just create a "QC ladder"... less risk, but will | |
still require the env_physics_blocker. | |
3. Dead Center 1 skylight/lobby -- let's ignore adding a ladder | |
to the long-ledge given its sheer OP-ness... but, instead | |
of the previous "env_beam" ladders, "QC ladders" would 100% | |
work here. I could complement it with the BSP hexedits to | |
remove the walls/pillars, which is now A LOT MORE REALISTIC | |
to restore with Propper models since the Propper models | |
themselves can be climbable -- no longer requiring far more | |
convoluted methods of hacking in new climbable BSP brushes. | |
REQUIREMENT: | |
Not yet known if "QC ladders" that are angled, allow | |
the player to "climb around" their curvature. This | |
would be 100% required here. | |
4. Dark Carnival 2 overhang rooftops -- instead of linking | |
several ladders together in a convoluted, non-seamless way, | |
a "QC ladder" could "conform" to overhang curvature and | |
allow the train rooftop ladder to be made at front vines. | |
5. Arguably more friendly ladder placement... but, again, still | |
requires a env_physics_blocker to block Survivors. | |
So, it's cool, but still niche. While %compileteam exists for VMT/materials | |
which allows only the Infected team to see the scrolling ladder texture, nothing | |
appears to exist like it for models (there's no such thing as "Model Proxies"). | |
However, if COLLISION GROUPS could allow only Infected to touch it, that's the | |
only outcome that'd change everything. | |
Following are Valve Wiki articles for future experimentation. | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/$contents | |
The QC command $contents specifies a list of the content_types to use for | |
SolidMask tests during non-hitbox traces. | |
This feature was specifically added to allow us to make things like fences out | |
of props instead of brush models. | |
Example | |
$contents "monster" "grate" | |
Available content_types are: | |
grate | |
Makes it a grate. | |
(Grates are not solid to bullets or line of sight, but solid to everything else.) | |
monster | |
Marks it as an NPC. | |
notsolid | |
Makes it not solid to anything. | |
solid | |
Makes it solid. | |
Solid is the default value, so this parameter is usually used only for the | |
$jointcontents command, to make a solid child of a non-solid parent. | |
ladder | |
Makes it a ladder. | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/$jointcontents | |
https://developer.valvesoftware.com/wiki/QC_Commands | |
$jointcontents (joint name) (list of names of content types) | |
The QC command $jointcontents is just like $contents, but it applies the contents | |
to the specified bone and all of its child bones. | |
Syntax | |
$jointcontents "<bone_name>" "<content_type_1>" "<content_type_2>" "<content_type_3>" | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/Category:QC_Commands | |
Less useful than "/wiki/QC_Commands" even though a warning says it's better. | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/Collision_mesh | |
https://developer.valvesoftware.com/wiki/CollisionProperty | |
https://developer.valvesoftware.com/wiki/$collisionmodel | |
Generic articles about VPhysics collision models. The fact that both teams can | |
climb the ladder means this works -- there's no apparent simple-fix to make the | |
model only solid to Infected. | |
enum SurroundingBoundsType_t | |
{ | |
USE_OBB_COLLISION_BOUNDS = 0, | |
USE_BEST_COLLISION_BOUNDS, // Always use the best bounds (most expensive) | |
USE_HITBOXES, | |
USE_SPECIFIED_BOUNDS, | |
USE_GAME_CODE, | |
USE_ROTATION_EXPANDED_BOUNDS, | |
USE_COLLISION_BOUNDS_NEVER_VPHYSICS, | |
SURROUNDING_TYPE_BIT_COUNT = 3 | |
}; | |
This is how "bounding box collision" can exist -- "shrinkwrapping", though, is | |
the auto-generated $collisionmodel for when STUDIOMDL chooses to dislike your | |
specified collision model. | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/$collisionjoints | |
May be possible to use bones to make specific parts of the model non-solid, | |
but really it'd make more sense to simply not have collision mesh there. | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/Tool_textures | |
https://developer.valvesoftware.com/wiki/%25compileladder | |
The func_ladder tool texture is for the compiler to recognize a BSP brush model | |
as a ladder. While the "Scrolling Infected Climb Texture" does specify this: | |
Compiles the texture as a ladder texture, meaning your texture | |
will behave the same as the tools/ladder. | |
Example: | |
LightmappedGeneric | |
{ | |
$basetexture developer/custom_clip | |
%compileladder 1 | |
} | |
That's how you get the "Scrolling Infected Climb Texture" in-game, while VBSP | |
is still happy to see it as if it were a "func_ladder". | |
Propper interprets "NODRAW" faces as sides to DELETE from the resulting SMD. | |
Propper has no means of interpreting something like %compileladder, and Propper | |
models do not work with func_simpleladder (only the "*45"-type BSP brushes). | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/Category:List_of_Shader_Parameters | |
https://developer.valvesoftware.com/wiki/%25compileteam | |
https://www.google.com/search?q=qc+only+collision+for+specific+team | |
ARTICLE COPY/PASTED BELOW, BUT: | |
This is due diligence that only VMT/materials can restrict | |
rendering of textures to specific teams. It's lucky it's | |
even this convenient (and possibly exclusive?) to L4D2. | |
Doing the same for models seems highly unlikely. | |
Compiles the texture to only affect a specific team. For example, the climb | |
texture is a ladder that only lets infected climb up it. | |
However, making a texture visible to only one team requires Proxies. As seen in | |
the example below. | |
Example: | |
UnlitGeneric | |
{ | |
$basetexture "tools\climb" | |
$additive 1 | |
"%compileTeam" 2 | |
"%compilepassbullets" 1 | |
"%compileladder" 1 | |
$proxRange 0.0 | |
$proxTeam 1.0 | |
$one 1.0 | |
Proxies | |
{ | |
PlayerTeam | |
{ | |
team 3 //Note: "%compileTeam" and this "team" use different numbers. Because that's just how it is coded. | |
resultVar $proxTeam | |
} | |
Subtract | |
{ | |
srcVar1 $one | |
srcVar2 $proxRange | |
resultVar $alpha | |
} | |
Multiply | |
{ | |
srcVar1 $alpha | |
srcVar2 $proxTeam | |
resultVar $alpha | |
} | |
TextureScroll | |
{ | |
texturescrollvar $baseTextureTransform | |
texturescrollrate 1 | |
texturescrollangle 90.00 | |
} | |
} | |
} | |
################################################################################ | |
################################################################################ | |
https://developer.valvesoftware.com/wiki/Collision_groups | |
https://wiki.facepunch.com/gmod/Enums/COLLISION_GROUP | |
http://ozxy.xyz/sourceDocs/swarm/const_8h.html#af131274a24f6927d3844658c87260fa5a42cb226aa654a97d46cdca405e14873c | |
http://ozxy.xyz/sourceDocs/swarm/const_8h.html | |
https://github.com/ashort96/SetCollisionGroup/blob/master/addons/sourcemod/scripting/includes/SetCollisionGroup.inc | |
https://hg.alliedmods.net/hl2sdks/hl2sdk-swarm/file/627091ca3017/public/const.h | |
https://www.google.com/search?q=COLLISION_GROUP_PZ_CLIP | |
https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/public/const.h | |
https://gist.github.com/sigsegv-mvm/da273a5bb41c883b61621526219f1da2 | |
https://wiki.alliedmods.net/Left_4_dead_2_netprops#CDynamicProp: | |
If none of these NetProps (see "cl_pdump #prop_dynamic#"): | |
prop_dynamic_create model | |
ent_setname test | |
script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "NetProp" ) ) | |
script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "NetProp", # ) | |
m_Collision. | |
m_nSolidType | |
m_usSolidFlags | |
m_iTeamNum | |
m_CollisionGroup | |
m_hOwnerEntity | |
m_hEffectEntity | |
movetype | |
movecollide | |
And from 0 to ???? these Collision Groups: | |
COLLISION_GROUP_NONE = 0, | |
COLLISION_GROUP_DEBRIS, // Collides with nothing but world and static stuff | |
COLLISION_GROUP_DEBRIS_TRIGGER, // Same as debris, but hits triggers | |
COLLISION_GROUP_INTERACTIVE_DEBRIS, // Collides with everything except other interactive debris or debris | |
COLLISION_GROUP_INTERACTIVE, // Collides with everything except interactive debris or debris | |
COLLISION_GROUP_PLAYER, | |
COLLISION_GROUP_BREAKABLE_GLASS, | |
COLLISION_GROUP_VEHICLE, | |
COLLISION_GROUP_PLAYER_MOVEMENT, // For HL2, same as Collision_Group_Player, for | |
// TF2, this filters out other players and CBaseObjects | |
COLLISION_GROUP_NPC, // Generic NPC group | |
COLLISION_GROUP_IN_VEHICLE, // for any entity inside a vehicle | |
COLLISION_GROUP_WEAPON, // for any weapons that need collision detection | |
COLLISION_GROUP_VEHICLE_CLIP, // vehicle clip brush to restrict vehicle movement | |
COLLISION_GROUP_PROJECTILE, // Projectiles! | |
COLLISION_GROUP_DOOR_BLOCKER, // Blocks entities not permitted to get near moving doors | |
COLLISION_GROUP_PASSABLE_DOOR, // Doors that the player shouldn't collide with | |
COLLISION_GROUP_DISSOLVING, // Things that are dissolving are in this group | |
COLLISION_GROUP_PUSHAWAY, // Nonsolid on client and server, pushaway in player code | |
COLLISION_GROUP_NPC_ACTOR, // Used so NPCs in scripts ignore the player. | |
COLLISION_GROUP_NPC_SCRIPTED, // Used for NPCs in scripts that should not collide with each other | |
COLLISION_GROUP_PZ_CLIP, | |
//PORTAL2 | |
COLLISION_GROUP_CAMERA_SOLID, // Solid only to the camera's test trace | |
COLLISION_GROUP_PLACEMENT_SOLID, // Solid only to the placement tool's test trace | |
COLLISION_GROUP_PLAYER_HELD, // Held objects that shouldn't collide with players | |
COLLISION_GROUP_WEIGHTED_CUBE, // Cubes need a collision group that acts roughly like COLLISION_GROUP_NONE but doesn't collide with debris or interactive | |
//PORTAL2 end | |
COLLISION_GROUP_DEBRIS_BLOCK_PROJECTILE, // Only collides with bullets | |
LAST_SHARED_COLLISION_GROUP | |
If none of those work, including the "BEST CHANCE": | |
COLLISION_GROUP_PZ_CLIP | |
Alien Swarm code suggests it's "20". | |
Facepunch / Garry's Mod places "20" for this, however: | |
COLLISION_GROUP_WORLD 20 Doesn't collide with players/props | |
Best case scenario is that "COLLISION_GROUP_PZ_CLIP" could in theory be Infected | |
only ("Player Zombie") collision. | |
Basically just randomly try Collision Group numbers 0-30. | |
If none work, but the results are still "roughly consistent" to above comments, | |
then it's just not going to be possible this way. | |
If it IS possible... then "QC ladders" would be objectively superior to clones. | |
################################################################################ | |
################################################################################ | |
CONSOLE DUMP OF ALL TESTS: | |
] find_ent prop_dynamic | |
Searching for entities with class/target name containing substring: 'prop_dynamic' | |
'prop_dynamic' : '' (entindex 84) | |
Found 24 matches. | |
] cl_pdump 84 | |
] ent_setname test | |
Set the name of prop_dynamic to test | |
] find_ent test | |
Searching for entities with class/target name containing substring: 'test' | |
'prop_dynamic' : 'test' (entindex 84) | |
Found 1 matches. | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_iTeamNum", 1 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_iTeamNum", 2 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
0 | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_CollisionGroup" ) ) | |
84 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 0 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_CollisionGroup" ) ) | |
84 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 0 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
0 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 1 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
1 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 0 ) | |
] = normal even though m_iTeamNum is 1/2 (default 0), Zoey can still climb the prop_dynamic "QC ladder" | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 1 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
1 | |
] = 1 still blocks bullets but survivor/infected/ghost cant move through it | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 2 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
2 | |
] 2 == stops bullets nonsolid to all player types | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 3 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
3 | |
] 3 = same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 4 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
4 | |
] 4 = solid and climbable to everything same as 0 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 5 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
5 | |
] 5 = same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 6 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
6 | |
] 6 = same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 7 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
7 | |
CSoundEmitterSystemBase::GetParametersForSound: No such sound | |
CSoundEmitterSystemBase::GetParametersForSound: No such sound ladder.walkright | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 8 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
8 | |
] 7 = same | |
] 8 = same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 9 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
9 | |
] 9 = same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 10 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
10 | |
Attempted to attach particle effect weapon_muzzle_smoke to an unknown attachment on entity viewmodel | |
] 10 = doesnt block bullets, nonsolid to everyone | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 11 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
11 | |
] 11 = same as 10 but blocks bullets | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 12 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
12 | |
] 12 = same as 10 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 13 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
13 | |
CSoundEmitterSystemBase::GetParametersForSound: No such sound ladder.walkleft | |
] 13 = normal blocks bullets all climbable | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 14 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
14 | |
] 14 = same as 10 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 15 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
15 | |
] 15 = blockets bullets all climbable | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 16 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
16 | |
] 16 = blocks bullets none climbable | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 17 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
17 | |
] 17 = "COLLISION_GROUP_PUSHAWAY", the weirdest one, pushes zoey/hunter/ghost away but blocks bullets | |
] and can jump through it but cannot walk through it bc pushes away | |
] basically a convoluted way to do a trigger_push | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 18 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
18 | |
] 18 = normal all climbable blocks bullets | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 19 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
19 | |
] 19 = same as 18 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 20 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
20 | |
] 20 = suspected COLLISION_GROUP_PZ_CLIP, zoey/hunter/ghost can climb it, doesnt block bullets, FAIL | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 21 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
21 | |
] 21 = doesnt block bullets nonsolid unclimbable to all 3 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 22 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
22 | |
] 22 = blocks bullets climbable to all | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 23 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
23 | |
] 23 = zoey can climb it so skip it | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 24 ) | |
] same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 25 ) | |
] same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 26 ) | |
] same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 27 ) | |
] same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 28 ) | |
] same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 29 ) | |
] same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 30 ) | |
] same | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup", 0 ) | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_CollisionGroup" ) ) | |
0 | |
] reset to 0 | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_nSolidType" ) ) | |
47 | |
] script printl( NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType" ) ) | |
6 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 0 ) | |
prop_dynamic in solid list (not solid) | |
prop_dynamic in solid list (not solid) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 1 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 2 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 3 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 4 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 5 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 6 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 7 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 8 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 9 ) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 10 ) | |
] this is either non-solid to both, or solid to both | |
] "solid" "6" keyvalue | |
] is basically this | |
] right here | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_nSolidType", 6 ) | |
] script printl(NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags" )) | |
6144 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags", 2 ) | |
] script printl(NetProps.GetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags" )) | |
2 | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags", 6143 ) | |
prop_dynamic in solid list (not solid) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags", 6144 ) | |
] 6144 is default | |
] 6143 is nonsolid unclimbable | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags", 6143 ) | |
prop_dynamic in solid list (not solid) | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags", 1 ) | |
] 1 is solid to all and blocks bullets | |
] script NetProps.SetPropInt( Entities.FindByName( null, "test" ), "m_Collision.m_usSolidFlags", 2 ) | |
] 2 is nonsolid to all but blocks bullets | |
FAILURE. ALL OF IT. Thus, "env_physics_blocker" is required. | |
"COLLISION_GROUP_PZ_CLIP" doesn't block bullets... but Zoey/Hunter/Ghost | |
can all still climb it. IDK what it does, but not what I want it to. | |
Alternatively, Kerry could add a way to make it so prop_dynamic collision is | |
absolutely exclusive to the Infected team -- that would be a far more reasonable | |
request than a new mins/maxs "func_simpleladder" entity. | |
Ideally, though, "func_simpleladder" should be updated to support studiomodels, | |
which would allow for 1:1 perfect "QC ladders" -- Kerry adding non-solidity | |
wouldn't even eliminate the need for "guard clips" since SI Players benefit | |
from those, too. | |
################################################################################ | |
################################################################################ | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### | |
#################################################################################################### |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment