All about hair modding!
Anivay’s guide on hair modding. Saved from Blade & Soul Dojo before it was shut down.
This guide will be primarily done by examples with brief explanations. I will list what files and numbers I am looking at and provide the exact cursor location of where I make changes. I highly encourage you to follow along from scratch in your own hex editor
If your attempt doesn’t work, you can download the completed mod that I included to compare it to yours. I will try to list my examples from easiest to most complex.
As we’re dealing with hex editing, when I’m specifically referring to a hex number rather than a decimal number I will use hex notation (0x) before the number. A programming calculator (like the one windows has) will be really helpful for converting between hex and decimal. Remember, hex numbers count 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
Regular Hair, Hair 100+, and the Export Table — a brief summary
Hair mods only require the skeleton to work, so you can ignore the material completely
Hairs are generally defined by their object/core number formatting of: 3 characters for race, 1 character for gender, an underscore, followed by 3 digits for the identification number. (ex: JinF_001) All hair object core numbers are formatted like this in one of two ways in the skeleton UPK file: a standard complete string containing race and ID, or a split string with the race in the standard location and the number appended by a value found in the something called the Export Table. That later format of hairs is only used for hairs with IDs 100 or greater, so I refer to hairs that follow that pattern as a Hair100+ hair.
When dealing with Hair100+ and changing an accessory hat to a hair you will need to deal with the Export Table. The Export Table is what the game reads to find out what it needs to load from the file and where to find that information.
The main things that you need to know are:
— A double word is 4 pairs of hex numbers (ex: 00 00 00 00 is one double word; I’ll just call them words to keep it short)
— The word starting at 0x25 (read in little endian) will tell you the location of the start of the Export Table
— The first*** element of the Export Table points to the physics core number (e.g. string number of GonM_012_Physics)
— The last*** element of the Export Table points to the object core number (e.g. string number of GonM_012)
— The third word after the export index says what string number to look at for that property
— The fourth word after the export index controls what is appended onto the object
The fourth word is important to us because it is what makes 100+ hairs work. If you remember what I said about the format for 100+ hairs in the skeleton, they only have the race & gender in the upper part of the skeleton. What this fourth word in the export does is take the value in that place, subtract 1, and attach it to the race/gender with an underscore. For example, JinM is the object number that’s sitting by the physics number. If there is a 0x65 (101 in decimal) in the fourth word of the last element in the Export Table, it will ‘transform’ the JinM into JinM_100.
The third word is only important to us if the target core number does not have space to hold the new core number (for instance when you can’t fit JinF_027 in the place of JinF or 040022_LynF in the place of LynF_026). When we encounter this problem, we need to find a string to replace that is long enough to hold the new longer core number. Once you find the new place to put your core number, count (starting from 0) from the first string at the top of the document until you reach that point. That location number is what is stored in the third word.
To quickly find the first element of the export table (relating to physics core number) you can just Ctrl+F for the hex string FFFFFFFF (four pairs of Fs). The last element (relating object core number) will usually either be F8FFFFFF or F9FFFFFF if you want to Ctrl+F
***Do note however that these will not always be the correct positions for the object/physics cores. If something looks out of the ordinary (such as 0x00 in place of an actual value for a string location) you can dump the export table using umodel’s command dialog: umodel.exe -game=bns -list UPKNUMBER
Regular Hair to Regular Hair
Regular hair to regular hair is very standard and easy. If you’re within the same race/gender you only need to change the hair ID number in the object/physics cores.
Hair 100+ to 100+ is also pretty straightforward. Change the physics core as your normally would. To change the object core number you will need to go to the last element of the export table and change the 4th word of the element to your new hair number +1. Using your calculator in programmer mode will be very helpful for converting from decimal to hex. If your base core number is 100, punch in 101 into your calculator and it will tell you that the hex value hat you need is 0x65.
Example 2: LynF_100 (00033994) to LynF_107 (00034195)
Renamed 00034195.upk (copy) to 00033994.upk
[0x07AF] Changed Physics core from LynF_107_Physics to LynF_100_Physics
[0x1A16] In export table, changed 0x6C to 0x65
Cross-race hair works the same as usual except that you’re changing the race part of the cores as well. PLEASE NOTE that most cross-race hair swaps do not work due to different head sizes and positions between the races. From my experience the only swaps that work well most of the time are between Jin Female and Yun, but even then certain hairstyles have clipping problems. Most other race-exchanged hairs result in major clipping issues. As of now, it is unknown how to work around that problem.
When going from a hair100+ core number to a regular hair we run into the problem of the object core not being long enough to hold the new number. Lucky for us, the skeleton number is a string in the skeleton that basically serves no purpose and has no negative effect if removed or written over; not only that, but the length of the skeleton number is EXACTLY the length we need to hold a hair object core number! So. we replace the skeleton number with the new core number, change the physics core normally, in the export table change the old location of the object core number to the new location, and remove the appended value.
Example 4: GonF_001 (00002680) to GonF_110 (00037191)
Renamed 00037191.upk (copy) to 00002680.upk
[0x00BA] Changed 00037191 to GonF_001
[0x0625] Changed Physics core GonF_110_Physics to GonF_001_Physics
[0x1CBF] In export table, object index: change 0x39 to 0x03 (location of new object core, count strings from top starting at 0)
[0x1CC3] In export table, object index append: change 0x6F to 0x00
Changing a hair100+ into a regular hair is a little simpler than the other way around. You only need to remove the extra parts after the race/gender in the object core, change the physics core as normal, and then in the last element of the Export Table add the value to append (your hair number + 1)
So for whatever reason there are a couple regular hairs that are a little. weird and require a slightly different method. I will explain both; if the first method doesn’t work for your hair try the second.
The first method is basically identical to regular hair to regular hair — you just have a lot of leftover gunk you need to get rid of will nulls when you write over the old core with your base core.
Hopefully the first method worked for you, if not you have a bit more work to do. The second method requires a bit of length editing, deleting, and inserting. For whatever reason some random hairs have a secondary core number that must be used instead of the standard core number. That second core number is formatted Hair_JinF_### rather than just JinF_### and thus requires some extra length in order to fit. We will be taking that length from the ‘useless’ skeleton number.
Hair100+ to hat works very similar to Hair100+ to regular hair. The core numbers will have a lot of extra bits you want to get rid of with null.
The problem when your target is a hair and your base item is a hat is that the core number in the target skeleton does not have room to fit the base core number; ######_JinF is a lot longer than JinF_###. What we need to do is find some sacrifice string that is a) long enough to hold the long physics core number and b) does not have any negative effects when replaced. Luckily the string «bEnableBoneSpringAngular» is one of those strings that will work for us, so we’ll use that. If your file does not have that string, you will need to find another one that is at least 19 characters long and will not cause problems in game once replaced. We can use the old physics core to hold the new long object core. Since we are changing the positions of these two elements, we will need to make changes to the export table so the game can find the correct information.
There is a second way to do this that follows example 6.5 (regular hair to hat when normal method doesn’t work). This involves adjusting lengths and deleting/inserting bytes. If you feel like doing it this way go ahead, but I will not be doing another example for it in this tutorial. With this method you won’t need to touch the export table at all. Just subtract 6 bytes from the skeleton number and add 3 to the object and physics core numbers
You can think of this as a combination of «Hat to Regular Hair» and «Regular Hair to Hair100+». The problem when your target is a hair and your base item is a hat is that the core number in the target skeleton does not have room to fit the base core number; ######_JinF is a lot longer than JinF. What we need to do is find some sacrifice string that is a) long enough to hold the long physics core number and b) does not have any negative effects when replaced. Luckily the string «bEnableBoneSpringAngular» is one of those strings that will work for us, so we’ll use that. If your file does not have that string, you will need to find another one that is at least 19 characters long and will not cause problems in game once replaced. We can use the old physics core to hold the new long object core. Since we are changing the positions of these two elements, we will need to make changes to the export table so the game can find the correct information. The only extra step from Hat to Regular hair is that you need to remove the appended object core value.
Example 9: 040022_LynF (00012240) to LynF_110 (00037189)
Renamed 00037189.upk (copy) to 00012240.upk
[0x0142] Changed bEnableBoneSpringAngular to 040022_LynF_Physics (overwrite leftover characters with null)
[0x079C] Changed LynF_110_Physics to 040022_LynF (replace leftover characters with null)
[0x0D0E] In export table, Physics index: change 0x4A to 0x09 (count strings from top starting from 0) (NOTICE: 0xFFFFFFFF was not the correct element in the export table this time)
[0x1CFE] In export table, add 1 for the new object index: change 0x49 to 0x4A
[0x1D02] In export table, object index append: change 0x6E to 0x00
Blade and Soul | BnS | Пресеты, внешки, модели
Вы сделали милое личико, но знаете точно, что не будете им играть? Вас больше занимает редактор персонажей, чем сама игра? Вы кучами делаете персонажей, но не знаете куда их деть? Тогда вам сюда: https://vk.com/topic-121776092_34256199
Ваши руки созданы не для создания милых мордашек? Вы хотите, чтобы вас персонаж был похож на любимого героя или знаменитость, но у самих все через пень колоду? Или же вы настолько ленивы, что вам даже кнопку «Случайно» нажать в падлу, а с «дефолтом» бегать стрёмно? Тогда вам сюда: https://vk.com/topic-121776092_34256223
- Записи сообщества
Blade and Soul | BnS | Пресеты, внешки, модели запись закреплена
Blade and Soul | BnS | Пресеты, внешки, модели запись закреплена
Blade and Soul | BnS | Пресеты, внешки, модели запись закреплена
Скоро все сервера #BnS перейдут на новый движок UE4!
Посмотрите это видео сравнения старого и нового движка.
Одной из самых главных задач, преследуемых создателями, является сохранение текущих системных требований, чтобы все пользователи без каких-либо трудностей продолжили свое путешествие по фэнтезийному миру. Тем не менее владельцы мощных ПК смогут ощутить заметный прирост в производительности за счет более рационального использования игрой доступных ей ресурсов. Кроме того, новый движок должен устранить основные технические проблемы и качественно отразиться на стабильности клиента.
Blade & Soul
В новом обновлении «Небесный город» игрокам была добавлена более расширенная версия создания персонажа, были добавлены новые предметы!
Добавили новые престижные прически!
Добавили новые хвостики и уши для расы Лин!
Кроме этого, в игру были введены предметы на смену внешности персонажа, на смену пола, и на смену расы!
Более подробную информацию о обновлении на внешность персонажа читайте на официальном портале.
Удачных игр и побед в сражениях!