Jump to content

Recommended Posts

Posted

OK. I'll go over a simple jython quest. Let's start with the basics (introduction):

All the quests are processed at compile time and tell the engine who are the starter NPCs for that quest. In this manner, when you click on the "Quest" link in a dialog, the engine gets the ID of that NPC and finds all the quests that start from this NPC, plus all the quests that you have accepted and this NPC participates in. So, if you have no quests, it will give you a list of the available quests that start from that NPC. Else, it will check if this NPC participates in the quest you are doing and give you add your quest to the list.

If more than 1 quest is available, it shows you the list and you can choose. If no quests are available, it goes to a default (which is something like "I have no tasks for you"). Else, it goes into the script and starts the interaction.

So, that's where our job starts.

In the beginning of each script you see something like this:

 

 

# Maked by Mr. Have fun! Version 0.2

print "importing quests: 2: What Women Want1"

import sys

from net.sf.l2j.gameserver.model.quest import State

from net.sf.l2j.gameserver.model.quest import QuestState

from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest

 

ARUJIENS_LETTER1_ID = 1092

ARUJIENS_LETTER2_ID = 1093

ARUJIENS_LETTER3_ID = 1094

POETRY_BOOK_ID = 689

GREENIS_LETTER_ID = 693

BEGINNERS_POTION_ID = 1073

ADENA_ID = 57

 

class Quest (JQuest) :

 

def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

 

def onEvent (self,event,st) :

      .........

      .........

      return x

etc etc etc

 

 

In Jython, '#' marks the beginning of a comment.

Jython is capable of making system calls directly. That print commant simply displays the given text in a dos window. You do not need to worry about it. It's used mostly as feedback for the person starting the server, so he can check all the quests that got loaded.

Next, it imports files from Java that it will interact with. Again, this is pretty much the same for all scripts and you don't have to worry about it.

The line:

ARUJIENS_LETTER1_ID = 1092

simply defines a CONSTANT, giving it a name (in this case ARUJIENS_LETTER1_ID) and a value (in this case 1092).

You can define constants in this manner as you please. You can also define constant arrays and such.

The next two lines

 

 

class Quest (JQuest) :

 

def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

 

Just define the beginning of the code for the quest and initialize it. Nothing major here.

 

So...now to the interesting parts. A quest needs to define a method: onEvent. It can also define onTalk and onKill.

Basically, all NPCs (people you talk to and people you kill) get registered with the quest. So each time you kill a quest monster, onKill is called. Each time you talk to a quest NPC, onTalk is called. If a quest doesn't have onTalk or onKill implemented, onEvent is called.

Finally, each time you click on a link in the dialogs, onEvent is called with an event code that is passed via the link you clicked on Wink

let's look at a sample Code:

 

 

def onEvent (self,event,st) :

    htmltext = event

    if event == "2_1" :

          st.takeItems(ARUJIENS_LETTER3_ID,1)

          st.giveItems(POETRY_BOOK_ID,1)

          htmltext = "7223-08.htm"

    elif event == "2_2" and int(st.get("onlyone")) == 0 :

            st.takeItems(ARUJIENS_LETTER3_ID,1)

            st.giveItems(ADENA_ID,450)

            st.set("cond","0")

            st.setState(COMPLETED)

            st.playSound("ItemSound.quest_finish")

            st.set("onlyone","1")

    return htmltext

 

Here, you see part of the implementation of an onEvent function.

the "Event" variable is filled from the engine with some code...in all quests they take that code and store it temporarily in htmltext. This is REALLY not needed, but it's how it's always been done...so no need to change that. In essence, all it does is return the event in case none of the other events fire. In some cases, the link at the htm simply has the name of another page as event, so by doing this, you default to showing the next page only (if no special actions need to take place)

Next, we check what is the value of the event, and do stuff with it.

Some notes:

instead of else if, jython uses elif.

there is no {..} or begin end to notify the beginning and end of the if statement or the loop. Jython is indentation sensitive! You say "if <condition>" in the next line you must put some extra spaces. Jython will assume them all included in this IF, until it sees a line with less spaces!

