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:
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
//ID Naszego NPC
private final static int npcId = 80001;
4. Funkcja zwracająca ilośc graczy z danej strefy- tworzymy nową funkcje (void)
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 @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:
@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:
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łę !
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
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)
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
Tak, rozumiem o co Ci chodzi, zrobię to może dzisiaj/jutro.
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.
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.
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
<?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
mi to w ogóle nie dziala cos, jebie sie z godzine z tym i dalej mi nie robi peace zone ;D
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