Nieoficjalna polska strona Lineage 2

Lineage 2 => Prowadzenie własnego serwera => Serwery prywatne => Poradniki => Wątek zaczęty przez: Matim w Październik 03, 2010, 05:59:04 PM

Tytuł: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: Matim w 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:

CytatgetPlayersCountInZone(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:

Cytatif (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:

Cytatif(event.equalsIgnoreCase("01"))

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

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

Cytat"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:

CytataddFirstTalkId(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łę !
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: dymek84 w 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
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: Matim w 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)
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: dymek84 w 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

Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: Matim w Listopad 03, 2010, 09:03:32 AM
Tak, rozumiem o co Ci chodzi, zrobię to może dzisiaj/jutro.
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: dymek84 w 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.
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: MartinAwakening w 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.
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: P4CZU w Marzec 13, 2012, 06:53:20 PM
Cytat: MartinAwakening w 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.

data/zones/zone.xml
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: MartinAwakening w 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
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: P4CZU w 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
Tytuł: Odp: [Poradnik] Special Gatekeeper
Wiadomość wysłana przez: MartinAwakening w 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