Witaj
Gość

Wątek: [Poradnik] Special Gatekeeper  (Przeczytany 4145 razy)

  • *******
  • Wiadomości: 1092

  • Pochwał: 22

[Poradnik] Special Gatekeeper
« dnia: Październik 03, 2010, 05:59:04 pm »
Witam, w tym krótkim poradniku opiszę jak w prosty sposób możemy stworzyc Gatekeepera, który będzie pokazywał ilośc graczy znajdujących się w danej strefie (Zone)

1. Krok pierwszy, tworzymy zwykłego NPC, dajmy na to z ID: 80001



2. Następnie stworzymy funkcje dla tego Gatekeepera.

- wchodzimy do folderu: \gameserver\data\scripts\custom\

- tworzymy nowy folder, dajmy na to CustomGK

- Następnie tworzymy nową klasę (jeżeli nie robisz tego w eclipse, stwórz po prostu nowy plik *.java)

- Plik ten nazywamy CustomGK.java



3. Naszego NPC'a stworzymy na zasadzie Questu

- Otwórz wcześniej stworzony plik CustomGK.java

- Następnie umieszczamy taki oto kod:

Kod: (java) [Zaznacz]
package custom.CustomGK;

import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;
import com.l2jserver.gameserver.gatekeeper.Gatekeeper;

public class CustomGK extends Quest
{
public CustomGK(int questId, String name, String descr)
{
super(questId, name, descr);
}

public static void main(String[] args)
{
new CustomGK(-1, "CustomGK", "custom");
}
}

- Wiele tutaj tłumaczyc nie trzeba, konstruktor + metoda main.

- Teraz stworzymy zmienną, w której podamy ID naszego NPC

Kod: (java) [Zaznacz]
    //ID Naszego NPC
private final static int npcId = 80001;



4. Funkcja zwracająca ilośc graczy z danej strefy

- tworzymy nową funkcje (void)

Kod: (java) [Zaznacz]
public static int getPlayersCountInZone(int zoneId)
{
int i = 0;
for (L2ZoneType zone : ZoneManager.getInstance().getAllZones())
if (zone.getId() == zoneId)
{
for (L2Character character : zone.getCharactersInside().values())
if (character instanceof L2PcInstance)
i++;
return i;
}
return -1;
}

- Funkcja ta jest bardzo prosta, używamy jej w ten sposób:

Cytuj
getPlayersCountInZone(int zoneID)

- Gdzie w miejsce int zoneID wpisujemy ID lokacji, np Coliseum (Zone ID: 10400)

- W ten sposób funkcja ta zwróci nam ilośc graczy aktualnie tam się znajdujących

- Warto zwrócic uwagę na to iż sprawdzamy ilośc L2Character (czyli np NPC/moobów/graczy)

- Dla tego następnie sprawdzamy Typ, sprawdzamy czy jest to gracz:

Cytuj
               if (char instanceof L2PcInstance)
                  i++;

- Co daje pewnośc, że liczyc będzie tylko graczy (L2PcInstance)



5. HTML naszego Gatekeepera

Kod: (java) [Zaznacz]
    @Override
    public String onFirstTalk(L2Npc npc, L2PcInstance player)
    {
        String htmltext = "";
        QuestState qs = player.getQuestState("CustomGK");
        if (qs == null)
            qs = newQuestState(player);

        htmltext = "<html><body><br><center>" 
        +"<a action=\"bypass -h Quest CustomGK 01\">\"Coliseum\"</a> "
        +getPlayersCountInZone(10400)+"<br>" +"</center></body></html>";

        return htmltext;
    }

- Odpowiada to za wyświetlenie okienka po rozpoczęciu rozmowy z NPC

- W oknie pojawi się przycisk o nazwie "Coliseum" + ilośc graczy znajdujących się tam



6. Funkcja Teleportu

- Teraz pozostaje dodac funkcje do przycisku z naszego GK

- Uczynimy to dzięki tej funkcji:

Kod: (java) [Zaznacz]
    @Override
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        String htmltext = "";
       
        if(event.equalsIgnoreCase("01"))
        {
            player.teleToLocation(147451, 46728, -3410); //Tutaj wpisujemy X/Y/Z
            player.sendMessage("Zostales przeteleportowany pomyslnie!");
        }       
        else
        {
            htmltext = "Blad, sprawdz ponownie HTML!";
        }
        return htmltext;
    }

- Objaśnienie:

Cytuj
if(event.equalsIgnoreCase("01"))

- Chodzi o to, który przycisk został naciśnięty

- Nasz przycisk ma właśnie taką "etykietę" (01)

