Skip to content

Instantly share code, notes, and snippets.

@lmcintyre
Created April 7, 2019 23:32
Show Gist options
  • Save lmcintyre/770582cbd14d140abbfeb8ab7c993b90 to your computer and use it in GitHub Desktop.
Save lmcintyre/770582cbd14d140abbfeb8ab7c993b90 to your computer and use it in GitHub Desktop.
folder key (xx/XXXX) suffix type
00 wl(l|m|s) wall
00 wlc wall unknown
01 rf(l|m|s) roof
01 rfc roof unknown
02 dor door
03 wid window
04 fnc fence
05 osg ornament signboard
06 orf ornament, roof
07 owl ornament, wall
0000 ------------------------- ?
0001 ------------------------- merchant
0002 ------------------------- restaurant
0003 ------------------------- armor shop
0004 ------------------------- weapon shop
0005 ------------------------- moogle
0006 ------------------------- chocobo
0007 ------------------------- paissa
0008 ------------------------- carbuncle
0009 ------------------------- shirogane castle walls
0010 ------------------------- otter
house part sgb format
bgcommon/hou/craft/bil/01/0008/asset/rfl_t4_m0008.sgb
placeholder based
bgcommon/hou/craft/bil/xx/XXXX/asset/yyy_t4_mXXXX.sgb
spawning house format?
bgcommon/hou/dyna/com/(l|m|s)_(rof|wal|wid|etc)/XXXX/asset/com_(l|m|s)_(part)XXXX.sgb
bgcommon/hou/dyna/(com|e1h0|s1h0|w1h0|f1h0)/(l|m|s)_(rof|wal|wid...)/XXXX/asset/(com|e1h0|s1h0|w1h0|f1h0)_(l|m|s)_(part)XXXX.sgb
window, door have format com_(co|ci|ca|cb)_
presumably outdoor/indoor or a/b
almost not necessary due to e1h0_30_l_house.sgb etc
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Create a house?
From packets, we need
roof rof
facade wal
window wid
door dor
----------- From folders, we need
fence c_fnc
Let's make a carbuncle house:
bgcommon/hou/dyna/com/l_rof/0008/asset/com_l_rof0008.sgb
bgcommon/hou/dyna/com/l_wal/0008/asset/com_l_wal0008.sgb
bgcommon/hou/dyna/com/wid/0008/asset/com_co_wid0008.sgb
bgcommon/hou/dyna/com/dor/0008/asset/com_co_dor0008.sgb
bgcommon/hou/dyna/com/c_fnc/0008/asset/com_f_fnc0008a.sgb
bgcommon/hou/dyna/com/c_fnc/0008/asset/com_f_fnc0008b.sgb
bgcommon/hou/dyna/com/c_fnc/0008/asset/com_f_fnc0008c.sgb
bgcommon/hou/dyna/com/c_fnc/0008/asset/com_f_fnc0008d.sgb
From test it looks like something must be controlling where fnc, dor, and wid go.
In Carbuncle test, the house and walls were in the right spot, but the door, windows, and fence was messed up.
Latest lead:
bgcommon/hou/craft/bil/house/bil_l_house.sgb
bil_l_base.mdl
Notes on bil_l_base
Mesh part headers at 604 (0x25C)
String offsets in bgcommon/hou/craft/bil/house/bgparts/bil_l_base.mdl for mtrl names start at 652 in Definition part (652 in 010 that is open)
Parts in bil_l_house do not follow same folder convention as hou/dyna, what is this? | Not sure what I meant by this
bil_l_base.mdl
ModelDefinition [unknowns]
EAD70242 0300 0000 0000 0300 0000 [0000 0000 0000 0000 0107 0000 00 10 0024 744A 0000 0000 0000 0000 0202 0000 0000 0000 0000 0000 0000 0000]
ModelHeaders (3)
0000 0200 8296 3346 0000 1044 0200 0000 0300 0000 0000 0000 0200 0000 0000 0000 8437 0000 0000 0000 0000 0000 88320000 70110000 FC04 0000 8437 0000
0000 0000 5209 CA47 0000 1045 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00000000 00000000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00000000 00000000 0000 0000 0000 0000
Random additional 120 bytes (40 byte chunks, just for organization) no idea why it is there, messes up Coinach
0000 0000 0000 0000 0200 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
MeshHeaders (3)
1F010000 E0040000 0000 0000 0000 FF00 00000000 00000000 F8080000 00000000 08 10 00 02
60000000 08010000 0100 0000 0000 FF00 E0040000 E81A0000 E81D0000 00000000 08 10 00 02
9C000000 D0020000 0200 0000 0000 FF00 E8050000 E8230000 C8280000 00000000 08 10 00 02
Material string offsets (3 materials)
00000000 3C000000 78000000
Bone indices, int32 0, no bones, no further data
00000000
Padding... (bytes to skip) [skipped]
(03) [00 00 00]
Bounding boxes
0000C8C1 000000C0 0000A8C1 0000803F 0000C841 00000000 0000A841 0000803F
0000C8C1 000000C0 0000A8C1 0000803F 0000C841 00000000 0000A841 0000803F
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Fixed loading this and osg_t4_(anything) by skipping 120 bytes after modelheaders if the filename has "bil_" and "_base", or "osg_t4"
Turns out bil really does mean company workshop. Was the models for that.
Now that things load, look in 020000 for anything referencing how to build a house. iirc there was a an .sgb
in there like e1h0_l_house.sgb or something. Try looking for it again, it might have instructions on how to put together a real house.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Path things
For Blueprint:
bg/ffxiv/(e1h0|s1h0|w1h0|f1h0)/hou/dyna/house/(e1h0|s1h0|w1h0|f1h0)_(plotnum)_(l|m|s)_house.sgb
Thinking that maybe the game loads this for empty plots.
When a plot needs to be not-empty, the game loads this, but replaces the loaded SGBs with: Correct asset?
For example,
bg/ffxiv/est_e1/hou/dyna/house/e1h0_30_l_house.sgb
bg/ffxiv/sea_s1/hou/dyna/house/s1h0_03_s_house.sgb
bg/ffxiv/sea_s1/hou/dyna/house/s1h0_01_m_house.sgb
bg/ffxiv/sea_s1/hou/dyna/house/s1h0_02_l_house.sgb
loads
bg/ffxiv/est_e1/hou/dyna/l_rof/0000/asset/e1h0_l_rof0000.sgb (this does not reference a model)
but if the plot should not be empty,
For HousingExterior.json:
(bg|common if region com)/(ffxiv/region id or /com if com)/hou/dyna(/com if com)/l_rof/XXXX/asset/(region id)_l_rofXXXX.sgb
bg/ffxiv/(est_e1|sea_s1|fst_f1|wil_w1)/hou/dyna/(.*?)/(0000)/asset/(e1h0|s1h0|f1h0|w1h0)_(.*?)(0000)(\w?).sgb
Missing opt aspects. osg, orf, owl are in format
bgcommon/hou/dyna/opt/rf/0012/asset/opt_rf_m0012.sgb
From
bgcommon/hou/dyna/opt/rf/0000/asset/opt_rf_m0000.sgb
Patterns:
bg/ffxiv/(est_e1|sea_s1|fst_f1|wil_w1)/hou/dyna/(.*?)/(0000)/asset/(e1h0|s1h0|f1h0|w1h0)_(.*?)(0000)(\w?).sgb
bgcommon/hou/dyna/(e1h0|s1h0|f1h0|w1h0)/(.*?)/(0000)/asset/(e1h0|s1h0|f1h0|w1h0)_(.*?)(0000)(\w?).sgb
bgcommon/hou/dyna/opt/(.*?)/(0000)/asset/opt_(.*?)(0000).sgb
Function handles the rest
HousingInterior:
2nd column (1) in HousingInterior is the model/tex key
bgcommon/hou/dyna/(part)/00XX/(pathformat)
9 walls mat/wl material/rom_wl_200XXa.mtrl
10 floor mat/fl material/rom_fl_200XXa.mtrl
11 lamp lmp/lp asset/lmp_s0_m00XX.sgb
HousingExterior:
1st column is 100% asset id, follows 1/1/1 2/2/2 3/3/3 4/4/4 5/5/5... etc pattern for 3rd column 20 entries
Not only this, but can map as such:
If 3rd column is 20
0001 merchant
0002 restaurant
0003 armor shop
0004 weapon shop
0005 moogle
0006 chocobo
0007 paissa
0008 carbuncle
0009 shirogane castle walls
0010 otter
If not
0001 wood
0002 composite
0003 stone
Second column (1) is Fixturetype
1 roof
2 wall
3 windows
4 door
5 roof decoration
6 wall decoration
7 signboard
8 fence
3rd column must be some kind of intended use
Can predict path for part with this
20 United bgcommon/hou/dyna/com/(part)/XXXX/asset/(partetc)
22 Riviera bg/ffxiv/sea_s1/hou/dyna/(part)/XXXX/asset/(partetc)
23 Glade bg/ffxiv/fst_f1/hou/dyna/(part)/XXXX/asset/(partetc)
24 Oasis bg/ffxiv/wil_w1/hou/dyna/(part)/XXXX/asset/(partetc)
2402 Hingan bg/ffxiv/est_e1/hou/dyna/(part)/XXXX/asset/(partetc)
513-534 door
1025-1090 roof
1537-1558 roofdec
2049-2070 signboard
2561-2582 windows
3073-3097 fence
3585-3641 walls
4097-4118 walldec
opt_ prefix assets have different fixturekeys and always have 20 for intendeduse
riviera placard 2049 1 | - riviera
riviera hanging placard 2050 2 | - riviera
riviera banner 2051 3 | - riviera
glade hanging placards 2052 4 | - glade
glade placard 2053 5 | - glade
glade banner 2054 6 | - glade
oasis hanging placard 2055 7 | - oasis
oasis placard 2056 8 | - oasis
oasis banner 2057 9 | - oasis
weapon shop 2058 11 | - united
armor shop 2059 12 | - united
merchant 2060 13 | - united
restaurant 2061 14 | - united
moogle 2062 15 | - united
chocobo 2063 16 | - united
paissa 2064 17 | - united
carbuncle 2065 18 | - united
shirogane c 2066 19 | - united
hingan placard mokuzo 2067 101 | - hingan
hingan placard nanpu 2068 102 | - hingan
hingan placard kura zukuri 2069 103 | - hingan
otter 2070 20 | - united
TODO: maybe index the transforms in blueprints rather than keeping them separate
on retail, a large house info being put onto a small plot will put the objects at
the positions for a small house, probably because it just reads "put a ____ wall at this plot" and
size doesn't matter
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CSV Relations
VaseFlower.csv contains values that map interior wall indexes (texturekeys) to their string representations
^ Unnecessary with stains
PlaceName.csv contains the string of the place theme that int 20, 22, 24, 2402 map to. For example, 2402 is Hingan themed and PlaceName 2402 is Hingashi
Items.csv contains the key of the housing type in the Stain column.
For example,
Riviera Mansion Walls (Composite) has Stain of 3599. This key in HousingExterior maps to 3599,2,2,22,2,bg/ffxiv/sea_s1/hou/dyna/l_wal/0002/asset/s1h0_l_wal0002.sgb
Oasis Cottage Permit (Stone) has Stain of 262165. This key in HousingPreset maps to "oasis stone cottage" and refers to all items IDs from Item.csv (and thus, Stains) to create the house.
Carbuncle House Walls has Stain of 327703. This key in HousingUnitedExterior provides each of the values necessary to create a Carbuncle house.
Because Stains always end up mapping to a model key in HousingExterior, and we know how to create house paths based on these keys, we can create houses from item IDs, which also allows us to map strings to models.
Extends to all housing items. Furniture, yard items, exterior, interior.
HousingLandSet.csv contains house sizes, 0-2, for all plots, 0-60. Unsure of what follows. Plot costs? Height is wrong, but might need it for house placement.
Plot spaces are a somewhat better solution, but could use above to determine plot locations to dynamically support new districts
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SGB Difference in contained SGBs:
check sgbdifferences.png for a better thing
or, screenshot_690.png if you're lazy which you are
large:
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000a.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000b.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000c.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000d.sgb
bgcommon/hou/dyna/s1h0/dor/0000/asset/s1h0_co_dor0000.sgb
bgcommon/hou/dyna/s1h0/wid/0000/asset/s1h0_co_wid0000.sgb
bgcommon/hou/dyna/opt/rf/0000/asset/opt_rf_m0000.sgb
bgcommon/hou/dyna/opt/sg/0000/asset/opt_sg_m0000.sgb
bgcommon/hou/dyna/opt/wl/0000/asset/opt_wl_m0000.sgb
bg/ffxiv/sea_s1/hou/dyna/s_rof/0000/asset/s1h0_s_rof0000.sgb
bg/ffxiv/sea_s1/hou/dyna/m_rof/0000/asset/s1h0_m_rof0000.sgb
bg/ffxiv/sea_s1/hou/dyna/m_wal/0000/asset/s1h0_m_wal0000.sgb
bg/ffxiv/sea_s1/hou/dyna/l_rof/0000/asset/s1h0_l_rof0000.sgb
bg/ffxiv/sea_s1/hou/dyna/l_wal/0000/asset/s1h0_l_wal0000.sgb
bg/ffxiv/sea_s1/hou/dyna/s_wal/0000/asset/s1h0_s_wal0000.sgb
bgcommon/hou/dyna/s1h0/dor/0000/asset/s1h0_ca_dor0000.sgb
bgcommon/hou/common/blank/asset/com_l_blank.sgb
medium:
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000a.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000b.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000c.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000d.sgb
bg/ffxiv/sea_s1/hou/dyna/s_wal/0000/asset/s1h0_s_wal0000.sgb
bg/ffxiv/sea_s1/hou/dyna/s_rof/0000/asset/s1h0_s_rof0000.sgb
bg/ffxiv/sea_s1/hou/dyna/m_wal/0000/asset/s1h0_m_wal0000.sgb
bg/ffxiv/sea_s1/hou/dyna/m_rof/0000/asset/s1h0_m_rof0000.sgb
bgcommon/hou/dyna/s1h0/dor/0000/asset/s1h0_co_dor0000.sgb
bgcommon/hou/dyna/s1h0/wid/0000/asset/s1h0_co_wid0000.sgb
bgcommon/hou/dyna/opt/rf/0000/asset/opt_rf_m0000.sgb
bgcommon/hou/dyna/opt/wl/0000/asset/opt_wl_m0000.sgb
bgcommon/hou/dyna/opt/sg/0000/asset/opt_sg_m0000.sgb
bgcommon/hou/common/blank/asset/com_m_blank.sgb
small:
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000a.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000b.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000c.sgb
bg/ffxiv/sea_s1/hou/dyna/c_fnc/0000/asset/s1h0_f_fnc0000d.sgb
bgcommon/hou/dyna/s1h0/dor/0000/asset/s1h0_co_dor0000.sgb
bgcommon/hou/dyna/s1h0/wid/0000/asset/s1h0_co_wid0000.sgb
bgcommon/hou/dyna/opt/rf/0000/asset/opt_rf_m0000.sgb
bgcommon/hou/dyna/opt/sg/0000/asset/opt_sg_m0000.sgb
bgcommon/hou/dyna/opt/wl/0000/asset/opt_wl_m0000.sgb
bg/ffxiv/sea_s1/hou/dyna/s_wal/0000/asset/s1h0_s_wal0000.sgb
bg/ffxiv/sea_s1/hou/dyna/s_rof/0000/asset/s1h0_s_rof0000.sgb
bgcommon/hou/common/blank/asset/com_s_blank.sgb
----------------------------------------------------------------------------------------------------------
In-game text for fixture info. Might want to instead use the int in item search/ui category
Housing is 64-80 in ItemUICategory, sounds easiest. Get all rows from Item with that range,
keep track of the id, string name and stain
Exterior Fixtures
Construction Permit
Roof
Exterior Wall
Window
Door
Roof Decoration
Exterior Wall Decoration
Placard
Fence
Interior Fixtures
Interior Wall
Flooring
Ceiling Light
----------------------------------------------------------------------------------------------------------
Bg {ffxiv/sea_s1/hou/s1h1/level/s1h1} SaintCoinach.Text.XivString
Name {s1h1} SaintCoinach.Text.XivString
----------------------------------------------------------------------------------------------------------
write stuff about extra broken water meshes and house walls
also why do toti not go here anymore
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment