Tak, to jest możliwe. To co chcesz zrobić to tzw. mod server-side, czyli działający po stronie serwera. Jest to jednak trochę skomplikowane, ale wykonalne.
Wymagania:-> WinRFA lub inny program do obsługi archiwów .rfa (WinRFA jest częścią
oficjalnych mod tools do Bf1942)
-> Battlecraft lub inny program do edycji map (zakładam BC)
-> Podstawowa umiejętność obsługi Battlecrafta (lub Twojego edytora)
-> Podstawowa znajomość skryptów .con bardzo pomoże, ale nie jest konieczna.
->
Konieczna jest Ostrożność i Czytanie ze Zrozumieniem! - Niektóre kroki, źle wykonane mogą trwale uszkodzić instalację Bf1942 i konieczny będzie reinstall. Szczególnie niebezpieczne kroki są specjalnie oznaczone, ale zawsze zachowaj ostrożność.
Teoria:Paczki .rfa: Każda mapa w BF jest spakowanym archiwum .rfa (myśl o nich jak o plikach .zip) Żeby dokonać edycji, należy rozpakować mapę, dokonać zmian w plikach, a następnie spakować z powrotem, dokładnie w taki sam sposób w jaki była, ale pod trochę inną nazwą, żeby serwer potraktował ją jako patch. Z tym najwięcej osób ma problemy, więc ostrożnie.
Patche: Na przestrzeni lat, twórcy poprawili niektóre mapy dodając do nich patche, które istnieją w katalogu levels jako pliki <Nazwa Mapy>_00X.rfa. Więc za każdym razem jak gra wczytuje mapę, najpierw ładuje <Nazwa Mapy>.rfa, a potem podmienia w pamięci parę plików na to co znajdzie w patchu z najniższym numerem (zamiast X). Jeśli znajdzie kolejny patch z wyższym numerem to też go ładuje do pamięci. Oznacza to, że aby w pełni wypakować mapę, musimy wypakować plik bazowy (np. Midway.rfa) a następnie
w to samo miejsce wypakować kolejne patche. Bardzo ważna tu jest kolejność - zacząć od bazy, potem patch 000, potem 001 itd.
Ponadto, ponieważ nie chcemy podmieniać mapy midway.rfa w katalogu levels na serwerze, nasze zmiany zapiszemy jako kolejny patch. Ponieważ do swoich patchy DICE używa numerów 000 - 003, możemy zapisać nasz patch jako midway_004.rfa (dla pewności niektórzy używają bardzo wysokich numerów, np. 099)
ObjectSpawner: Generalnie poprzez "dodanie pojazdu" rozumiemy dodanie do mapy nowego obiektu typu
ObjectSpawner który to będzie spawnować nasz pojazd.
ObjectSpawner tworzony jest tylko raz, a następnie jego
instancje są umieszczane w różnych miejscach na mapie. To znaczy, że za wszystkie Shermany stojące na Aberdeen odpowiedzialny jest tylko jeden
ObjectSpawner. (tzn. każdy Sherman na mapie jest tworzony przez jedną
instancję obiektu
ObjectSpawner). Do tego ten sam
ObjectSpawner używany jest do spawnowania Panzer IV w bazach Axis. To dlatego, że każda
instancja obiektu
ObjectSpawner ma ustawioną flagę, którą ma "obserwować". Jeśli flaga jest pod kontrolą drużyny 1 (Axis) to ma spawnować Panzer IV, a jeśli pod kontrolą drużyny 2 (Allied) to ma spawnować Shermana. Nazwy spawnowanych pojazdów są ustawiane podczas definicji
ObjectSpawner. Możliwe jest też pominięcie flagi i ustawienie drużyny której pojazd ma się spawnować - w ten sposób dana
instancja ObjectSpawner będzie spawnować ciągle ten sam pojazd bez względu na to kto kontroluje którą flagę i czy w ogóle. Tak też działają spawnery okrętów na Midway - nie są przypisane do żadnej flagi i zawsze spawnują ten sam pojazd. (ten sam Spawner spawnuje PrinceOW i Yamato: na mapie są dwie
instancje tego spawnera, jedna ma ustawioną drużynę 2 (Allied), druga 1 (Axis))
Problem "Nic Nowego": Kolejny problem polega na tym, że po stronie serwera nie można dodać nowych rzeczy, a jedynie przerabiać istniejące. Z tego faktu wynika nieprzyjemny wniosek, że na każdy nowy Spawner pojazdu który dodamy do mapy musimy zmodyfikować istniejący, a to może usunąć ogromną część pojazdów z mapy.
Na szczęście jest na to metoda, którą mało kto zna: Spawner może spawnować różne pojazdy dla drużyn 1 i 2. Co ciekawe, możemy go zmodyfikować i przypisać jeszcze inne pojazdy dla drużyn 3, 4 i następnych! Oczywiście te drużyny nie istnieją, bo w Bf1942 mamy tylko dwie drużyny, ale Spawnera to nie obchodzi - możemy przerobić Spawner PinceOW/Yamato, dopisać Mustanga jako pojazd dla trzeciej drużyny i umieścić instancję tego Spawnera na lotnisku z przypisaną drużyną 3 - i to będzie nam spawnować Mustanga na lotnisku, bez utraty pancerników. (Zauważ że to samo w sobie jest złym pomysłem, ponieważ Spawner pancerników ma zablokowaną drużynę - instrukcja jak to obejść jest zawarta w Procedurze.) Ten problem Cię nie dotyczy, jeśli obiekt który chcesz dodać ma już swój Spawner na mapie (np. chcesz dodać drugiego Yamato do Midway) - wtedy po prostu dodajesz nową
instancję tego Spawnera z ustawioną drużyną 1 (Axis), co jest zupełnie dozwolone.
Dodam jeszcze, że nie mam pojęcia ile drużyn może "zapamiętać" dany Spawner - testowałem na 4 i działało, ale podejrzewam że można i jeszcze więcej.
Procedura: (zakłada, że znasz Teorię)1. Zrób kopię zapasową swojej mapy i zapisz ją gdzieś poza folderem Battlefield 1942. Ten krok jest bardzo ważny, ponieważ Battlecraft i WinRFA nie są do końca stabilne i czasami "niszczą" mapy. Uruchom WinRFA.
2. W WinRFA kliknij File->Open .rfa, przejdź do folderu Battlefield 1942/mods/bf1942/archives/bf1942/levels i wybierz swoją mapę.
3. Kliknij Extract->All i wybierz pulpit lub inny łatwo dostępny katalog (w tym poradniku zakładam Pulpit). W tymże miejscu pojawi się folder Bf1942.
Kroki 2-3 powtórz dla wszystkich patchy dla Midway, koniecznie zaczynając od najmniejszego (000). Koniecznie rozpakuj wszystkie do tego samego katalogu! Jeśli nie rozumiesz tego, przeczytaj o patchach w Teorii powyżej.
4.
Zamknij WinRFA. Otwórz swoją mapę w BC. Dodaj wszystkie spawnery pojazdów tak jak normalnie, ale
nic nie zapisuj.
5. Otwórz Notatnik (albo weź kartkę papieru i coś do pisania, jeśli wolisz), kliknij dwukrotnie na każdy nowy pojazd który dodałeś i zapisz jego nazwę, pozycję (trzy okienka oznaczone "Pos") i orientację (trzy okienka oznaczone "Rot"). Ważne jest żeby przepisać liczby z tych okienek dokładnie w takiej kolejności (od lewej do prawej) jak się pokazują. Jeśli chcesz przypisać spawn do danej flagi, zapisz też jej dokładną nazwę (zauważ, że nie możesz tego zrobić, jeśli dodajesz pojazdy których normalnie nie ma na tej mapie - flaga nigdy nie zostanie przejęta przez drużynę 3 i wyżej!) Ostateczny zapis dla każdego pojazdu powinien wyglądać w tym stylu:
Willys
pos: 2160.68/33.77/1938.51
rot: 12.81/-0.01/-0.73
flaga: The_Airfield
Mustang
pos: 2100.75/24.33/2137.29
rot: 180/0/0
Pamiętaj o zapisaniu każdego pojazdu, bo jak zamkniesz BC to stracisz dostęp do tych danych!
6. Otwórz katalog Bf1942 na pulpicie, w środku będzie levels/<nazwa mapy>. Jeśli istnieją, skasuj katalogi ObjectLightmaps i Textures - serwer nie potrzebuje tych danych do działania, podobnie jak wielu innych plików które pozostały w katalogu. Reszta nie zajmuje jednak aż tyle miejsca, więc dla uproszczenia nie będziemy się jej pozbywać.
7.
Wykonaj ten krok tylko jeśli chcesz dodać pojazdy, które normalnie nie występują na mapie:Przejdź do katalogu Conquest, otwórz notatnikiem lub innym edytorem tekstu plik ObjectSpawnTemplates.con. Tu są
tworzone wszystkie Spawnery pojazdów.
Wybierz dowolny Spawner (ja wybiorę spawner pancerników, którego użyłem jako przykładu.) Do tego Spawnera trzeba dopisać nowe pojazdy. Każde przypisanie pojazdu do drużyny w definicji Spawnera wygląda tak:
Kod:
ObjectTemplate.setObjectTemplate <nr drużyny> <nazwa pojazdu>
rem przykład:
ObjectTemplate.setObjectTemplate 1 panzeriv
ObjectTemplate.setObjectTemplate 2 sherman
Nazwa pojazdu nie zawsze jest oczywista. Jeśli nie masz pewności, możesz szybko wejść na serwer i sfragować kogoś z przeciwnej drużyny przy użyciu tego pojazdu - dokładna nazwa zostanie podana w nawiasie kwadratowym. Możesz też otworzyć i przejrzeć plik Battlefield 1942/mods/bf1942/archives/objects.rfa - tam są tworzone wszystkie dostępne pojazdy.
Zakładając, że chcę dodać Mustanga do mapy, do definicji Spawnera dodaję linijkę:
(Na razie nic nie dodawaj, tylko obserwuj, bo zaraz okaże się, że [specjalnie] popełniłem błąd)Kod:
ObjectTemplate.setObjectTemplate 3 mustang
Całość wygląda tak:
Kod:
ObjectTemplate.create ObjectSpawner battleshipSpawner
ObjectTemplate.setObjectTemplate 2 princeow
ObjectTemplate.setObjectTemplate 1 yamato
ObjectTemplate.setObjectTemplate 3 mustang
ObjectTemplate.SpawnDelay 300
ObjectTemplate.SpawnDelayAtStart 0
ObjectTemplate.TimeToLive 120
ObjectTemplate.Distance 200
ObjectTemplate.teamOnVehicle 1
Zwróć uwagę na ostatnią linijkę -
ObjectTemplate.teamOnVehicle 1 - oznacza ona, że Twój pojazd będzie zablokowany, tzn. tylko gracz z ustawionej drużyny będzie mógł do niego wsiąść. To nam psuje zabawę, bo jeśli zrespimy Mustanga z drużyną 3, to będzie mógł do niego wejść tylko gracz z drużyny 3, a ponieważ taka drużyna nie istnieje, nikt nie będzie mógł wsiąść do mustanga! Aby to naprawić, możemy usunąć ostatnią linijkę, ale to sprawi że PrinceOW i Yamato zostaną odblokowane, czyli Amerykanin będzie mógł ukraść Yamato, a Japończyk PrinceOW! W takiej sytuacji jedynym wyjściem jest użyć innego Spawnera - np. na Midway Defguny nie są zablokowane, więc możemy do nich doczepić naszego nieszczęsnego Mustanga:
(tym razem kod jest poprawny)Kod:
ObjectTemplate.create ObjectSpawner DefgunSpawner
ObjectTemplate.setObjectTemplate 2 Defgun
ObjectTemplate.setObjectTemplate 1 Defgun
ObjectTemplate.setObjectTemplate 3 mustang
ObjectTemplate.MinSpawnDelay 40
ObjectTemplate.MaxSpawnDelay 80
ObjectTemplate.SpawnDelayAtStart 0
ObjectTemplate.TimeToLive 45
ObjectTemplate.Distance 40
ObjectTemplate.DamageWhenLost 10
Zauważ, że na razie nie podajemy pozycji ani orientacji - te dane podamy dopiero przy tworzeniu
instancji naszego Spawnera.
Zapisz sobie nazwę Spawnera (w moim przypadku będzie to DefgunSpawner) i numer drużyny do której pojazd został przypisany (w moim przypadku - 3) i zapisz plik.
8. (ten krok jest już dla wszystkich)Otwórz plik ObjectSpawns.con - tutaj tworzone są
instancje naszych Spawnerów.
Taką instancję możemy stworzyć na dwa sposoby: przypisując flagę do naszej
instancji spawnera lub przypisując doń drużynę. Różnice między podejściami są wyjaśnione w Teorii.
a) podajemy drużynę:
(dodając nowe pojazdy do mapy możemy użyć tylko tego podejścia!)Kod:
Object.create <Nazwa Spawnera>
Object.absolutePosition <Pozycja Pojazdu>
Object.rotation <Orientacja Pojazdu>
Object.setteam <Drużyna Spawnera>
b) podajemy flagę:
Kod:
Object.create <Nazwa Spawnera>
Object.absolutePosition <Pozycja Pojazdu>
Object.rotation <Orientacja Pojazdu>
Object.setOSId <ID Flagi>
Pozycja i orientacja pojazdu to te liczby które zapisaliśmy w BC, oddzielone od siebie slashami (znak '/')
Niestety, ID Flagi nie można odczytać z poziomu Battlecrafta, ale możemy łatwo je znaleźć w pliku ControlPointTemplates.con w tym samym folderze. Oto co nas interesuje w definicji Flagi:
Kod:
ObjectTemplate.create ControlPoint <Nazwa Flagi>
[ ... ]
ObjectTemplate.objectSpawnerId <ID Flagi>
[ ... ]
Wystarczy znaleźć Nazwę Flagi którą wcześniej zapisaliśmy i odczytać jej ID.
Dla przykładu dodam Spawner Mustanga na lotnisku (który utworzyłem w poprzednim kroku)
Kod:
Object.create DefgunSpawner
Object.absolutePosition 2100.75/24.33/2137.29
Object.rotation 180/0/0
Object.setteam 3
Oraz dodam dodatkowy spawner Jeepa na lotnisku: (będzie to Willys albo BlackMedal w zależności od tego kto przejął lotnisko)
Kod:
Object.create ScoutCarSpawner
Object.absolutePosition 2160.68/33.77/1938.51
Object.rotation 12.81/-0.01/-0.73
Object.setOSId 4
Jeśli opuściliśmy krok 7, nie wiemy skąd się wziął
ScoutCarSpawner - to jest nazwa Spawnera którą możemy odczytać w pliku ObjectSpawnTemplates.con W definicji każdego Spawnera zwracamy uwagę na:
Kod:
ObjectTemplate.create ObjectSpawner <Nazwa Spawnera>
ObjectTemplate.setObjectTemplate 2 <Pojazd Dla Drużyny Allied>
ObjectTemplate.setObjectTemplate 1 <Pojazd Dla Drużyny Axis>
[ ... ]
Po nazwach pojazdów odnajdujemy interesujący nas Spawner i zapisujemy jego nazwę.
Jest to trochę niewygodne, ponieważ musimy odczytać informacje z dwóch innych plików aby dodać choćby jedną
instancję Spawnera do mapy. A to i tak jeszcze nie wszystko:
Po dodaniu wszystkich instancji które mieliśmy zapisane na kartce lub w notatniku, zapisujemy ObjectSpawns.con9. Jeśli Battlecraft jest nadal otwarty, koniecznie go zamknij,
nic nie zapisuj!10. (Uwaga, tu łatwo popełnić kilka błędów!) Otwieramy WinRFA, wybieramy Pack->Directory, wybieramy katalog Bf1942 na pulpicie. (
Nie katalog levels ani Midway w środku, tylko koniecznie "bazowy" katalog Bf1942!) W kolejnym dialogu idziemy do katalogu Battlefield 1942/mods/bf1942/archives/bf1942/levels i zapisujemy nasze dzieło jako midway_004.rfa (
Nie podmieniaj "bazowej" mapy midway! Zapisz jako nowy plik midway_004.rfa, koniecznie wszystko z małych liter! Małe litery są bardzo ważne, jeśli serwer chodzi na Linuxie - jeśli w nazwie mapy będą wielkie litery, serwer zawiesi się przy starcie)
11. Spróbuj uruchomić Battlefielda i (przez Multiplay->Create Game->Start Local) zobacz czy mapa się wczytuje i czy wszystko wygląda jak należy.
-> Jeśli BF w ogóle się nie uruchamia, to znaczy że mapa została źle spakowana w kroku 10 (np. zaznaczony został katalog levels albo midway zamiast katalogu bf1942)
-> Jeśli BF wywala do pulpitu podczas ładowania mapy, to znaczy że mamy poważny błąd w skryptach - w takiej sytuacji najelepiej usuwać po jednej instancji Spawnera którą dodaliśmy żeby zobaczyć w której jest bład. Można też ściągnąć wersję Debug Battlefielda i uruchomić ją w oknie: czasem tuż przed "kraksą" wyskakuje komunikat o błędzie wyjaśniający co zrobiliśmy źle.
-> Po każdej kolejnej poprawce wprowadzonej w plikach w katalogu na Pulpicie, musimy spakować mapę jeszcze raz. Podczas zapisu trzeba bardzo uważać żeby przypadkiem nie podmienić bazowego pliku Midway ani żadnego z oficjalnych patchy - to może nam zupełnie zniszczyć instalację battlefielda!
12. Kiedy mod jest gotowy, koniecznie przenieś plik midway_004.rfa gdzieś poza katalog BF - inaczej nie dasz rady wejść na serwer z Midway, wyskoczy błąd "Data Differs From Server".
13. Upewnij się że twój plik z modem ma same małe litery w nazwie.
14. Wgraj go na serwer do katalogu mods/bf1942/archives/bf1942/levels/
15. Upewnij się, że serwer ma
wyłączony Content Check - jeśli nie, wyskoczy błąd "Data Differs From Server!"
15. Zrestartuj serwer Bf1942 żeby "zauważył" patch i zmianę ustawień, a następnie wgraj mapę. Gotowe!
PS: Jeśli chcesz zobaczyć przykład tej techniki, ściągnij sobie
mój mod do Tank Arena, który dodaje nowe czołgi do mapy. Tank Arena jest częścią zestawu map
Tank Mappack 2009 udostępnionego przez
Ligę BF.