Cytuj
"bypass -h Quest CustomGK 01\"

- Dzięki temu gdy naciśniemy przycisk, zostaniemy przeteleportowani do Coliseum



7. Rejestracja funkcji

- Ostatni krok, rejestrujemy te funkcje

- Do "ciała" konstruktora CustomGK dodajemy trzy linijki:

Cytuj
        addFirstTalkId(npcId);
        addStartNpc(npcId);
        addTalkId(npcId;



8. Wersja Finalna

- całośc powinna wyglądac mniej więcej tak:

Kod: (java) [Zaznacz]
package custom.CustomGK;

import com.l2jserver.gameserver.instancemanager.ZoneManager;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;
import com.l2jserver.gameserver.model.zone.L2ZoneType;

/**
 * Customowy Gatekeeper, ktory podaje ilosc gracz
 * znajdujacych sie w danej lokacji (ZoneID).<br>
 * ZoneID znajdziesz w data/zones/zone.xml
 */
public class CustomGK extends Quest
{
    // ID naszego NPC
    private final static int npcId = 93000;
   
    // Konstruktor naszego NPC
    public CustomGK(int questId, String name, String descr)
    {
        super(questId, name, descr);
        addFirstTalkId(npcId);
        addStartNpc(npcId);
        addTalkId(npcId);
    }
   
    @Override
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        String htmltext = "";
       
        // "01" czyli "etykieta" naszego przycisku
        if(event.equalsIgnoreCase("01"))
        {
            player.teleToLocation(147451, 46728, -3410); //Tutaj wpisujemy X/Y/Z
            player.sendMessage("Zostales przeteleportowany pomyslnie!");
        }       
        else
        {
            htmltext = "Blad, sprawdz ponownie HTML!";
        }
        return htmltext;
    }

    @Override
    public String onFirstTalk(L2Npc npc, L2PcInstance player)
    {
        String htmltext = "";
        QuestState qs = player.getQuestState("CustomGK");
        if (qs == null)
            qs = newQuestState(player);

        htmltext = "<html><body><br><center>"
        +"<a action=\"bypass -h Quest CustomGK 01\">\"Giran Arena\"</a> "+ getPlayersCountInZone(10014) + "<br>"
        +"</center></body></html>";

        return htmltext;
    }
   
    /**
     * @param zoneId
     * @return ilosc graczy w danej lokacji.<br>
     * (Podajemy Zone ID, ktore mozna odszukac w zone.xml
     */
    public static int getPlayersCountInZone(int zoneId)
    {
        int i = 0;
        for (L2ZoneType zone : ZoneManager.getInstance().getAllZones())
            if (zone.getId() == zoneId)
            {
                // Dla wszystkich "characters" w danej lokacji
                for (L2Character character : zone.getCharactersInside().values())
                   
                    // Sprawdzamy Typ, czyli sprawdzenie czy character jest GRACZEM
                    if (character instanceof L2PcInstance)
                        i++;
                return i;
            }
        return -1;
    }
   
    public static void main(String[] args)
    {
        new CustomGK(-1, "CustomGK", "custom");
    }
}



Gotowe, teraz tylko dodajmy linijkę do Scripts.cfg i to wszystko.

Ps, mogła zdażyc się gdzieś jakas drobna pomyłka.

Myślę, że tłumaczenie jak dodawac kolejne teleporty jest zbędne.

Jeśli ktoś ma jakieś pytania, piszcie tutaj.


/Naito -- Autor postu otrzymał pochwałę !
« Ostatnia zmiana: Październik 03, 2010, 07:03:30 pm wysłana przez Naito »


  • Wiadomości: 13

  • Pochwał: 0

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #1 dnia: Listopad 01, 2010, 11:46:35 pm »
Witam mam pytanie czy dało by rade przerobić troszkę ten skrypt aby można było go edytować w HTML. Tak jak normalnego gk + ilość graczy w danej "zone" próbowałem ale za każdym razem wychodzi mi jakiś błąd

dodałem to