st is the most important variable. It keeps track of the "state" for the quest, including many variables like the character's race, class, level, items in his inventory, and more. I will go over some of those later.

htmltext is a variable containing info about the next thing to show in a dialog. You can give it either a piece of htmlcode or a link. Both work. When you return htmltext in the end of the above code, the next part of the dialog is shown to the player.

if I said:

 

def onEvent (self,event,st) :

    htmltext = event

    htmltext = "<html><head><body>Hello World.</body></html>"

    return htmltext

 

 

The player would see a popup dialog saying "Hellow World."

If I said:

 

def onEvent (self,event,st) :

    htmltext = event

    htmltext = "1234.htm"

    return htmltext

 

The game engine would look through the server's files for 1234.htm and display a popup dialog with its contents. Simple enough Wink

 

onTalk and onKill work in a similar manner:

 

def onTalk (Self,npcId,st):

  htmltext = "<html><head><body>I have nothing to say you</body></html>"

# .... .... ....

  if npcId == 7223 :

        if int(st.get("cond"))<15 :    #ignore this line for now.

          if st.getPlayer().getRace().ordinal() != 1 and st.getPlayer().getRace().ordinal() != 0 :

            htmltext = "7223-00.htm"

          elif st.getPlayer().getLevel()>1 :

            htmltext = "7223-02.htm"

            return htmltext

          else:

            htmltext = "7223-01.htm"

        else:

          htmltext = "7223-01.htm"

  return htmltext

 

Here, the id of the NPC that the player talked to is being passed. So you can easily deside which htm to show based on the NPC. In this example, the NPC has quests for elves and humans only. So it also checks the race and if it's not 0 or 1 (human, elf) it shows 7223-01.htm which is a file saying something like "this quest is for humans and elves only".

onKill works in the same manner. You get to check the ID of the killed monster and make decisions like if you want to give a quest item, summon a new quest monster (this happens for few quests where you must kill some regular monsters in order to make the quest monster appear), play certain sounds, etc.

An important note here is that you must actually register each NPC for an onTalk or an onKill event.

Those are the basics of designing a quest. There are more details that I shall go through next.

QUEST      = Quest(2,"2_WhatWomenWant1","What Women Want1")

CREATED    = State('Start', QUEST)

STARTING    = State('Starting', QUEST)

STARTED    = State('Started', QUEST)

COMPLETED  = State('Completed', QUEST)

 

 

QUEST.setInitialState(CREATED)

QUEST.addStartNpc(7223)

 

STARTING.addTalkId(7223)

 

STARTED.addTalkId(7146)

STARTED.addTalkId(7150)

STARTED.addTalkId(7157)

STARTED.addTalkId(7223)

 

 

STARTED.addQuestDrop(7157,GREENIS_LETTER_ID,1)

STARTED.addQuestDrop(7150,ARUJIENS_LETTER3_ID,1)

STARTED.addQuestDrop(7223,ARUJIENS_LETTER1_ID,1)

STARTED.addQuestDrop(7146,ARUJIENS_LETTER2_ID,1)

STARTED.addQuestDrop(7223,POETRY_BOOK_ID,1)

 

 

At the end of each script file, you see something like the above example.

QUEST = Quest(2,"2_WhatWomenWant1","What Women Want1")

Registers that this is quest with quest_id = 2, questname = "2_WhatWomenWant1", and description = "What Women Want1"

Description is only used when an NPC has more than 1 quest and needs to display a list to you...this list comes from the "description

CREATED = State('Start', QUEST)

STARTING = State('Starting', QUEST)

STARTED = State('Started', QUEST)

COMPLETED = State('Completed', QUEST)

This registers the 4 states of the quest. You shouldn't ever have to worry about changing those. A Created state is created immidiately when you click on the "quest" link an NPC who offers quests. Think of it as quest initialization. The onTalk event will immediately check if the quest has been created and if yes, it will make it "Starting" until you accept the quest.

Started = you have accepted the quest and you are working on it.

Completed = you finished the quest.

 

QUEST.setInitialState(CREATED)

this is actually the line telling the engine that when the quest is initialized it should go to "CREATED". You *can* change it to go straight to Starting and skip few steps, but it's risky (in case of crushes etc).

 

