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 :(https://forum.lineage2.com.pl/proxy.php?request=http%3A%2F%2Fi43.tinypic.com%2F2eulqxl.jpg&hash=f1e7245bed725cde4a286cad8e8eab7e393851fb)
Html NPC : ( po naciśnięciu na NPC )
(https://forum.lineage2.com.pl/proxy.php?request=http%3A%2F%2Fi39.tinypic.com%2Fe9t274.jpg&hash=f95920ff63f8fda1406d9d0b95e969b3cfb50606)
Biegający NPC :(https://forum.lineage2.com.pl/proxy.php?request=http%3A%2F%2Fi41.tinypic.com%2F2u63h20.jpg&hash=189a7d9aa02127315709fb503596c630c1314788)
Kierunki biegu NPC :(https://forum.lineage2.com.pl/proxy.php?request=http%3A%2F%2Fi43.tinypic.com%2F34s5r3l.jpg&hash=e94314d93184468d58630f47db3c3897bc36573d)
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) (http://rapidshare.com/files/254830905/Vote_NPC_Updated.rar)
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
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" :)
Proszę : Click (http://www.speedyshare.com/settings.php?id=873604598&idh=74e91a20997da6ebf490aba022824286)
/edit . Ok dzięki za poprawkę :P
Ładnie Matim, ale dlaczego taki spam ? nie lepiej delay 240 ? :elf_5_3:
//offtop gdzie mozna te emoty dostac? ^^
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
Takiego często-mówiącego, to do jaila i niech regulamin krzyczy :D
Cytat: Soul w Kwiecień 02, 2009, 05:26:12 PM
Takiego często-mówiącego, to do jaila i niech regulamin krzyczy :D
Haha genialne xD
Nom , prosto takiego zrobić ( taki chyba jest na Passion , prawda ? ) W x/y/z wstawić null i robić teksty . Dobry pomysł :D
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
Mhm. Żeby nie było, że to mój pomysł. W każdym razie strasznie wkurza ;)
Link poprawiony , brakowało linijek w pliku .sql .
Pobierz (http://rapidshare.com/files/254830905/Vote_NPC_Updated.rar)
Proszę o nowy link ( tylko nie Rapid ) do pliku
Pobierz z hotfile.com (http://hotfile.com/dl/25421226/70804b6/Vote_NPC_Updated.rar.html)
lub
Pobierz z depositfiles.com (http://depositfiles.com/en/files/7uq82kwdi)
lub
Pobierz z sendspace.com (http://www.sendspace.com/file/pqpyt0)
:)
a da sie zrobić żeby taki npc przeskakiwał z miasta do miasta, w każdym biegał po określonych ścieżkach przez pół godziny i tp do nastpępnego?
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);
}
}
}
}
}
}
}
}
Cytat: Maniac w Styczeń 23, 2010, 02:00:08 PM
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ą.
ta, i tego npcka napisal jakis nub na forach l2jfree
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)
Maniac to prostak i nuub - nie przejmuj sie nim, lubi sobie popeirdolic
nub napisal program kiedy ty na gowno mowiles papu
Cytat: Maniac w Styczeń 24, 2010, 12:53:55 AM
nub napisal program kiedy ty na gowno mowiles papu
Zaczyna sie flame - lov it! ;p
:*
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...
Cytat: Maniac w Styczeń 24, 2010, 01:09:32 AM
:*
^^
Cytat: Veandil w Styczeń 24, 2010, 01:32:48 AM
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
tak tak maslan też Cie kocham (wkurzać) :P
Proszę o update linku (proszę nie rapid)
Nie mam już tego, zresztą to jest zwykły NPC (z odpowiednim typem, L2NpcWalker o ile pamiętam)
oraz wpisami do tabeli za to odpowiedzialnymi (też coś z walker się nazywa)
Wy wszyscy jesteście chorzy. Kłócić się o literkę w creditsach i zgodność paru linijek z innym kodem (buffery są podobne... HA ! Wszyscy złodzieje !!;p). Poza tym Mianac, jak jesteś taki pro, że pisałeś "long, long time ago" programy to czemu wchodzisz by ściągnąć chodzącego i gadającego NPC ? Daj to samo, ale w assemblerze to nas zaskoczysz (ta, assembler, całe forum by zawalił;p). Swoją drogą zawsze podobała mi się zabawa z assemblerem. To przełóż tam, to połóż tu, to dodaj do tego, odejmij od tamtego i wywołaj takie przerwanie o takiej funkcji tego rejestru. Istna masakra ;p
Ok, tylko że ta dyskusja miała miejsce już daawno temu.
A sam maniac został kiedyś także zbanowany (nie wiem może już został odbanowany)
A szkoda, bo chciałbym zobaczyć jego odpowiedź ;) Nie istotne. tu wszędzie ogólnie robi się jeden wielki spam. Każdy gdzieś coś dopisuje (ja też) na końcu i tworzy wątek w nieodpowiednim miejscu.