{
String htmltext = "";

if (event.equalsIgnoreCase("01"))
{
htmltext = "01.htm";
}

w custom/quest/CustomGK utworzyłem 01.htm

wpisałem w nim

<html><body>CustomGK<br>


<a action="bypass -h Quest CustomGK 03">tele 03</a><br>

</body></html>
tylko nie wiem jak do HTML dodać ile jest graczy
mało się jeszcze znam proszę o pomoc


  • *******
  • Wiadomości: 1092

  • Pochwał: 22

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #2 dnia: Listopad 02, 2010, 08:29:55 pm »
Mógłbyś przerobic całego GK i np zrobić nową instancje NPC dziedziczącą po L2Teleporter, lub po prostu zmodyfikować L2Telepolter'a i np użyć funkcji "replace" (aby np %players1% zamienić na liczbę ludzi znajdujących się w zone z ID 1)


  • Wiadomości: 13

  • Pochwał: 0

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #3 dnia: Listopad 02, 2010, 09:44:51 pm »
ehh  :P mało co zrozumiałem ponieważ jestem :noob: moja przygoda z takim czymś kończy się na edytowaniu scryptów w jythonie gdybyś mógł mi jakoś podpowiedzieć jak to zrobić najłatwiejsza metoda to był bym wdzięczny, jeżeli Ci się nie chce to spoko zrozumiem.

Chciałbym aby było linki do podstron na głównej stronie i dopiero na podstronach działał scrypt np:

--



kingdoms--Giran
              --Aden
              --goddart--fog  <-- tu ilosc graczy
                            --mos  <-- ilosc graczy
pvp zone--Hellbound <-- ilosc graczy



  • *******
  • Wiadomości: 1092

  • Pochwał: 22

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #4 dnia: Listopad 03, 2010, 09:03:32 am »
Tak, rozumiem o co Ci chodzi, zrobię to może dzisiaj/jutro.


  • Wiadomości: 13

  • Pochwał: 0

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #5 dnia: Listopad 06, 2010, 03:02:40 pm »
Tak sobie myślałem ze tak naprawdę lepiej zostawić info o platerach tylko na farm zonach wiec zacząłem testować.
w normalnym gk oddale farm zone i wpisałem bypass do questa ale za nic nie chciał mi się pojawić spis ten który otworzyłem w skrypcie.

robię tak jak jest w innych skryptach i bypass z HTML i nic klikam i tylko okienko znika bez żadnego błędu.


  • Wiadomości: 22

  • Pochwał: 0

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #6 dnia: Marzec 13, 2012, 04:56:05 pm »
Panowie a jak sprawdzic id danej zone? W plikach freya/H5 nie ma tabel w bazie ani nic a chcialbym dodac id zone do gk , prosze o pomoc.


  • Wiadomości: 181

  • Pochwał: 7

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #7 dnia: Marzec 13, 2012, 06:53:20 pm »
Panowie a jak sprawdzic id danej zone? W plikach freya/H5 nie ma tabel w bazie ani nic a chcialbym dodac id zone do gk , prosze o pomoc.

data/zones/zone.xml


  • Wiadomości: 22

  • Pochwał: 0

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #8 dnia: Marzec 13, 2012, 07:27:22 pm »
<?xml version="1.0" encoding="UTF-8"?>
<list enabled="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="zones.xsd">
<!-- Monster Race Track -->
<zone name="dion_monster_race1" type="DerbyTrackZone" shape="NPoly" minZ="-3652" maxZ="-3452"> <!-- [20_23] -->
<node X="11714" Y="181568" />
<node X="14406" Y="181571" />
<node X="14405" Y="182673" />
<node X="11714" Y="182673" />
</zone>
<zone name="dion_monster_race2" type="DerbyTrackZone" shape="NPoly" minZ="-3610" maxZ="-3410"> <!-- [20_23] -->
<node X="13309" Y="181324" />
<node X="14061" Y="181324" />
<node X="14061" Y="181610" />
<node X="13309" Y="181610" />
</zone>
<zone name="dion_monster_race3" type="DerbyTrackZone" shape="NPoly" minZ="-3608" maxZ="-3408"> <!-- [20_23] -->
<node X="13559" Y="182641" />
<node X="14073" Y="182640" />
<node X="14073" Y="182919" />
<node X="13560" Y="182918" />
</zone>
<zone name="dion_monster_race4" type="DerbyTrackZone" shape="NPoly" minZ="-3612" maxZ="-3412"> <!-- [20_23] -->
<node X="12196" Y="182662" />
<node X="12447" Y="182663" />
<node X="12447" Y="182766" />
<node X="12197" Y="182766" />
</zone>
<zone name="dion_monster_race5" type="DerbyTrackZone" shape="NPoly" minZ="-3624" maxZ="-3424"> <!-- [20_23] -->
<node X="11706" Y="182774" />
<node X="13194" Y="182769" />
<node X="13194" Y="183006" />
<node X="11701" Y="183017" />
</zone>
<zone name="dion_monster_race6" type="DerbyTrackZone" shape="NPoly" minZ="-3616" maxZ="-3416"> <!-- [20_23] -->
<node X="11701" Y="184017" />
<node X="13188" Y="184011" />
<node X="13194" Y="184265" />
<node X="11701" Y="184260" />
</zone>
<zone name="dion_monster_race7" type="DerbyTrackZone" shape="NPoly" minZ="-3620" maxZ="-3420"> <!-- [20_23] -->
<node X="11697" Y="183013" />
<node X="11945" Y="183019" />
<node X="11940" Y="184015" />
<node X="11697" Y="184015" />
</zone>
<zone name="dion_monster_race8" type="DerbyTrackZone" shape="NPoly" minZ="-3624" maxZ="-3424"> <!-- [20_23] -->
<node X="12945" Y="183013" />
<node X="13193" Y="183008" />
<node X="13193" Y="184009" />
<node X="12945" Y="184009" />
</zone>

<zone name="Seed of Annihilation 1" id="60006" type="EffectZone" shape="NPoly" minZ="-10700" maxZ="-10100">
<stat name="maxDynamicSkillCount" val="1" />
<stat name="showDangerIcon" val="false" />
<stat name="initialDelay" val="1000" />
<stat name="reuse" val="3000" />
<node X="-180000" Y="183000" />
<node X="-178300" Y="184666" />
<node X="-173000" Y="184666" />
<node X="-173000" Y="174500" />
<node X="-187350" Y="174500" />
<node X="-187350" Y="184666" />
<node X="-182000" Y="184666" />
<node X="-180500" Y="183000" />
</zone>
<zone name="Seed of Annihilation 2" id="60007" type="EffectZone" shape="NPoly" minZ="-15900" maxZ="-14950">
<stat name="maxDynamicSkillCount" val="1" />
<stat name="showDangerIcon" val="false" />
<stat name="initialDelay" val="1000" />
<stat name="reuse" val="3000" />
<node X="-180000" Y="182500" />
<node X="-178800" Y="183500" />
<node X="-176500" Y="183500" />
<node X="-176500" Y="187000" />
<node X="-173000" Y="187000" />
<node X="-173000" Y="175000" />
<node X="-187500" Y="175000" />
<node X="-187500" Y="187600" />
<node X="-183500" Y="187600" />
<node X="-183500" Y="183500" />
<node X="-181000" Y="183500" />
<node X="-180500" Y="182500" />
</zone>
<zone name="Seed of Annihilation 3" id="60008" type="EffectZone" shape="NPoly" minZ="-12850" maxZ="-10800">
<stat name="maxDynamicSkillCount" val="1" />
<stat name="showDangerIcon" val="false" />
<stat name="initialDelay" val="1000" />
<stat name="reuse" val="3000" />
<node X="-212800" Y="182800" />
<node X="-211000" Y="185000" />
<node X="-205000" Y="185000" />
<node X="-205000" Y="172000" />
<node X="-221000" Y="172000" />
<node X="-221000" Y="187000" />
<node X="-216000" Y="187000" />
<node X="-213500" Y="182800" />
</zone>

    <!-- Pailaka Injured Dragon. No exit zones for mob walls -->
    <zone id="200001" type="ScriptZone" shape="NPoly" minZ="-3500" maxZ="-2000">
<node X="117769" Y="-46202" />
<node X="117828" Y="-46590" />
<node X="121923" Y="-46364" />
<node X="121763" Y="-44674" />
</zone>
    <zone id="200002" type="ScriptZone" shape="NPoly" minZ="-3500" maxZ="-2000">
<node X="115970" Y="-45694" />
<node X="115620" Y="-46220" />
<node X="115593" Y="-46683" />
<node X="116477" Y="-47716" />
<node X="115839" Y="-46610" />
<node X="115819" Y="-46203" />
</zone>
    <zone id="200003" type="ScriptZone" shape="NPoly" minZ="-3500" maxZ="-2000">
<node X="116346" Y="-49927" />
<node X="115202" Y="-50560" />
<node X="115330" Y="-50608" />
<node X="116347" Y="-50083" />
</zone>
    <zone id="200004" type="ScriptZone" shape="NPoly" minZ="-3500" maxZ="-2000">
<node X="117275" Y="-51185" />
<node X="116018" Y="-51776" />
<node X="116278" Y="-52213" />
<node X="117526" Y="-51052" />
</zone>
    <zone id="200005" type="ScriptZone" shape="NPoly" minZ="-3500" maxZ="-2000">
<node X="111137" Y="-43445" />
<node X="111187" Y="-44394" />
<node X="111392" Y="-44275" />
<node X="111355" Y="-43370" />
</zone>
    <zone id="200006" type="ScriptZone" shape="NPoly" minZ="-3000" maxZ="-1500">
<node X="108768" Y="-45613" />
<node X="109882" Y="-47555" />
<node X="110229" Y="-47049" />
<node X="108917" Y="-45580" />
</zone>
    <zone id="200007" type="ScriptZone" shape="NPoly" minZ="-3500" maxZ="-2000">
<node X="115979" Y="-55112" />
<node X="115753" Y="-56598" />
<node X="116242" Y="-56532" />
<node X="116211" Y="-55042" />
</zone>
    <zone id="200008" type="ScriptZone" shape="NPoly" minZ="-3500" maxZ="-2000">
<node X="108467" Y="-40835" />
<node X="108533" Y="-41590" />
<node X="108666" Y="-41584" />
<node X="108623" Y="-40839" />
</zone>
    <zone id="200009" type="ScriptZone" shape="NPoly" minZ="-2500" maxZ="-1500">
    <node X="110456" Y="-39399" />
    <node X="109835" Y="-39410" />
    <node X="109830" Y="-39550" />
    <node X="110457" Y="-39540" />
</zone>

<!-- (vertices, min Z & Max Z are estimated) -->
<zone name="Den of Evil 1" type="EffectZone" shape="Cylinder" minZ="-2300" maxZ="-2100" rad="750">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="74313" Y="-116888" />
</zone>
<zone name="Den of Evil 2" type="EffectZone" shape="Cylinder" minZ="-2400" maxZ="-2200" rad="850">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="63170" Y="-106621" />
</zone>
<zone name="Den of Evil 3" type="EffectZone" shape="Cylinder" minZ="-1200" maxZ="-1000" rad="1200">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="68030" Y="-107150" />
</zone>
<zone name="Den of Evil 4" type="EffectZone" shape="Cylinder" minZ="-3100" maxZ="-2900" rad="1200">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="62351" Y="-117376" />
</zone>
<zone name="Den of Evil 5" type="EffectZone" shape="Cylinder" minZ="-2200" maxZ="-2000" rad="1200">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="68100" Y="-116006" />
</zone>
<zone name="Den of Evil 6" type="EffectZone" shape="Cylinder" minZ="-2600" maxZ="-2400" rad="1200">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="69911" Y="-118790" />
</zone>
<zone name="Den of Evil 7" type="EffectZone" shape="Cylinder" minZ="-3000" maxZ="-2800" rad="1200">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="67520" Y="-122211" />
</zone>
<zone name="Den of Evil 8" type="EffectZone" shape="Cylinder" minZ="-3100" maxZ="-2900" rad="1500">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="74325" Y="-121296" />
</zone>
<zone name="Den of Evil 9" type="EffectZone" shape="Cylinder" minZ="-3100" maxZ="-2850" rad="1200">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="70788" Y="-125554" />
</zone>
<zone name="Den of Evil 10" type="EffectZone" shape="Cylinder" minZ="-3200" maxZ="-3000" rad="1200">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="76155" Y="-127355" />
</zone>
<zone name="Den of Evil 11" type="EffectZone" shape="Cylinder" minZ="-3400" maxZ="-3200" rad="750">
<stat name="reuse" val="9000" />
<stat name="targetClass" val="L2Character" />
<node X="71543" Y="-128820" />
</zone>
</list>

Tak wygląda zone.xml ale jak dodac nową zone jak np <zone name="Den of Evil 11" jeżeli wpiszę blablabla to mam
ZoneData: Bad data for zone: 301895 in file: zones.xml Więc nie wiem jakie jest id i nie wiem jak mam wpisac do skryptu ;/ a bazy na H5 nie ma więc nie wiem jakie ostatnie id , bo teraz coś tam przydziela samo id niby
« Ostatnia zmiana: Marzec 13, 2012, 07:30:27 pm wysłana przez MartinAwakening »


  • Wiadomości: 181

  • Pochwał: 7

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #9 dnia: Marzec 13, 2012, 10:09:48 pm »
mi to w ogóle nie dziala cos, jebie sie z godzine z tym i dalej mi nie robi peace zone ;D


  • Wiadomości: 22

  • Pochwał: 0

Odp: [Poradnik] Special Gatekeeper
« Odpowiedź #10 dnia: Marzec 14, 2012, 07:06:42 am »
No widzisz jak ja sobie nazwe mhm nie wiem costamzone , dodam wszystko to mam bad data zone cos tam w konsoli nie rozumiem tego , a niby samo dodaje id itp bo widac z bledzie tym baddatazone na koncu id nadane