QUEST.addStartNpc(7223)

This text is parsed when the server starts and registers which NPCs one can talk to in order to get the quest started.

STARTING.addTalkId(7223)

Registers the NPC with 7223 for onTalk events while the quest is on state "Starting"

 

STARTED.addTalkId(7146)

STARTED.addTalkId(7150)

STARTED.addTalkId(7157)

STARTED.addTalkId(7223)

registers NPCs with the IDs 7146, 7150, etc for onTalk events while the quest is on state "started"

 

STARTED.addKillId(370)

This would add a monster with ID 370 for onKill events at state = started.

 

STARTED.addQuestDrop(7157,GREENIS_LETTER_ID,1)

This registers a quest drop: NPC with id = 7157, gives item with id = GREENIS_LETTER_ID (one of the predefined constants), with a drop rate of 1%. The rate actually never worked right. So instead of using that rate and expecting the engine to give the drop, we use onKill events and generate random numbers to get the probabilities manually. We use an 1% when registering the drops because they HAVE to be registered with more than 0% and we do not want to give them a high value (just to be sure that the engine doesn't have a bug that will mess things up).

 

Finally, there are some variables that are used (and added in the database) in order to track the quest's progress. Variables used are cond, id, and onlyone. You can access these variables by:

st.set("cond","1") <-- sets the variable cond to have the value 1

st.get("cond") <--- returns the value that was set to "cond"

the st variable has enough information to know where to find the value (which db table to look in and what character & quest to filter by).

variable "onlyone" is set to 1 if it was a non-repeatable quest that just got completed. If it's a non-repeatable quest that's still in progress or a repeatable quest (regardless if it's completed or not) onlyone is set to 0.

Values for id and cond are free for us to set as we find best to track progress.

Now...I would like to talk about the interaction of the player with all these events. How does a quest get started, how does an event get called, etc.

So suppose a new character name "Tester" goes to an NPC. When he presses the "Quest" link, the code gets activated and pulls a list of all quests for the NPC, or if there is no quests it shows a default message, or if there is only 1 quest it goes into the script.

The first thing from the script that will be ran is quest initialization (making it get state CREATED) and IMMEDIATELY after that, the onTalk event for that NPC will start.

normally, the onTalk is like this:

 

def onTalk (Self,npcId,st):

  htmltext = "<html><head><body>I have nothing to say you</body></html>"

  id = st.getState()

  if id == CREATED :

    st.setState(STARTING)

    st.set("cond","0")

    st.set("onlyone","0")

    st.set("id","0")

  if npcId == 7534 and int(st.get("cond"))==0 :

      if int(st.get("cond")) < 15 :

        if st.getPlayer().getRace().ordinal() != 4 :

          htmltext = "7534-00.htm"

        elif st.getPlayer().getLevel() >= 10 :

          htmltext = "7534-02.htm"

          return htmltext

        else:

          htmltext = "7534-01.htm"

      else:

        htmltext = "7534-01.htm"

    .....  ....  ...

  return htmltext

 

 

(I had skipped this text in the above example)

So, when the quest starts, it defaults the html that it will return to "I have nothing to say to you". Then it checks if the quest has been initialized properly and if yes, then it changes its state, sets the cond, id, onlyone variables, and then starts checking which NPC you talked to, and what to do next. The user has NOT accepted a quest, yet. In essence, one of the things that the script will do now, is find which page to show to the player (presumably, a page with the description of the quest and a link "Say you will do the task" or if the user doesn't qualify for this quest, it will display the proper page explaining why "Tester" cannot take this quest). It will change the htm appropriately, and it will return it so the user will see it.

When the user presses on "Say you will do the task" (or a similar link) the code behind this link looks like this:

 

 

<a action="bypass -h Quest 294_CovertBusiness 1">Say you will take the task</a>

So that tells the engine to open the script for quest named "294_CovertBusiness" with event code "1"

Oftentimes, you see things like

<a action="bypass -h Quest 294_CovertBusiness 1234_01.htm">Say you will take the task</a>

Here, "1234_01.htm" is NOT an actual link to another page. It's just an event code. However, you can use this event code in your script (the onEvent function) and do with it as you please...diplay another htm if you so wish. Event code "1" is usually used for accepting the quests. This is only by convention, but it's good to use it this way.
So...now the user pressed the link, our onEvent code will run and somewhere in there, we should have code like this:

def onEvent (self,event,st) :
    htmltext = event
    if event == "1" :
      st.set("id","0")
      st.set("cond","1")
      st.setState(STARTED)
      st.playSound("ItemSound.quest_accept")
      htmltext = "7534-03.htm"
    return htmltext 


So here, we check what event code came in. If the code is "1" it means that the player pressed on the link saying "Say you will do this task" which means he wants to accept the quest. So we set the state to STARTED, play the sound indicating a quest was accepted, and set our variables to the values we need.
Now that the state changed, all the NPCs and mobs we registered for that state are also active...the player can talk to them and activate new dialogs...
Of course, we must be careful to check that the user is at the right part of the quest, which we often do based on quest items that the user should have on him, or cond and id variables that we set to track the progress of the quest Smile

In summary, here are the important elements of jython:
- it is case sensitive
- it has no brackets or begin/end statements. ALWAYS make sure you indent properly.
- comment lines start with #
- it can access many predefined functions of java to retrieve or add info about the quest, including counting questitems the user has, giving items, taking items, checking information about the character participating in that quest, and much more.
- onEvent is the generic function taking care of everything, given a code that's passed from the engine (and it may come from a link on an htm, or it may be related to a kill / talk event). onEvent is NOT called if an onTalk/onKill is implemented for that npc/mob
- onTalk and onKill events give you easy access to the id of the npc/mob and you can use them for immediate action after talking to an npc or killing a mob.

I know this may be too much info at one time. Well...don't worry. Once you start seeing scripts for yourself and study them a little, it'll get better.
Also, I had to find out most of this info on my own...it wasn't too hard. Few details I didn't know were filled in by a guy yellowperil got me to talk to. There is very little documentation and most of it is just not helpful.
Also, the engine is changing...few things have bugs that they are trying to fix still. Occasionally, they fix something and make something else worthless...in general they do not destroy anything, but you see some redundant checks (like they check if cond = 0 and then check if cond < 15) which come from things they had to do in the past and are no longer necessary now.

Made by Fulmirus for l2j
I made the guide o stop ask how to create a quests and ect

C# Geodata editor:[url=http://rapidshare.com/files/51363334/L2j-GE_v0.8.rar.html]http://rapidshare.com/files/51363334/L2j-GE_v0.8.rar.html[/url]

  • 1 year later...
Guest
This topic is now closed to further replies.


  • Posts

    • Hey everyone! I’m giving away 5 lifetime licenses for my newly developed pixel bot – perfect for Lineage 2 and similar games. The bot automates combat, buffing, and other in-game actions with an easy GUI and advanced Telegram-based license control.   NOTE: You’ll need an Arduino Leonardo (or compatible HID device) for this bot to work! This is what makes the keypresses undetectable and safe from game protection. ✅ Features: Fully external (no memory injection, no bans) Works with Arduino Leonardo as HID keyboard Easy step-by-step GUI (no coding needed) Buffs, attack, targeting automation Bypasses most modern kernel anticheats Lifetime license, Telegram-based anti-piracy 💡 How To Get A Free License? Just reply here or send me a PM with: Why you want to try the bot What server you’ll use it on First 5 users get a free lifetime license! 💬 Contact: Telegram: @LetoKanaleto Questions? Ask here or PM me. Setup help provided!   VirusTotal https://www.virustotal.com/gui/file/472510b9271a31908bd29a620988e74f67e1f1c783ac1cac80f89cc187c3793d/detection https://www.virustotal.com/gui/file/006a5a4b5c4fc369300ed44f250df5776f0b2a863de44242d2916c0b455772c5/detection   Mega: https://mega.nz/file/m8MzRbLR#VUZ21msDcwfk5o_5CtCBC7KL6iZkXAlUSPLb5kw3v0A Google: https://drive.google.com/file/d/11X0eISEFa63EhKcZwaVwDAMibAWbzaQv/view?usp=sharing
    • General Trackers : IPTorrents invite IPTorrents account 1 tb TorrentLeech invite Torrentleech account 1 tb buffer  InTheShaDow ( ITS ) account Acid-lounge invite Torrentday invite Crnaberza account Abn.Lol account Limit-of-eden account Norbits account Xspeeds account Xspeeds invite Bemaniso invite Wigornot account Bithumen invite Filelist account Funfile invite AvistaZ invite Potuk.net invite ResurrectThe.Net invite GrabThe.Info invite Greek-Team invite LinkoManija invite Fano.in account TreZzoR account Speed.cd invite Arab-torrents.net account Arabscene.me account Scenetime account 4thd.xyz invite Btarg.com.ar account Dedbit invite Estone.cc account Speedapp invite Finvip invite Fluxzone account GigaTorrents account Gimmepeers account Haidan.video invite Mojblink account Mycarpathians invite Newinsane.info account Oscarworld.xyz account Peers.FM invite Pt.msg.vg account Ransackedcrew account Redemption invite Scene-rush account Seedfile.io invite Teracod invite Torrent.ai account Torrentmasters invite Ttsweb invite X-files invite X-ite invite Ncore account TorrentHR account Rptorrents account BwTorrents account Superbits invite Krazyzone account Immortalseed account Tntracker invite Pt.eastgame.org account Bitturk account Rstorrent account Tracker.btnext invite Torrent-turk.de account BeiTai.PT account Pt.keepfrds account 52pt.site account Pthome account Torrentseeds account Aystorrent account Blues-brothers.biz invite Divteam account Thesceneplace invite CinemaMovies.pl account Brasiltracker account Patiodebutacas account Newheaven.nl account  Xthor account Swarmazon.club invite Bc-reloaded account Crazyspirits account Silentground invite Omg.wtftrackr invite Milkie.cc invite Breathetheword invite Madsrevolution account Chilebt account Yubraca account Uniongang.tv account Frboard account Exvagos account Diablotorrent account Microbit account Carp-hunter.hu account Majomparade.eu account Theshinning.me account Bithorlo account Youiv.info account Dragonworld-reloaded account Sharewood.tv account Partis.si account Digitalcore.club invite Fuzer.me account R3vuk.wtf invite Ztracker account 1 tb buffer 3changtrai account Best-core.info account Bitsite.us account Eliteunitedcrew invite Exitorrent.org account Hellastz account Tophos invite Torrent.lt account Sktorrent.eu account Oshen account Blackhattorrent account Pirata.digital account Esharenet account Ohmenarikgi.la Pirate-share account Immortuos account Kiesbits account Cliente.amigos-share.club account Broadcity invite Ilovetorzz account Torrentbytes account Polishsource account Portugas invite Shareisland account ArabaFenice account Hudbt.hust.edu.cn account Audiences account Nanyangpt account Pt.sjtu.edu.cn account Pt.zhixing.bjtu.edu.cn account Byr.pt invite Ptfiles invite Red-bits account Pt.hdpost.top account Irrenhaus.dyndns.dk (NewPropaganda) account Mnvv2.info (MaxNewVision V2) account 1ptba.com account Spidertk.top account Casa-Torrent (Teamctgame) account Film-paleis account Generation-free account Aftershock-tracker account Twilightsdreams account Back-ups.me invite Sor-next.tk ( Spirit Of Revolution ) account Tfa.tf ( The Falling Angels ) account Hdmayi account S-f-p.dyndns.dk ( Share Friends Projekt ) account Unlimitz.biz account Pttime account St-tracker.eu account New-retro.eu account Zbbit account Tigers-dl.net account Jptvts.us account Lat-team account Club.hares.top account Falkonvision-team account Concen account Drugari account Megamixtracker account T.ceskeforum account Peeratiko.org account Zamunda.se account Central-torrent.eu account h-o-d.org account Hdturk.club account Torrentleech.pl account Demonoid invite Lst.gg account Fakedoor.store account LaidBackManor account Vrbsharezone.co.uk invite Torrenteros account Arenaelite account Datascene account Tracker.0day.community Tapochek.net invite Jme-reunit3d account Ptchina invite Lesaloon account Exyusubs account Therebels.tv account Ubits.club invite Zmpt.cc account Turktorrent.us account Dasunerwarte account Funsharing account Hawke.uno account Monikadesign account Theoldschool.cc invite Fearnopeer account Alpharatio account Wukongwendao.top account Chinapyg account Azusa.wiki account Yggtorrent.top account Movies Trackers : Pixelhd account Cinemageddon account DVDSeed account Cinemageddon account Cinemaz account Retroflix account Classix-unlimited - invite Movie-Torrentz (m2g.link) invite Punck-tracker.net account Tmghub account Tb-asian account Cathode-ray.tube account Greatposterwall account Telly account Arabicsource.net account HD Trackers : Hdf.world account Torrentland.li account HdSky account Hdchina account Chdbits account Totheglory account Hdroute account Hdhome account TorrentCCF aka et8.org account 3DTorrents invite HD-Torrents account Bit-HDTV account HDME.eu invite Hdarea.co account Asiancinema.me account JoyHD invite HDSpace invite CrazyHD invite Bluebird-hd invite Htpt.cc account Hdtime invite Ourbits.club account Hd4fans account Siambit account Privatehd account Springsunday account Tjupt account Hdcity.leniter invite Ccfbits account Discfan account Pt.btschool.club account Ptsbao.club invite Hdzone.me invite Danishbytes account Zonaq.pw account Tracker.tekno3d account Arabp2p account Hd-united account Reelflix.xyz account Hdatmos.club account Anasch.cc invite Tigris-t account Nethd.org account Hd.ai invite Hitpt.com account Hdmonkey account Dragonhd.xyz account Hdclub.eu account Forum.bluraycd.com account Carpt account Hdfun.me invite Pt.hdupt invite Puntotorrent account Ultrahd account Rousi.zip account Blutopia account Music Trackers : Dicmusic account Music-Vid account Open.cd account LzTr account ProAudioTorrents invite Jpopsuki invite TranceTraffic invite Audionews invite Kraytracker invite Libble.me invite Losslessclub invite Indietorrents.com invite Dimeadozen account Funkytorrents invite Karaokedl account zombtracker.the-zomb account Concertos invite Sugoimusic account Satclubbing.club invite Metal.iplay invite Psyreactor invite Panda.cd account Adamsfile account Freehardmusic account Tracker.hqmusic.vn accouunt Twilightzoom account 3 tb buffer Hiresmusic account Metalguru account E-Learning Trackers : BitSpyder invite Brsociety account Learnbits invite Myanonamouse account Libranet account 420Project account Learnflakes account Pt.soulvoice.club account P2pelite account Aaaaarg.fail invite Ebooks-shares.org account Abtorrents account TV-Trackers : Skipthecommericals Cryptichaven account TV-Vault invite Shazbat.TV account Myspleen account Tasmanit.es invite Tvstore.me account Tvchaosuk account Jptv.club account Tvroad.info XXX - Porn Trackers : FemdomCult account Pornbay account Pussytorrents account Adult-cinema-network account Bootytape account 1 Tb buffer Exoticaz account Bitporn account Kufirc account Gaytorrent.ru invite Nicept account Gay-torrents.org invite Ourgtn account Pt.hdbd.us account BitSexy account Gaming Trackers : Mteam.fr account BitGamer invite Retrowithin invite Gamegamept invite Cartoon/Anime/Comic Trackers : U2.dmhy account CartoonChaos invite Animetorrents account Nyaa.si account Mononoke account Totallykids.tv account Bakabt.me invite Revanime account Ansktracker account Tracker.shakaw.com.br invite Bt.mdan.org account Skyey2.com account Animetracker.cc Sports Trackers : MMA-Tracker invite T3nnis.tv invite AcrossTheTasman account RacingForMe invite Sportscult invite Ultimatewrestlingtorrents account Worldboxingvideoarchive invite CyclingTorrents account Xtremewrestlingtorrents account Tc-boxing invite Mma-torrents account Aussierul invite Xwt-classics account Racing4everyone account Talk.tenyardtracker account Stalker.societyglitch invite Extremebits invite Software/Apps Trackers : Ianon account Brokenstones account Appzuniverse invite Teamos.xyz account Graphics Trackers: Forum.Cgpersia account Gfxpeers account Forum.gfxdomain account Documentary Trackers: Forums.mvgroup account Others Fora.snahp.eu account Board4all.biz account Filewarez.tv account Makingoff.org/forum account Xrel.to account Undergunz.su account Corebay account Endoftheinter.net ( EOTI ) account Thismight.be invite Skull.facefromouter.space account Avxhm.se (AvaxHome) account Ssdforum account Notfake.vip account Intotheinter.net account Tildes.net invite Thetoonz account Usinavirtual account Hdclasico invite HispaShare account Valentine.wtf account Adit-hd account Forum-andr.net account Warezforums account Justanothermusic.site account Forbiddenlibrary.moe account Senturion.to account Movieparadise account Militaryzone account Dcdnet.ru account Sftdevils.net account Heavy-r.com account New-team.org account NZB : Drunkenslug account Drunkenslug invite Usenet-4all account Brothers-of-Usenet account Dognzb.cr invite Kleverig account Nzb.cat account Nzbplanet.net invite Ng4you.com account Nzbsa.co.za account Bd25.eu account NZB.to account Prices start from 3 $ to 100 $ Payment methods: Crypto, Neteller, Webmoney, Revolut If you want to buy something send me a pm or contact me on: Email: morrison2102@gmail.com Discord: LFC4LIFE#4173 Telegram: https://t.me/LFC4LIFE4173 Skype: morrison2102@hotmail.com
    • L2 AARON - ADVERTISTING BANNERS     L2 AMBROSIAL - ANIMATED BORDER Portfolio - protojahdesigns.com You can also join Protojah Designs Discord
    • Dear friends, right now we are holding a grand competition with a prize fund of more than $ 1000 in our stores https://socnet.store , telegram store: https://socnet.shop and SMM panel: https://socnet.pro There are more than 50 prize places in our competition, each lucky person can take one of the places. Important condition: you must make a purchase at any time before June 1, 2025. The more purchases you make - the more chances you have to win the main prize in the community of $ 300! ➡ Our Online Shop: socnet.store ✅ ➡ Our SMM-Boosting Panel: socnet.pro ✅ ➡ Telegram Shop Bot: socnet.shop ✅ ➡ Telegram Support: https://t.me/solomon_bog ✅ ➡ Telegram Channel: https://t.me/accsforyou_shop ✅ ➡ Discord Support: @AllSocialNetworksShop ✅ ➡ Discord Server: https://discord.gg/y9AStFFsrh ✅ ➡ WhatsApp Support: 79051904467✅ ➡ WhatsApp Channel: https://whatsapp.com/channel/0029Vau0CMX002TGkD4uHa2n ✅ ➡ Email Support: solomonbog@socnet.store ✅
    • Dear friends, right now we are holding a grand competition with a prize fund of more than $ 1000 in our stores https://socnet.store , telegram store: https://socnet.shop and SMM panel: https://socnet.pro There are more than 50 prize places in our competition, each lucky person can take one of the places. Important condition: you must make a purchase at any time before June 1, 2025. The more purchases you make - the more chances you have to win the main prize in the community of $ 300! ➡ Our Online Shop: socnet.store ✅ ➡ Our SMM-Boosting Panel: socnet.pro ✅ ➡ Telegram Shop Bot: socnet.shop ✅ ➡ Telegram Support: https://t.me/solomon_bog ✅ ➡ Telegram Channel: https://t.me/accsforyou_shop ✅ ➡ Discord Support: @AllSocialNetworksShop ✅ ➡ Discord Server: https://discord.gg/y9AStFFsrh ✅ ➡ WhatsApp Support: 79051904467✅ ➡ WhatsApp Channel: https://whatsapp.com/channel/0029Vau0CMX002TGkD4uHa2n ✅ ➡ Email Support: solomonbog@socnet.store ✅
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock