Lekcja pierwsza - nowy element w menu NPC

Witajcie!

Zaczniemy od czegoś prostego, będzie to dodatkowy element pokazujący się w menu po kliknięciu myszką na NPC. Napiszemy w tym celu prosty dodatek do nowego silnika, który rozszerzy domyślne menu o dodatkowy element o nazwie 'Kim jesteś?'. A tak to będzie wyglądało na żywo:

Nowy element w menu po kliknięciu na NPC

Akurat to menu pojawiło się po kliknięciu na 'Anzelma' w mieście Karka-Han. Trochę go to przerosło i schował sie pod nim, ale to nic, ważne że działa ;) Po krótkiej prezentacji efektu końcowego przejdźmy do części praktycznej poradnika.

 

Gdzie szukać kodu, który pokazuje menu ?

Do wyszukiwania kodu przydają się narzędzia takie jak WebDeveloper oraz JavascriptBeautifier (opisane w poprzednim poradniku) Zaczynamy od znalezienia pliku w którym znajduje się kod odpowiedzialny za zachowanie obiektów typu NPC (w tym także za menu, które pokazuje się po kliknięciu na tych obiektach) W tym celu logujemy się do gry (na nowy silnik) i wybieramy z menu WebDevelopera [Informacje] -> [Wyświetl Aplety JavaScript] po tej operacji powinna pokazać nam się lista plików JS dołączonych do strony, zerknijmy na http://game8.margonem.pl/js/elements.js Ze względów oszczędnościowych plik został zapisany w jednej linii (mniej wtedy zajmuje i zjada mniej transferu) przez to czyta się to jak chińsko-egipskie mazańce i będziemy potrzebować upiększacza żeby cokolwiek z tego kodu zrozumieć. Potraktujmy go więc tym narzędziem: http://jsbeautifier.org/ wynik kopiujemy do naszego ulubionego edytora i woila :)

Opis klasy NPC zawiera się w linijkach od 21 do 131 i to jest to co nas będzie interesować, żeby być jeszcze bardziej precyzyjnym oto kod, który odpowiada za budowę menu podręcznego:

//linia 79 - 108
$("#npc" + k).css({
            left: e[k].x * 32,
            top: e[k].y * 32 - 16,
            zIndex: 10 + e[k].y + ((e[k].type == 4) ? parseInt(e[k].wt) : 0)
        }).click(function (h) {
            var f = this.id.substr(3);
            if (Math.abs(g.npc[f].x - hero.x) > 1 || Math.abs(g.npc[f].y - hero.y) > 1) {
                hero.mClick(h);
                return
            }
            var d = [];
            if (g.npc[f].type == 4) {
                return
            }
            if (g.npc[f].type == 0) {
                d[0] = ["Rozmawiaj", '_g("talk&id=' + f + '")']
            }
            if (g.npc[f].type == 2 || g.npc[f].type == 3) {
                d[0] = ["Atakuj", '_g("fight&a=attack&auto=1&id=-' + f + '")']
            }
            if (g.npc[f].type == 2 || g.npc[f].type == 3) {
                d[1] = ["Walcz turowo", '_g("fight&a=attack&id=-' + f + '")']
            }
            if (g.npc[f].type == 5) {
                d[0] = [(g.npc[f].wt == 1) ? "Uruchom" : "Obejrzyj", '_g("talk&id=' + f + '")']
            }
            showMenu(g.npc[f].x * 32 + 16, g.npc[f].y * 32 + 8, d)
        }).mousedown(function (d) {
            return false
        });

I to jest dokładnie to czego potrzebujemy. Teraz będziemy musieli się wstrzelić ze swoim kodem w kod silnika tak aby każdy napotkany NPC miał taką opcję w menu :) za dobre miejsce uznałem linijkę tuż przed wywołaniem funkcji odpowiedzialnej za pokazanie menu:

            if (g.npc[f].type == 5) {
                d[0] = [(g.npc[f].wt == 1) ? "Uruchom" : "Obejrzyj", '_g("talk&id=' + f + '")']
            }
            //NASZ KOD BĘDZIE TUTAJ
            showMenu(g.npc[f].x * 32 + 16, g.npc[f].y * 32 + 8, d)

 

Jak dodać nowy element menu ?

Wiemy już gdzie wstawić kod, nie wiemy jednak co wstawić :) Można to wywnioskować po kawałku kodu odpowiedzialym za tworzenie menu. Jest tam kilka instrukcji warunkowych sprawdzających z jakim typem NPC mamy do czynienia i w zależności od tego tworzone jest odpowiednie menu.

W Margonem potworki oraz niektóre przedmioty tak jak np. skrzynka pocztowa są traktowane jako NPC. Coś co je rozróżnia to własność o nazwie 'type' którą posiada każdy obiekt NPC

