Skip to content

Instantly share code, notes, and snippets.

@Tsuey
Created September 2, 2021 19:35
Show Gist options
  • Save Tsuey/674f757e9cf79cdb81c4de93e1fae7f0 to your computer and use it in GitHub Desktop.
Save Tsuey/674f757e9cf79cdb81c4de93e1fae7f0 to your computer and use it in GitHub Desktop.
Boring CEDA Notes
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