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:
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:
if (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:
if(event.equalsIgnoreCase("01"))
- Chodzi o to, który przycisk został naciśnięty
- Nasz przycisk ma właśnie taką "etykietę" (
01)
"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:
addFirstTalkId(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łę !