if (g.npc[f].type == 2 || g.npc[f].type == 3) {
	d[0] = ["Atakuj", '_g("fight&a=attack&auto=1&id=-' + f + '")']
}
if (g.npc[f].type == 2 || g.npc[f].type == 3) {
	d[1] = ["Walcz turowo", '_g("fight&a=attack&id=-' + f + '")']
}
 

W powyższym kodzie widać sposób tworzenia menu dla NPC który jest stworkiem do atakowania, łatwo można zauważyć znane nam z gry elementy menu: 'Atakuj' i 'Walcz turowo'. Po tym kodzie można też stwierdzić, że każdy element menu jest dodawany jako osobny element tablicy, który jeszcze dodatkowo zawiera w sobie dwa elementy. Są nimi etykietka menu oraz funkcja którą wywoła kliknięcie na ten właśnie element menu. Można się domyśleć co powinniśmy teraz zrobić :) Dodajemy nowy element menu:

if (g.npc[f].type == 5) {
                d[0] = [(g.npc[f].wt == 1) ? "Uruchom" : "Obejrzyj", '_g("talk&id=' + f + '")']
            }
			d[2] = ["Kim jesteś?", 'alert("test")'];
            showMenu(g.npc[f].x * 32 + 16, g.npc[f].y * 32 + 8, d)

Teraz po kliknięciu na nasz nowy element menu powinno pokazać się coś takiego:

Taki alert jest jednak bez sensu bo po pierwsze nic nie robi a po drugie wstrzymuje wykonywanie pozostałych skryptów co powoduje restrart silnika ;) Zmienimy to więc na coś bardziej zaawansowanego. W tym celu posłużę się kilkoma fajnymi funkcjami, które zostały opisane w tym temacie na forum Margonem: opis przydatnych funkcji na nowym silniku, ja skorzystałem z mAlert() oraz message(). Co robią ? poczytajcie na forum :)

 

Dodatek: Info o NPC

Nasz prosty alert postanowiłem rozszerzyć do czegoś bardziej skomplikowanego aczkolwiek niezbyt trudnego, żeby nie zniechęcać was na samym początku :) Będzie to okienko z informacjami na temat klikniętego NPC oraz przyciskami tak/nie pod którymi będzie mała niespodzianka. Zaczynamy...

Na początek napiszemy sobie prostą funkcję która będzie przyjmowała jeden parametr - id odpowiadające klikniętemu NPC. W tej funkcji będziemy wyciągać obiekt NPC z globalnej tablicy obiektów posługując się w tym celu wcześniej wspomnianym parametrem (id). Następnie wyciągniemy z tego obiektu potrzebne informacje, złożymy to wszystko w ładnie wyglądający ciąg znaków i wyświetlimy za pomocą funkcji mAlert(). Oto kod funkcji:

myFunction = function(npcId){
	mAlert("Jestem "+g.npc[npcId].nick+"<br />Mam "+g.npc[npcId].lvl+" poziom<br /><br />Podobało się?", 2, {0:function(){message("Super! "+g.npc[npcId].nick+" Cię lubi")}, 1:function(){message("Szkoda, "+g.npc[npcId].nick+" Cie nie lubi")}})
}

W tej funkcji użyłem mAlert() wraz z callbackami które uruchamiają się po kliknięciu na tak lub nie, całość powinna wyglądać tak:

Po kliknięciu na Slina w Karka-Han i wybraniu nowego elementu z menu, ukazujesię nam coś takiego :) Mam nadzieję, że się wam podobało, wystarczy tylko podpiąć naszą fukncję pod element menu zamiast wcześniejszego alerta:

if (g.npc[f].type == 5) {
	d[0] = [(g.npc[f].wt == 1) ? "Uruchom" : "Obejrzyj", '_g("talk&id=' + f + '")']
}
d[2] = ["Kim jesteś?", 'myFunction("'+f+'")']; //nasz kod 
showMenu(g.npc[f].x * 32 + 16, g.npc[f].y * 32 + 8, d)
 

To narazie wszystko, cały dodatek możecie znaleźć tutaj jest tam cały kod, który pisany był w tym poradniku + dodatkowo kilka rzeczy kóre są niezbędne żeby dodatek działał prawidłowo po automatycznym zainstalowaniu. Dodatek można uruchomić na nowym świecie wklejając ten kod w konsoli i wciskając enter:

addon http://www.margoextend.net/install/30/npc-info-nowy-element-w-menu.user.js

Pozdrawiam i życzę miłego korzystania :)

Komentarze (78)
avatar
2010-05-07 16:47:29
Gość napisał(a):
Opis przydatnych funkcji na nowym silniku jest w dziale Zemyna, a nie wszyscy mogą tam wejść.
avatar
2010-05-07 18:22:58
igor napisał(a):
Przykładowy dodatek nawet nawet :P
avatar
2010-05-07 19:09:51
Gość napisał(a):
"Aktualnie nie ma pomocy do dodatków. Generalnie trzeba umieć jQuery. Jak ktoś nie umie, to niech nie pyta, tylko użyje Google co to jest i z czym się to je. Uruchamianie dodatków: (komendy wpisywane w konsoli) addon http//adres.dodatku - dodanie do listy dodatków nowego. adreset - usunięcie z listy wszystkich dodatków. Nie ma opcji usunięcia wybranego na razie, trzeba z tym żyć. Ale można spokojnie już dodać kilka dodatków. W razie czego w konsoli zawsze są wypisane załadowane dodatki, więc po adreset można je dodać ponownie. Jak chcecie dodać element HTML: W okienku gry: $('<div style="position:absolute; z-index:350; left:200px; top:200px">test</div>').appendTo('#centerbox'); Poza okienkiem: $('<div style="position:absolute; z-index:350">test</div>').appendTo('body'); Ładne komunikaty robimy: mAlert('treść'); mAlert('treść', 0, function(){ komendy po kliknieciu ok }); mAlert('treść', 2, [function(){ komendy po kliknieciu tak },function(){ komendy po kliknieciu nie }]); Oczywiście functiony trzeba uzupełnić, można też zamiast funkcji wkleić nazwę już zdefiniowanej. Żółte komunikaty: message('treść'); Logowanie w konsoli log('tresc') - wrzucenie czegoś do konsoli log('tresc',1) - żółte ostrzeżenie do konsoli. 2 to błąd pomarańczowy, 3 to błąd fatalny: powoduje zatrzymanie gry. Centrowanie Aby wycentrować wasz element na środku ekranu, dajemy $('jakiś element').absCenter(); Dymki(tooltipy) Ustawiamy atrybut 'tip', np. <div tip='dymek'></div> Kolory można zmieniać ustawiając <div tip='dymek' ctip='t_item'></div> - dostępne opcje to t_item, t_npc, t_other. Na razie tyle, kiedyś dopisze więcej. "
avatar
2010-05-07 22:37:25
Archie napisał(a):
Gratuluję, świetnie napisane. Powodzenia w przyszłości, stronka świetnie się zapowiada. :)
avatar
2010-05-09 15:56:34
Gość napisał(a):
niestety, ja nie mam dostępu do tamtego działu ;[ usunąłem postać przypadkowo i teraz nie moge założyć
avatar
2010-05-09 20:44:14
Trylobit2 napisał(a):
Ja mam mały problem. ;/ Ściągnąłem ten notepad++ i nie koloruje mi kodu po wklejeniu, nawet po użyciu beautifulera. Robiłem wszystko według poradnika.
avatar
2010-05-09 21:22:45
Doceluf napisał(a):
Można samemu włączyć/przestawić kolorowanie składni w zależności od wymagań. Wejdź w menu 'Język' -> 'J' -> 'JavaScript' powinno pomóc :)
avatar
2010-05-11 16:24:00
Gość napisał(a):
niewiem jak zrobić zeby pokazało sie to test
avatar
2010-05-15 13:29:06
xxheroesxx napisał(a):
Przeczytałem oba poradniki dokładnie, ale nadal nie wiem, gdzie wkleić ten mój kod... Żeby zadziałał w grze. Proszę o pomoc.
avatar
2010-06-06 07:56:28
Ererehyl napisał(a):
1.Wejdź do gry na nowym silniku. 2.Kliknij ~ 3.Wklej tam kod. Nie trudne co nie?
avatar
2010-06-06 07:57:10
Ererehyl napisał(a):
a i kliknij ENTER
avatar
2010-06-14 19:58:38
Gość napisał(a):
ja z tego prawie nic nie kapuje ;/
avatar
2010-06-14 20:06:33
Gość napisał(a):
jak zamienić tą treść z notatnika na link ??
avatar
2010-06-22 22:05:54
Gość napisał(a):
A wkleja sie te wszystkie z 700 linijek czy jedna?
avatar
2010-06-23 11:11:53
Gość napisał(a):
Zrobiłem tak jak było napisane w instrukcji, ale nie wiem gdzie to wkleić, żeby zadziałało, wklejałem wszędzie gdzie się da, i nic. Dopiero jak wkleiłem ten adres addon http://www.margoextend.net/install/30/npc-info-nowy-element-w-menu.user.js to wtedy mi zadziałało, ale naprawdę nie wiem jak zrobić, żeby zadziałało to mojego autorstwa. Proszę o pomoc.
1 2 3 4 5 6 > >>|
W sumie stron: 6
Dodaj komentarz Uwaga! Nieodpowiednie komentarze (wulgaryzmy, chamskie odzywki itp.) będą usuwane.
Zapisz