Przejdź do treści
Nieoficjalna polska strona Lineage 2

forum.lineage2.com.pl

Nieoficjalna polska strona Lineage 2

[Dzielę Pliki]Vote NPC

Zaczęty przez Matim, Matim ·

Ostatnia edycja: przez Matim
Ciekawy NPC , który może pomóc przy zdobyciu kilku głosów więcej . Otóż owy NPC biega dookoła Giran Square i prosi o Vote ( Vote czyli głosy na toplistach ) Zatrzymuje się w 4 rogach i wymawia swój tekst , zmienia położenie co 10 sec .




Tekst NPC :

http://i43.tinypic.com/2eulqxl.jpg





Html NPC : ( po naciśnięciu na NPC )

http://i39.tinypic.com/e9t274.jpg




Biegający NPC :

http://i41.tinypic.com/2u63h20.jpg




Kierunki biegu NPC :

http://i43.tinypic.com/34s5r3l.jpg




Ok , ale jeśli chce zmienić trajektorie jego ruchów ?

Odpowiedź jest bardzo prosta . Zrobienie takiego NPC jest bardzo proste do czego wykorzystamy tabele 'Walker_routes' W tabeli tej , definiujemy co dany NPC może powiedzieć lub gdzie się udać w jakich odstępach czasowych . Walker routes dla tego NPC wygląda tak :

INSERT INTO `walker_routes` (`route_id`, `npc_id`, `move_point`, `chatText`, `move_x`, `move_y`, `move_z`, `delay`, `running`) VALUES
(43, 888823, 1, 'Please ! Vote for Us now !', 82718, 149312, -3471, 10, 1),
(43, 888823, 2, 'Prosze ! Glosuj na nasz server !', 82713, 147899, -3471, 10, 1),
(43, 888823, 3, 'Please ! Vote for Us now !', 81153, 147904, -3471, 10, 1),
(43, 888823, 4, 'Prosze ! Glosuj na nasz server !', 81158, 149316, -3471, 10, 1);


Wyjaśnienie :

Cytat43
- jest to ID 'walker_routes' , czyli jeśli dodajemy nowego NPC walkera to podajemy ID wyższe o jeden niż wyżej w tabeli

Cytat888823
- w tym przypadku jest to ID NPC , do którego owy walker się odnośi

Cytat1,2,3,4
- są to kolejne ruchy , teksty - zaczynamy od 1 , dodając kolejne

Cytat'Please ! Vote for Us now !'
- tutaj podajemy jaki test ma napisać NPC

Cytat82718, 149312, -3471,
- lokacja , do której ma przejść NPC

Cytat10
- odstęp w sekundach , po których NPC wykona nową czynność ( napisze tekst lub przejdzie do innego miejsca )

Cytat1
- tu dajemy zawsze jedynke




Ok , ale jeśli chce aby NPC jedynie chodził lub tylko mówił ?

W takim wypadku w miejsce tekstu pisujemy null , czyli przykładowo :

(43, 888823, 1, 'null', 82718, 149312, -3471, 10, 1),

W tym wypadku NPC jedynie uda się do danej lokacji w odstępie 10 sekund




Ok , myślę , że wszystko jest w miarę zrozumiałe . Jeśli nie to proszę pisać w tym temacie . Co do NPC , których ruch lub to co powiedzą będzie uzależnione od różnych czynników ( np gdy ktoś uderzy NPC ) napiszę w późniejszym czasie , a więc spokojnie




Przygotował : Matim - Ja  :P

Pobierz : Click (Updated 12.07.09)

Jeżeli ktoś będzie miał błędy przy wgrywaniu pliku .sql ( a dokładnie błąd informujący o duplikacji NPC ID , powinien pozmieniać ID! ) Pliki pod L2JFree , jeśli ktoś chce to musi sobie trochę zmienić jeśli będą błędy na innych L2J'tach
Ostatnia edycja: przez Xyber #1
Mógłbyś zuploadować na inny hosting, bo ostatnio mam problemy z RS

CytatYour IP address 89.78.xx.xxx is already downloading a file. Please wait until the download is completed.

Najlepsze jest to, że nic nie ściągam ;)

I jest mały błąd w HTM masz napisane "codec" a powinno być chyba "code" :)
http://www.xyberdesign.pl
#3
Ładnie Matim, ale dlaczego taki spam ? nie lepiej delay 240 ?  :elf_5_3:

//offtop gdzie mozna te emoty dostac? ^^
Lineage 2 Enigma is coming, most epic polish server ever!
http://img84.imageshack.us/img84/6715/d70164730000b8e1.png
#4
To tylko przykładowy NPC  :D Kto chce to sobie zmieni ( napisałem jak w pierwszym poście ) Ale chyba faktycznie masz racje , że trochę za często to dałem  :P
#5
Takiego często-mówiącego, to do jaila i niech regulamin krzyczy :D
Prepare for unforeseen consequences...
#7
Nom , prosto takiego zrobić ( taki chyba jest na Passion , prawda ? ) W x/y/z wstawić null i robić teksty . Dobry pomysł  :D
Ostatnia edycja: przez Matim #8
Matim sry za offtop, ale Ty masz takiego neta w domu ? Btw. taki npc co wsadza do jaila to fany pomysł, oj fajny ;d

/Matim - ano taki  :D
Sebal- Life ...

▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬

SHUT UP AND ENJOY THE MUSIC

▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬
#9
Mhm. Żeby nie było, że to mój pomysł. W każdym razie strasznie wkurza ;)
Prepare for unforeseen consequences...
Ostatnia edycja: przez Maniac #14
Postaw npcki w miastach beda krzyczec zeby glosowali w kazdym z miast
@ Matim z tego co ja pamietam ten npc ktorego tutaj przedstawiles z " Coded by Matim " zostal dawno temu napisany przez kogos z for l2jfree, nice credit stealing  :dw_3_2:
package ai.individual;

import java.util.Calendar;
import java.util.List;
import javolution.util.FastList;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.instancemanager.TownManager;
import net.sf.l2j.gameserver.model.actor.L2Character;
import net.sf.l2j.gameserver.model.actor.L2Npc;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.model.zone.type.L2TownZone;
import net.sf.l2j.gameserver.network.clientpackets.Say2;
import net.sf.l2j.gameserver.network.serverpackets.NpcSay;
import net.sf.l2j.util.Rnd;

public class VoteNpc extends Quest

{
private static final int VoteNpc_GLUDIO = 9999991; // Gludio
private static final int VoteNpc_DION = 9999992; // Dion
private static final int VoteNpc_GIRAN = 9999993; // Giran
private static final int VoteNpc_OREN = 9999994; // Oren
private static final int VoteNpc_ADEN = 9999995; // Aden
private static final int VoteNpc_INNADRIL = 9999996; // Innadril
private static final int VoteNpc_GODDARD = 9999997; // Goddard
private static final int VoteNpc_RUNE = 9999998; // Rune
private static final int VoteNpc_SCHUTTGART = 9999999; // Schuttgart

List<L2Npc> _npcs = new FastList<L2Npc>();

private static final String[] dlog =
{
"Vote for our server!"
};

public VoteNpc(int questId, String name, String descr)
{
super(questId, name, descr);

// Register Events
addEventId(VoteNpc_GLUDIO, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_DION, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_GIRAN, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_OREN, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_ADEN, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_INNADRIL, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_GODDARD, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_RUNE, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_SCHUTTGART, Quest.QuestEventType.ON_SPAWN);

scheduleBroadcast();
}

@Override
public String onSpawn(L2Npc npc)
{
if (!_npcs.contains(npc))
_npcs.add(npc);

return super.onSpawn(npc);
}

private void scheduleBroadcast()
{
Calendar cal = Calendar.getInstance();
int tfhTime = cal.get(Calendar.HOUR_OF_DAY);
long currTime = tfhTime*3600000 + cal.get(Calendar.MINUTE)*60000 +
cal.get(Calendar.SECOND)*1000 + cal.get(Calendar.MILLISECOND);

long nextTime = 0;
if ((tfhTime + 1) > 24) nextTime = 6900000;
else if (cal.get(Calendar.MINUTE) < 55) nextTime = tfhTime*3600000 + 3300000;
else nextTime = (tfhTime + 1)*3600000 + 3300000;
long initial = nextTime-currTime;
ThreadPoolManager.getInstance().
scheduleGeneralAtFixedRate(new BroadcastToZone(), initial, 3600000L);

}

public static void main(String[] args)

    {
new VoteNpc(-1,"VoteNpc","ai");

    }

class BroadcastToZone implements Runnable
{
@Override
public void run()
{
for (L2Npc npc : _npcs)
{
if (npc != null)
{
if (Config.DEBUG)
_log.info("Broadcasting VoteNpc Message to Zone");

int dg = Rnd.get(0, 2);

NpcSay ns = new NpcSay(npc.getObjectId(), Say2.SHOUT, npc.getNpcId(), dlog[dg]);

L2TownZone town = TownManager.getTown(npc.getX(), npc.getY(), npc.getZ());
{
if (town.getCharactersInside() != null && !town.getCharactersInside().isEmpty())

{
for (L2Character obj : town.getCharactersInside().values())
{
if (obj == null)
continue;
if (obj instanceof L2PcInstance)
obj.sendPacket(ns);
}
}
}
}
}
}
}
}
Lineage 2 Enigma is coming, most epic polish server ever!
http://img84.imageshack.us/img84/6715/d70164730000b8e1.png
#15
Cytat: Maniac ·
Postaw npcki w miastach beda krzyczec zeby glosowali w kazdym z miast
@ Matim z tego co ja pamietam ten npc ktorego tutaj przedstawiles z " Coded by Matim " zostal dawno temu napisany przez kogos z for l2jfree, nice credit stealing  :dw_3_2:
package ai.individual;

import java.util.Calendar;
import java.util.List;
import javolution.util.FastList;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.instancemanager.TownManager;
import net.sf.l2j.gameserver.model.actor.L2Character;
import net.sf.l2j.gameserver.model.actor.L2Npc;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.model.zone.type.L2TownZone;
import net.sf.l2j.gameserver.network.clientpackets.Say2;
import net.sf.l2j.gameserver.network.serverpackets.NpcSay;
import net.sf.l2j.util.Rnd;

public class VoteNpc extends Quest

{
private static final int VoteNpc_GLUDIO = 9999991; // Gludio
private static final int VoteNpc_DION = 9999992; // Dion
private static final int VoteNpc_GIRAN = 9999993; // Giran
private static final int VoteNpc_OREN = 9999994; // Oren
private static final int VoteNpc_ADEN = 9999995; // Aden
private static final int VoteNpc_INNADRIL = 9999996; // Innadril
private static final int VoteNpc_GODDARD = 9999997; // Goddard
private static final int VoteNpc_RUNE = 9999998; // Rune
private static final int VoteNpc_SCHUTTGART = 9999999; // Schuttgart

List<L2Npc> _npcs = new FastList<L2Npc>();

private static final String[] dlog =
{
"Vote for our server!"
};

public VoteNpc(int questId, String name, String descr)
{
super(questId, name, descr);

// Register Events
addEventId(VoteNpc_GLUDIO, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_DION, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_GIRAN, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_OREN, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_ADEN, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_INNADRIL, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_GODDARD, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_RUNE, Quest.QuestEventType.ON_SPAWN);
addEventId(VoteNpc_SCHUTTGART, Quest.QuestEventType.ON_SPAWN);

scheduleBroadcast();
}

@Override
public String onSpawn(L2Npc npc)
{
if (!_npcs.contains(npc))
_npcs.add(npc);

return super.onSpawn(npc);
}

private void scheduleBroadcast()
{
Calendar cal = Calendar.getInstance();
int tfhTime = cal.get(Calendar.HOUR_OF_DAY);
long currTime = tfhTime*3600000 + cal.get(Calendar.MINUTE)*60000 +
cal.get(Calendar.SECOND)*1000 + cal.get(Calendar.MILLISECOND);

long nextTime = 0;
if ((tfhTime + 1) > 24) nextTime = 6900000;
else if (cal.get(Calendar.MINUTE) < 55) nextTime = tfhTime*3600000 + 3300000;
else nextTime = (tfhTime + 1)*3600000 + 3300000;
long initial = nextTime-currTime;
ThreadPoolManager.getInstance().
scheduleGeneralAtFixedRate(new BroadcastToZone(), initial, 3600000L);

}

public static void main(String[] args)

    {
new VoteNpc(-1,"VoteNpc","ai");

    }

class BroadcastToZone implements Runnable
{
@Override
public void run()
{
for (L2Npc npc : _npcs)
{
if (npc != null)
{
if (Config.DEBUG)
_log.info("Broadcasting VoteNpc Message to Zone");

int dg = Rnd.get(0, 2);

NpcSay ns = new NpcSay(npc.getObjectId(), Say2.SHOUT, npc.getNpcId(), dlog[dg]);

L2TownZone town = TownManager.getTown(npc.getX(), npc.getY(), npc.getZ());
{
if (town.getCharactersInside() != null && !town.getCharactersInside().isEmpty())

{
for (L2Character obj : town.getCharactersInside().values())
{
if (obj == null)
continue;
if (obj instanceof L2PcInstance)
obj.sendPacket(ns);
}
}
}
}
}
}
}
}


Jak zwykle poinformowany Maniaczek ;) To nie jest zrobione w javie jako AI lub Instancja, to jest jedynie walker routes czy jak tam to zwą.
#17
Lol Maniac, nie mam do Ciebie słów powoli. Kopiować 1 htmla i kilka linijek sql, tak to daje mega satysfakcje, jeżeli coś jest podobne do czegoś innego to od razu jest skopiowane? (zwłaszcza takie gówno, które zrobić może każdy)

#22
Maniac bez urazy ale żeś się przy* :oops: obudził z tym marudzeniem o "coded by matim"... ten npc tu od marca wisi a nagle Ci to teraz przeszkadza... równie dobrze możesz iść na plac zabaw i oskarżyć dzieci o plagiat bo bałwana zrobiły...
WWW.KOMPANIA-OW.XORG.PL
ASG to nie tylko zabawa- to sposób życia
#23
Cytat: Maniac ·
:*

^^

Cytat: Veandil ·
Maniac bez urazy ale żeś się przy* :oops: obudził z tym marudzeniem o "coded by matim"... ten npc tu od marca wisi a nagle Ci to teraz przeszkadza... równie dobrze możesz iść na plac zabaw i oskarżyć dzieci o plagiat bo bałwana zrobiły...

Ty to wszystko zepsujesz, a taka drame mialem