Tematem przewodnim jest umieszczanie nowych obiektów w Items.xml - najlepiej to zrobić z jakimś przykładem, a że umieszczenie przeciwpancernej koszulki było by nudne to o czymś wymagającym większej pracy czyli jak wrzucić nową broń.
Zaczniemy od Items.xml
Plik składa się z wielu sekcji (wielu znaczy 1028) - każda zaczyna się <ITEM> i kończy </ITEM>. Możemy edytować tu część parametrów przedmiotów lub dodawać własne. Dodawanie można zrobić na 2 sposoby - zastępując obiekty "Nada", lub dodając nowe na końcu pliku. Trzeba tu wspomnieć że każdy przedmiot ma swój 'uiIndex' i przedmioty muszą być poukładane w pliku w kolejności rosnącej tego parametru - jeśli będzie przerwa w numerowaniu, np. po uiIndex 9 mamy uiIndex 11, to gra się zawiesi. Jeżeli dwa przedmioty będą miały ten sam uiIndex to gra się zawiesi, jeśli będzie zła kolejność np. najpierw 9 potem 8, to... gra się zawiesi.
Obiektów "Nada" jest około setki i w większości spełniają rolę odstępu - 'pustych' uiIndex tak by można było w przyszłości umieścić tu ekwipunek który przeważnie jest poumieszczany grupami (np. amunicja do granatników blisko siebie itp). Jednak niektóre specjalnie są "Nada" więc najbezpieczniej jest wykonać to drugą metodą.
Jako że robimy broń, ułatwimy sobie trochę życie i skopiujemy najpierw istniejącą - .50 Beowulf Rifle i umieścimy ją na końcu, zmieniając uiIndex na odpowiedni, w tym wypadku 1029. Zmieniamy krótką i długą nazwę broni, opis, oraz nazwę i opis u Bobby Ray'a (z lenistwa identyczny z tym ogólnym).
Kod:
<ITEM>
<uiIndex>1029</uiIndex>
<szItemName>Invader</szItemName>
<szLongItemName>Mk XIb Invader</szLongItemName>
<szItemDesc>Powerfull assault rifle manufactured under license by Fieldhausen Arms.</szItemDesc>
<szBRName>Mk XIb Invader</szBRName>
<szBRDesc>Powerfull assault rifle manufactured under license by Fieldhausen Arms.</szBRDesc>
</ITEM>
<uiIndex>1029</uiIndex>
<szItemName>Invader</szItemName>
<szLongItemName>Mk XIb Invader</szLongItemName>
<szItemDesc>Powerfull assault rifle manufactured under license by Fieldhausen Arms.</szItemDesc>
<szBRName>Mk XIb Invader</szBRName>
<szBRDesc>Powerfull assault rifle manufactured under license by Fieldhausen Arms.</szBRDesc>
</ITEM>
Teraz pora na 'usItemClass' - pozostawiamy na '2' ale oto krótki spis wszystkich klas:
2 = Broń palna (wszystko co strzela wliczając w to strzałki, minirakiety, a nawet jednorazowe wyrzutnie się tu zaliczają)
4 = Broń biała tnąca (noże itp.)
8 = Noże do rzucania
16 = Wyrzutnie (granatniki, wyrzutnie rakiet - te ładowane)
64 = Rzucane obiekty nie będące bronią (kamienie...)
128 = Broń biała tępa (Kastet, łom...)
256 = Rzucane lub wystrzeliwane ładunki wybuchowe (granaty, amunicja do granatników, rakiety)
512 = Bomby (ale również amunicja do moździerzy)
1024 = Magazynki
2048 = Pancerz
4096 = Apteczki (również zestawy PP)
8192 = inne zestawy bojowe
32768 = 'Face Items'
65536 = Klucze
268435456 = różne przedmioty (wszystko co nie pasuje powyżej)
536870912 = pieniądze (nie tylko banknoty, ale również portfele, bryłki złota etc.)
Teraz pora na 'ubClassIndex' - tu się zaczynają schody bo trzeba edytować inne pliki xml w zależności co robimy (weapons.xml, armours.xml etc.). Obecnie mamy tu '760' (gdyż kopiowaliśmy istniejącą broń), oznacza to że kod odnosi się do pliku Weapons.xml (ustawiliśmy klasę jako '2') do uiIndex 760 w tym pliku. Zmieniamy na 1029 - takiego czegoś nie ma w Weapons.xml i trzeba będzie tam to umieścić, ale opiszę to nieco niżej.
Przechodzimy do 'ubGraphicNum' i zmieniamy grafikę na taką jak ma FN SCAR-H czyli 246
'ubWeight' podnosimy do 71 (czyli 7.1kg no cóż będzie dobre, ale ciężkie
) 'usPrice' podnosimy do 6000 ($)
'ubCoolnes' damy 10 bo to bardzo fajna broń
'bReliability' 4 ... niech będzie niezawodny.
'bRepairEase' zmieniamy na -4 bo pewnie nie łatwo się naprawia
'BR_ROF' ... co by tu wpisać... powiedzmy 600 - to chyba tylko informacja u Bobby Raya i innego wpływu nie ma na grę.
Resztę zostawiamy jak jest, zresztą opcje są chyba dość czytelne.
Pora na inne pliki:
Otwieramy Weapons.xml, szukamy uiIndex 760 i kopiujemy cały fragment kodu od <WEAPONS> do </WEAPONS> po czym wklejamy na końcu pliku Weapons.xml i zmieniamy uiIndex na 1029 - tym razem nie musimy się martwić że nie ma 1028 bo tu mogą być odstępy dopóki zachowana jest kolejność.
Po zmianie wygląda to tak:
Kod:
<WEAPON>
<uiIndex>1029</uiIndex>
<szWeaponName>Mk XIb Invader</szWeaponName>
<ubWeaponClass>3</ubWeaponClass>
<ubWeaponType>6</ubWeaponType>
<ubCalibre>38</ubCalibre>
<ubReadyTime>3</ubReadyTime>
<ubShotsPer4Turns>13</ubShotsPer4Turns>
<ubShotsPerBurst>3</ubShotsPerBurst>
<ubBurstPenalty>7</ubBurstPenalty>
<ubBulletSpeed>23</ubBulletSpeed>
<ubImpact>40</ubImpact>
<ubDeadliness>38</ubDeadliness>
<bAccuracy>5</bAccuracy>
<ubMagSize>20</ubMagSize>
<usRange>500</usRange>
<usReloadDelay>200</usReloadDelay>
<BurstAniDelay>50</BurstAniDelay>
<ubAttackVolume>85</ubAttackVolume>
<ubHitVolume>7</ubHitVolume>
<sSound>420</sSound>
<sBurstSound>39</sBurstSound>
<sSilencedBurstSound>111</sSilencedBurstSound>
<sReloadSound>102</sReloadSound>
<sLocknLoadSound>108</sLocknLoadSound>
<SilencedSound>156</SilencedSound>
<bBurstAP>3</bBurstAP>
<bAutofireShotsPerFiveAP>3</bAutofireShotsPerFiveAP>
<APsToReload>4</APsToReload>
<SwapClips>1</SwapClips>
<MaxDistForMessyDeath>9</MaxDistForMessyDeath>
<AutoPenalty>7</AutoPenalty>
<NoSemiAuto>0</NoSemiAuto>
<APsToReloadManually>0</APsToReloadManually>
<ManualReloadSound>476</ManualReloadSound>
</WEAPON>
<uiIndex>1029</uiIndex>
<szWeaponName>Mk XIb Invader</szWeaponName>
<ubWeaponClass>3</ubWeaponClass>
<ubWeaponType>6</ubWeaponType>
<ubCalibre>38</ubCalibre>
<ubReadyTime>3</ubReadyTime>
<ubShotsPer4Turns>13</ubShotsPer4Turns>
<ubShotsPerBurst>3</ubShotsPerBurst>
<ubBurstPenalty>7</ubBurstPenalty>
<ubBulletSpeed>23</ubBulletSpeed>
<ubImpact>40</ubImpact>
<ubDeadliness>38</ubDeadliness>
<bAccuracy>5</bAccuracy>
<ubMagSize>20</ubMagSize>
<usRange>500</usRange>
<usReloadDelay>200</usReloadDelay>
<BurstAniDelay>50</BurstAniDelay>
<ubAttackVolume>85</ubAttackVolume>
<ubHitVolume>7</ubHitVolume>
<sSound>420</sSound>
<sBurstSound>39</sBurstSound>
<sSilencedBurstSound>111</sSilencedBurstSound>
<sReloadSound>102</sReloadSound>
<sLocknLoadSound>108</sLocknLoadSound>
<SilencedSound>156</SilencedSound>
<bBurstAP>3</bBurstAP>
<bAutofireShotsPerFiveAP>3</bAutofireShotsPerFiveAP>
<APsToReload>4</APsToReload>
<SwapClips>1</SwapClips>
<MaxDistForMessyDeath>9</MaxDistForMessyDeath>
<AutoPenalty>7</AutoPenalty>
<NoSemiAuto>0</NoSemiAuto>
<APsToReloadManually>0</APsToReloadManually>
<ManualReloadSound>476</ManualReloadSound>
</WEAPON>
Oznacza kolejno:
Id
Nazwę
Klasę broni (0 - NOGUNCLASS; 1 - HANDGUNCLASS; 2 - SMGCLASS; 3 - RIFLECLASS; 4 - MGCLASS; 5 - SHOTGUNCLASS; 6 - KNIFECLASS; 7 - MONSTERCLASS)
Typ broni (0 - NOT_GUN; 1 - GUN_PISTOL; 2 - GUN_M_PISTOL; 3 - GUN_SMG; 4 - GUN_RIFLE; 5 - GUN_SN_RIFLE; 6 - GUN_AS_RIFLE; 7 - GUN_LMG; 8 - GUN_SHOTGUN)
ubCalibre - Kaliber - 38 oznacza .50 Beowulf produkcji Alexander Arms
ubReadyTime - Ilość punktów akcji potrzebna by przygotować broń do strzału.
ubShotsPer4Turns - Szybkostrzelność broni dla pojedynczego strzału
(warto tu zapodać 'tabelkę' starwalker'a:
S4T__AP
_4___22
_5___18
_6___15
_7___13
_8___11
_9___10
10____9
11____8
12____7
13____7
14____6
15____6
16____6
17____5
18____5
19____5
20____4
21____4
22____4
23____4
24____4)
ubShotsPerBurst - Ilość kul podczas serii
ubBurstPenalty - kara do każdej kuli po pierwszej przy strzale z serii
ubBulletSpeed - szybkość z jaką kula leci
ubImpact - obrażenia zadawane przez broń
ubDeadliness - 'zabójczość' broni - najemnicy mogą się skarżyć jeśli za niska
bAccuracy - bonus do celności przy użyciu tej broni
ubMagSize - pojemność magazynka - tu pojawia się kolejny problem. Jeśli podasz tu wielkość magazynka która nie istnieje (tak jak u mnie - Alexander Arms nie produkuje takich magazynków - największe to 10, a nawet takich nie ma w grze) to gra się zwiesi, więc musisz utworzyć nowy w Magazines.xml, o czym później.
usRange - maksymalny zasięg broni
usReloadDelay - prędkość przeładowania w RT.
ubAttackVolume - hałaśliwość broni
ubHitVolume - głośność uderzenia kuli
sSound - dźwięk dla pojedynczego strzału
sBurstSound - dźwięk dla serii
sReloadSound - dźwięk przeładowania
sLocknLoadSound - używany przy 'autoresolve'
bBurstAP - koszt punktowy serii
bAutofireShotsPerFiveAP - ilość kul przy ogniu ciągłym na każde 5 PA
APsToReload - koszt punktowy wymiany magazynka
SwapClips - rodzaj wymiany magazynka: 1 to normalna zamiana, 0 to jak w strzelbach, czyli dokładanie kolejnych naboi
MaxDistForMessyDeath - maksymalna odległość na jakiej broń może wywołać specjalną animację (headshot etc).
AutoPenalty - karny modyfikator dla serii
NoSemiAuto - broń ma tylko tryb automatyczny
APsToReloadManually - jeśli większe od zera broń jest powtarzalna - czyli trzeba ręcznie przeładować po każdym strzale.
ManualReloadSound - dźwięk dla ręcznego przeładowania.
Jako że nasza broń ma magazynek nie występujący w grze, pora zając się nim.
Otwieramy Magazines.xml... Nasze szczęście polega na tym że amunicja .50 Beowulf jest ostatnia. Dodając nowe magazynki, muszą one być koło pozostały o tym samym kalibrze, następnie troszcząc się o wielkości (najpierw np. wszystkie magazynki 9x19 po 8 naboi, potem wszystkie 9x19 po 15 itd), pamiętając jednoczesnie by uiIndex był w kolejności, czyli nowy magazynek po uiIndex 3 będzie miał uiIndex 4, a więc ten który jest ponim trzeba przemianować na '5' i tak dalej aż do ostatniego... a jest ich w sumie 276 (!) - masakra.
My dodajemy do ostatniej grupy więc to łatwizna, wystarczy pod koniec dokleić:
Kod:
<MAGAZINE>
<uiIndex>277</uiIndex>
<ubCalibre>38</ubCalibre>
<ubMagSize>20</ubMagSize>
<ubAmmoType>1</ubAmmoType>
</MAGAZINE>
<MAGAZINE>
<uiIndex>278</uiIndex>
<ubCalibre>38</ubCalibre>
<ubMagSize>20</ubMagSize>
<ubAmmoType>2</ubAmmoType>
</MAGAZINE>
<uiIndex>277</uiIndex>
<ubCalibre>38</ubCalibre>
<ubMagSize>20</ubMagSize>
<ubAmmoType>1</ubAmmoType>
</MAGAZINE>
<MAGAZINE>
<uiIndex>278</uiIndex>
<ubCalibre>38</ubCalibre>
<ubMagSize>20</ubMagSize>
<ubAmmoType>2</ubAmmoType>
</MAGAZINE>
Jak widać mamy tu ID, numer kalibru, wielkośc magazynka i typ amunicji. Możliwe typy to:
0 = Normal (ball)
1 = Hollow Point
2 = Armor Piercing
3 = Extra Armor Piercing
4 = Buckshot
5 = Unused...
6 = Unused...
7 = Monster Spit
8 = Knife Damage (ignores armor)
9 = High Explosive Minirockets
10 = High Explosive Armor Piercing Minirockets
11 = Tranquilizer
12 = Flame
13 = AET (Armor Piercing + Hollow Point)
14 = Glaser (Extra Hollow Point)
15 = Tracer
16 = Armor Piercing Tracer
17 = Match
18 = Armor Piercing Match
19 = Cold Ball
20 = Cold Hollow Point
21 = Cold Armor Piercing
22 = Cold Extra Armor Piercing
23 = Cold Glaser for small caliber ammo
24 = Cold Glaser for large caliber ammo
25 = Lockbusting shells
26 = Depleted Uranium
To tyle, jednak nie zrobiliśmy jeszcze przedmiotu magazynka więc wracamy do Items.xml
Odnajdujemy '.50 Beowulf 7' (wersja HP i AP są obok siebie - 555 i 556) i kopiujemy na koniec, zmieniając uiIndex na 1030 oraz 1031, oraz poprawiając nazwy, opisy, ubClassIndex, wagę, cenę i takie tam.
Kod:
<uiIndex>1030</uiIndex>
<szItemName>.50 Beowulf 20</szItemName>
<szLongItemName>.50 Beowulf Magazine, 20</szLongItemName>
<szItemDesc>A 20-round FMJ clip for the Invader AR</szItemDesc>
<szBRName>.50 Beowulf 20</szBRName>
<szBRDesc>20 rounds of the highpowered .50 Beowulf ammo, just the thing for stopping vehicles.</szBRDesc>
<usItemClass>1024</usItemClass>
<ubClassIndex>278</ubClassIndex>
<ubCursor>0</ubCursor>
<bSoundType>0</bSoundType>
<ubGraphicType>1</ubGraphicType>
<ubGraphicNum>515</ubGraphicNum>
<ubWeight>6</ubWeight>
<ubPerPocket>4</ubPerPocket>
<usPrice>360</usPrice>
<szItemName>.50 Beowulf 20</szItemName>
<szLongItemName>.50 Beowulf Magazine, 20</szLongItemName>
<szItemDesc>A 20-round FMJ clip for the Invader AR</szItemDesc>
<szBRName>.50 Beowulf 20</szBRName>
<szBRDesc>20 rounds of the highpowered .50 Beowulf ammo, just the thing for stopping vehicles.</szBRDesc>
<usItemClass>1024</usItemClass>
<ubClassIndex>278</ubClassIndex>
<ubCursor>0</ubCursor>
<bSoundType>0</bSoundType>
<ubGraphicType>1</ubGraphicType>
<ubGraphicNum>515</ubGraphicNum>
<ubWeight>6</ubWeight>
<ubPerPocket>4</ubPerPocket>
<usPrice>360</usPrice>
Zasadniczo to koniec - broń działa itd, jeżeli gramy od nowa to powinna się posegregować normalnie u Bobby Raya, jeżeli używamy save'a sprzed zmiany, nowa broń/przedmioty będzie na samym początku lub końcu (u mnie jest na początku, ale niektórzy zgłaszali na BPF że wrzuciło im na koniec i się 'zaklikają' na śmierć). Oczywiście najpierw trzeba poczekać do 9:00 by Bobby odświeżył swój zapas broni

EDIT: zapomniałem - to nie wszystko - trzeba jeszcze edytować plik 'Attachments.xml' i dopisać nową broń do wszystkich dodatków jakie chcemy by były montowane na broni.





. wow!