Jump to content

Recommended Posts

Posted

Here is a script i found:

[move][glow=red,2,300]CREDITS GOES TO THEONE[/glow][/move]

 

This is a simple automatic events manager to give your players something to do when they get bored.

This one only has 1 event: It spawns 1 raidboss(random) in a location(random) and announces to all the players which raidboss has been spawned where. If it's not killed within 2 hours, it erases that raidboss.

Automatic events are set for every 2 hours but can be set differently.

Also, I made the script so it's expandable. I use with 5 different random events on my servers, a timed collect the drop, raidboss spawn, a few PvP events, etc... You only need some imagination.

 

So here it is:

 

 
import math
import sys
from net.sf.l2j.gameserver              import Announcements
from net.sf.l2j.util                    import Rnd
from java.lang                      import System
from net.sf.l2j.gameserver.model.actor.appearance   import PcAppearance
from net.sf.l2j.gameserver              import GameTimeController
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
from net.sf.l2j.gameserver.model.actor.instance     import L2PcInstance
from net.sf.l2j.gameserver.model.actor.instance     import L2NpcInstance


MANAGER = 100400
TOPNPC  = 100401
Raids =  [ 25514,22216,25286,25283,25319 ]

#Mountain protected zone
MX  = 55312
MY  = 219168
MZ  = -3223

#Mountain top NPC coords
MNPCX   = 144291
MNPCY   = 157446
MNPCZ   = -466

#Mountain bottom and giran NPC coords
MBX1    = 82698
MBY1    = 148638
MBZ1    = -3468
MBX = 143370
MBY = 161135
MBZ = -1925

#number of participants
MountainMinPlayers = 6
MountainMaxPlayers = 30

EventNpcs = [ 100400, 100401 ]

#time between events in milliseconds
eventInterval = 7200000  # 2 hours after the first event there is the second one and the others after are 2 hours too
FirstStart = 2700000  #45 minutes after each restart there is the first event


class eventmanager (JQuest):

    def __init__(self,id,name,descr):
        JQuest.__init__(self,id,name,descr)
        self.RaidBosses ={
                0: {'name':"Queen Shyeed" , 'id':25514},
                1: {'name':"Tyrannosaurus" , 'id':22216},
                2: {'name':"Anakim" , 'id':25286},
                3: {'name':"Lilith" , 'id':25283},  
                4: {'name':"Ember" , 'id':25319},
                }
        self.RbCoords ={
                0: {'name':"in the colliseum" , 'X':150086 , 'Y':46733 , 'Z':-3407},  
                1: {'name':"near the entrance of the Garden of Eva" , 'X':84805 , 'Y':233832 , 'Z':-3669},
                2: {'name':"close to the western entrance of the Cemetary" , 'X':161385 , 'Y':21032 , 'Z':-3671},
                3: {'name':"at Gludin's Harbor" , 'X':89199 , 'Y':149962 , 'Z':-3581},
                }
        self.startQuestTimer("EventTrigger", FirstStart, None, None)
        self.RbSpawn = []
        self.rewards ={
                0: {'prize':4357 , 'number':1}, #King of the hill event, dont forget to change the reward
                }
        self.Teams = []
        self.Event = []
        self.True = True
        self.False = False
        self.Group = []
        self.EventManager1 = []
        self.EventManager = []
        self.Registration = []
        self.numberPlayers = []
        self.One = 1
        self.Team1 = []
        self.Team2 = []
        self.numberOfTeams = []
        self.Trigger = 1
        self.Count = 2
        self.Add = 1
        self.Full = False
        self.TopNpc = []
        self.EventNames = {0:"King of the hill", 1:"kill the Raidboss"}


    def onAdvEvent (self,event,npc,player):
        if event == "EventTrigger" :
            rr = int(Rnd.get(2))
            Announcestart = "The " + self.EventNames[rr] + " event is about to start!!!"
            Announcements.getInstance().announceToAll(Announcestart)
            if rr == 0:
                self.Event = 0
                eventmanager1 = self.addSpawn(MANAGER,MBX1,MBY1,MBZ1,0,False,0)
                self.EventManager1 = eventmanager1
                topnpc = self.addSpawn(TOPNPC,MNPCX,MNPCY,MNPCZ,0,False,0)
                self.TopNpc = topnpc
                Announcements.getInstance().announceToAll("All those who wish to participate should come to meet me in Giran town")
                Announcements.getInstance().announceToAll("Registration will last 15 minutes")
                self.startQuestTimer("MountainSelect", 900000, npc, player)                            
                self.startQuestTimer("10minutes", 300000, npc, player)                            
                self.startQuestTimer("5minutes", 600000, npc, player)                            
                self.startQuestTimer("2minutes", 780000, npc, player)                            
                self.startQuestTimer("1minute", 840000, npc, player)                            
            if rr == 1:
                self.Event = 1
                #the spawn coords and which raidboss are both random and
                #independant from each other
                ra = int(Rnd.get(5))
                rb = int(Rnd.get(4))
                self.RbSpawn = []
                raidboss = self.RaidBosses[ra]['name']
                location = self.RbCoords[rb]['name']
                Announcements.getInstance().announceToAll(raidboss + " has just been spawned " + location + " and will disappear in 2 hours, hurry!")
                self.RbSpawn = self.addSpawn(self.RaidBosses[ra]['id'],self.RbCoords[rb]['X'],self.RbCoords[rb]['Y'],self.RbCoords[rb]['Z'],0,False,0)
                self.startQuestTimer("RbDespawn", 7150000, npc, player)                            
                self.startQuestTimer("EventTrigger", eventInterval, npc, player)                          
        if event == "10minutes":
            Announcements.getInstance().announceToAll("10 minutes left for event registration in Giran")
        if event == "5minutes":
            Announcements.getInstance().announceToAll("5 minutes left for event registration in Giran")
        if event == "2minutes":
            Announcements.getInstance().announceToAll("2 minutes left for event registration in Giran")
        if event == "1minutes":
            Announcements.getInstance().announceToAll("1 minute left for event registration in Giran")
        if event == "MountainSelect" :
                self.EventManager1.deleteMe()
                self.startQuestTimer("MountainStart", 60000, npc, player)                            
                totalplayers = len(self.Registration)
                if totalplayers >= MountainMinPlayers:
                    #5 players per team, max 6 teams can participate
                    self.numberOfTeams = int((len(self.Registration))/2)
                    numberOfTeams = int((len(self.Registration))/2)
                    playerList = list(self.Registration)
                    Team1 = []
                    Team2 = []
                    for i in range(len(playerList)/2) :
                        Team1.append(playerList.pop(Rnd.get(len(playerList))))
                    Team2 = playerList
                    for i in Team1:
                        i.teleToLocation(MNPCX,MNPCY,MNPCZ)#tele to top of mountain
                        i.getAppearance().setNameColor(0x005de2) #orange
                        i.getAppearance().setTitleColor(0x005de2) #orange
                        i.getQuestState("eventmanager").set("cond","3")
                    for i in Team2:
                        i.teleToLocation(144428,161151,-2460)#tele to location A
                        i.getAppearance().setNameColor(0xd5e200) #yellow
                        i.getAppearance().setTitleColor(0xd5e200) #yellow
                        i.getQuestState("eventmanager").set("cond","4")
                    Announcements.getInstance().announceToAll("Team 1 - blue - has 20 minutes to take control of the mountain and talk to the Flag NPC to win this event.")
                    Announcements.getInstance().announceToAll("Team 2 - orange - has to defend the mountain to win.  Event starts in 1 minute, wait for the signal.")
                    self.Team1 = Team1
                    self.Team2 = Team2
                    self.numberOfTeams = numberOfTeams
                else:
                    Announcements.getInstance().announceToAll("Event cancelled due to lack of participation.")
                    self.EventManager1.deleteMe()
                    self.TopNpc.deleteMe()
                    self.cancelQuestTimer("round_finish", None, None)
                    self.cancelQuestTimer("15Tofinish", None, None)
                    self.cancelQuestTimer("10Tofinish", None, None)
                    self.cancelQuestTimer("5Tofinish", None, None)
                    self.cancelQuestTimer("1Tofinish", None, None)
        if event == "MountainStart":
            for i in self.Team2:
                i.teleToLocation(MBX,MBY,MBZ)#tele to location A
            Announcements.getInstance().announceToAll("Start the event!!! Team 2, ATTACK!!! Good luck to both teams!")
            self.Attacker = self.Team2
            self.Defender = self.Team1
            self.startQuestTimer("round_finish", 1200000, npc, player) #sera 1200000                            
            self.startQuestTimer("15Tofinish", 300000, npc, player)                            
            self.startQuestTimer("10Tofinish", 600000, npc, player)                            
            self.startQuestTimer("5Tofinish", 900000, npc, player)                            
            self.startQuestTimer("1Tofinish", 1140000, npc, player)                            
        if event == "15Tofinish":
            Announcements.getInstance().announceToAll("15 minutes until the end of the event")
        if event == "10Tofinish":
            Announcements.getInstance().announceToAll("10 minutes until the end of the event")
        if event == "5Tofinish":
            Announcements.getInstance().announceToAll("5 minutes until the end of the event")
        if event == "1Tofinish":
            Announcements.getInstance().announceToAll("1 minute until the end of the event")
        if event == "round_finish" and npc and player:
            self.TopNpc.deleteMe()
            self.startQuestTimer("EventTrigger", eventInterval, npc, player)                          
            self.cancelQuestTimer("15Tofinish", None, None)
            self.cancelQuestTimer("10Tofinish", None, None)
            self.cancelQuestTimer("5Tofinish", None, None)
            self.cancelQuestTimer("1Tofinish", None, None)
            Announcements.getInstance().announceToAll("Orange team wins!")
            rr = self.Event
            reward = self.rewards
            for i in self.Team2:
                i.teleToLocation(MBX1,MBY1,MBZ1)#tele back to town
                i.getAppearance().setNameColor(0xffffff)
                i.getAppearance().setTitleColor(0xffffff)
                i.getQuestState("eventmanager").set("cond","0")
            for i in self.Team1:
                i.teleToLocation(MBX1,MBY1,MBZ1)#tele back to town
                i.getQuestState("eventmanager").giveItems(reward[rr]['prize'],reward[rr]['number'])
                i.getQuestState("eventmanager").playSound("ItemSound.quest_fanfare_1")
                i.getAppearance().setNameColor(0xffffff)
                i.getAppearance().setTitleColor(0xffffff)
                i.getQuestState("eventmanager").set("cond","0")
        if event == "RbDespawn":
            self.RbSpawn.deleteMe()

    def onTalk (self,npc,player) :
        npcId = npc.getNpcId()
        cond = player.getQuestState("eventmanager").getInt("cond")
        if npcId == MANAGER :
            if not cond == 2:
                if self.Event == 0:
                    if len(self.Registration) < MountainMaxPlayers:
                        player.getQuestState("eventmanager").set("cond","2")
                        self.Registration.append(player)
                        Reg = list(self.Registration)
                        return "<html><body>You have been added to the event list, teams will be made randomly 1 minute before the start of the event</body></html>"
                    else:
                        Announcements.getInstance().announceToAll("Event is now full, no more registration accepted.")
                        self.Full = True
                        return "<html><body>Event is full, try again next time</body></html>"
            else:
                return "<html><body>You are already registered</body></html>"
        if npcId == TOPNPC :
            if not cond == 3:
                self.TopNpc.deleteMe()
                self.cancelQuestTimer("round_finish", None, None)
                self.cancelQuestTimer("15Tofinish", None, None)
                self.cancelQuestTimer("10Tofinish", None, None)
                self.cancelQuestTimer("5Tofinish", None, None)
                self.cancelQuestTimer("1Tofinish", None, None)
                Announcements.getInstance().announceToAll("Blue team wins!")
                rr = self.Event
                reward = self.rewards
                self.startQuestTimer("EventTrigger", eventInterval, npc, player)                          
                for i in self.Team1:
                    i.teleToLocation(MBX1,MBY1,MBZ1)#tele back to town
                    i.getAppearance().setNameColor(0xffffff)
                    i.getAppearance().setTitleColor(0xffffff)
                    i.getQuestState("eventmanager").set("cond","0")
                for i in self.Team2:
                    i.teleToLocation(MBX1,MBY1,MBZ1)#tele back to town
                    i.getQuestState("eventmanager").playSound("ItemSound.quest_fanfare_1")
                    i.getQuestState("eventmanager").giveItems(reward[rr]['prize'],reward[rr]['number'])
                    i.getAppearance().setNameColor(0xffffff)
                    i.getAppearance().setTitleColor(0xffffff)
                    i.getQuestState("eventmanager").set("cond","0")
            else:
                return "<html><body>You are on the defending team!!! defend me, stop talking!</body></html>"

    def onKill (self,npc,player,isPet):
        if npc in self.RbSpawn:
            self.cancelQuestTimer("RbDespawn", None, None)

# Quest class and state definition
QUEST       = eventmanager(-1, "eventmanager", "ai")

for i in Raids:
    QUEST.addKillId(i)

for i in EventNpcs:
    QUEST.addTalkId(i)
    QUEST.addStartNpc(i)

print "Event Manager loaded!!!"

 

 

100400.htm

<html>
<body>
<center>
<img src="L2UI_CH3.herotower_deco" width=256 height=32>
<br>So... you want to participate in the event?
<br><br>
<button value="Yes!" action="bypass -h npc_%objectId%_Quest eventmanager" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">
<img src=Sek.start_logo width=256 height=256 align=center>
</center></body>
</html>

 

100401.htm

<html>
<body>
<center>
<img src="L2UI_CH3.herotower_deco" width=256 height=32>
<br>hmmm... it seems you have defeted my defenders... So, you want your reward then?
<br><br>
<button value="Yes we do!" action="bypass -h npc_%objectId%_Quest eventmanager" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">
<img src=Sek.start_logo width=256 height=256 align=center>
</center></body>
</html>

 

Do not forget to create 2 NPCs with IDs 100400 and 100401 as they are needed for the King of the Hill event!

** note: DO NOT spawn these NPCs, the script will spawn them when needed **

 

Also you need this(to prevent karma during the event):

insert  into zone_vertices values
('25100', '0', '143314', '164544'),
('25100', '1', '144215', '160270'),
('25100', '2', '145877', '159158'),
('25100', '3', '145397', '158735'),
('25100', '4', '142822', '155102'),
('25100', '5', '140831', '158004'),
('25100', '6', '141794', '160570');

 

 

this part goes in zone.xml:

    <zone id='25100' type='Arena' shape='Npoly' minZ='-2100' maxZ='-100'>
        <stat name='name' val='Special Mountain Arena'/>
        <stat name='spawnX' val='-59858'/>
        <stat name='spawnY' val='-57495'/>
        <stat name='spawnZ' val='-2039'/>
    </zone>

Posted

Well i suppose that's nice,but it's only for L2J as in L2JFree table zone_vertices do not exist and zone.xml do not exist.Or i am wrong?

  • 2 months later...
Posted

Thx 4 share

 

I've got a question: In KOTH , when u die u have to go to the city (fantasy island), is there any way to res a dead char an teleport it to his team spot?

 

I try this but it didn't worked:

 

def onDeath(self, npc, pc, st) :
  if rr == 0:  
    if st.getPlayer() in self.Team1:
       SkillTable.getInstance().getInfo(1016,9).getEffects(st.getPlayer(),st.getPlayer())
       st.getPlayer.teleToLocation(MNPCX,MNPCY,MNPCZ)#tele to top of mountain
    else:
       SkillTable.getInstance().getInfo(1016,9).getEffects(st.getPlayer(),st.getPlayer())
       st.getPlayer.teleToLocation(144428,161151,-2460)#tele to location A

 

I've never did something like this so i'm a newby.

 

Any clues?

 

Thx

Marcelo

  • 2 weeks later...
  • 4 weeks later...
Posted

Does anyone have the working code for l2jfree?

 

In the python script replace all the "net.sf.l2j." for "com.l2jfree."

and replace this line:

from net.sf.l2j.util                    import Rnd

for this one:

from com.l2jfree.tools.random              import Rnd

 

Add this to data/zone/arena.xml

  <zone id="25100" name="Special Mountain Arena">
    <settings pvp="Arena" />
    <shape type="Poly" ZMin="-2100" ZMax="-100">
      <point x="144215" y="160270" />
      <point x="145877" y="159158" />
      <point x="145397" y="158735" />
      <point x="142822" y="155102" />
      <point x="140831" y="158004" />
      <point x="141794" y="160570" />
    </shape>
  </zone>

 

And you dont need to put the zone_verticles.sql and the zone.xml stuff, bcause l2jfree simply doesnt have it ^^

The NPC's is the same (in html/default/...)

 

Hope it works

Posted

Fix this please

 

Disk:\serverdir\gameserver\data\scripts\quests\eventmanager\__init__.py
Traceback (innermost last):
  File "__init__.py", line 258, in onKill
TypeError: iteration over non-sequence

        at org.python.core.Py.TypeError(Unknown Source)
        at org.python.core.PyObject.__iter__(Unknown Source)
        at org.python.core.PyInstance.__iter__(Unknown Source)
        at org.python.core.PyObject.object___contains__(Unknown Source)
        at org.python.core.PyObject.__contains__(Unknown Source)
        at org.python.core.PyInstance.__contains__(Unknown Source)
        at org.python.core.PyObject._in(Unknown Source)
        at org.python.pycode.serializable._pyx1235839395481.onKill$5(__init__.py
:258)
        at org.python.pycode.serializable._pyx1235839395481.call_function(__init
__.py)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyTableCode.call(Unknown Source)
        at org.python.core.PyFunction.__call__(Unknown Source)
        at org.python.core.PyMethod.__call__(Unknown Source)
        at org.python.core.PyObject.__call__(Unknown Source)
        at org.python.core.PyObject._jcallexc(Unknown Source)
        at org.python.core.PyObject._jcall(Unknown Source)
        at org.python.proxies.main$eventmanager$368.onKill(Unknown Source)
        at net.sf.l2j.gameserver.model.quest.Quest.notifyKill(Quest.java:412)
        at net.sf.l2j.gameserver.model.L2Attackable$OnKillNotifyTask.run(L2Attac
kable.java:498)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
access$301(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source
)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

 

Running L2J , latest rev

Guest
This topic is now closed to further replies.


  • Posts

    • [CENTER] [SIZE=6][B][COLOR=#C084FC]L2JMOBIUS CLASSIC INTERLUDE[/COLOR][/B][/SIZE] [SIZE=5][B]QUEST AUTO MOVE + SMART TELEPORT SYSTEM[/B][/SIZE] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=4][B][COLOR=#22D3EE]FOR SALE[/COLOR][/B][/SIZE] A complete [B]Quest Navigation System[/B] for [B]L2JMobius Classic Interlude[/B] Designed for servers that want to make quest progression easier and more modern without turning the game into an Auto Quest / Auto Complete server. [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]MAIN FEATURES[/COLOR][/B][/SIZE] [/CENTER] [B][COLOR=#22D3EE]● QUEST AUTO MOVE[/COLOR][/B] Players can automatically move toward the next required quest objective. Supported destinations can include: [LIST] []Quest NPCs []Monsters []Quest locations []Return NPCs []Next quest stages []Class-transfer objectives [/LIST] The route can automatically update when the current quest stage is completed. [B][COLOR=#22D3EE]● SMART QUEST PROGRESS DETECTION[/COLOR][/B] The system reads the player's current quest progress and determines the next valid objective. Example: [CENTER] [B]Talk to NPC[/B] ↓ [B]Hunt Monsters[/B] ↓ [B]Collect Quest Items[/B] ↓ [B]Return to NPC[/B] ↓ [B]Continue Next Quest Stage[/B] [/CENTER] When the quest condition changes, the navigation system can automatically load the next destination. [B][COLOR=#22D3EE]● SMART TELEPORT[/COLOR][/B] For distant objectives, the system can provide controlled teleport assistance. The player is not necessarily teleported directly on top of the NPC or monster. Instead: [CENTER] [B]Teleport Near Destination[/B] ↓ [B]Auto Move[/B] ↓ [B]Reach Actual Quest Target[/B] [/CENTER] This keeps the original gameplay feeling while reducing unnecessary long-distance travel. [B][COLOR=#22D3EE]● AUTO MOVE + TELEPORT LOGIC[/COLOR][/B] The system can choose the most appropriate navigation method depending on the quest route. [CENTER] [COLOR=#4ADE80][B]NEAR OBJECTIVE[/B][/COLOR] Auto Move [COLOR=#8B5CF6]──────────────[/COLOR] [COLOR=#FACC15][B]DISTANT OBJECTIVE[/B][/COLOR] Teleport Assistance ↓ Auto Move ↓ Final Quest Destination [/CENTER] [B][COLOR=#22D3EE]● AUTOMATIC NEXT STEP[/COLOR][/B] Quest navigation does not stop after the first destination. Example: [CENTER] Player reaches NPC ↓ Quest state changes ↓ System detects new quest condition ↓ Next route becomes available ↓ Player continues automatically [/CENTER] This allows complete multi-stage quest chains to be supported. [B][COLOR=#22D3EE]● FIRST CLASS TRANSFER SUPPORT[/COLOR][/B] The system can also support the Classic Interlude first class-transfer quest chains. Example flow: [CENTER] Complete First Mark ↓ Complete Second Mark ↓ Complete Third Mark ↓ Required Marks Detected ↓ Navigate Player Toward Class Transfer [/CENTER] Useful for Human, Elf, Dark Elf, Orc and Dwarf class progression. [B][COLOR=#22D3EE]● MISSING ROUTE DETECTION[/COLOR][/B] If navigation information has not yet been configured for a quest, the system can report it instead of sending the player somewhere incorrectly. Example: [CODE] Path of the Human Knight - Missing route data [/CODE] This makes development and future quest expansion easier. [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]HOW IT WORKS[/COLOR][/B][/SIZE] [/CENTER] Example quest flow: [CODE] Quest Started | v Current Quest Condition | v Find Navigation Route | +----------------------+ | | v v Nearby Target Distant Target | | v v Auto Move Teleport | v Auto Move | v Quest Objective | v Quest State Update | v Next Route [/CODE] [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]CONFIGURATION[/COLOR][/B][/SIZE] [/CENTER] Navigation can be configured individually for quests. Possible configuration options: [LIST] []Quest ID []Quest condition / state []Target NPC []Target monster []Target coordinates []Teleport coordinates []Final Auto Move coordinates []Required quest items []Required item count []Minimum / maximum distance []Enable Auto Move []Enable Teleport []Route identifier []Next quest step [/LIST] [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]EXAMPLE[/COLOR][/B][/SIZE] [/CENTER] Player starts a class-transfer quest. [CENTER] [B]Sir Klaus Vasper[/B] ↓ Auto Move ↓ Quest Updated ↓ New Destination Detected ↓ Teleport to Required Region ↓ Auto Move ↓ Kill Required Monsters ↓ Collect Quest Item ↓ Return Route Activated ↓ Return to NPC ↓ Continue Quest [/CENTER] [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]IMPORTANT[/COLOR][/B][/SIZE] [/CENTER] [COLOR=#F87171][B]THIS IS NOT AN AUTO QUEST / AUTO COMPLETE SYSTEM.[/B][/COLOR] Players must still: [LIST] []Talk to the required NPC []Kill the required monsters []Collect required quest items []Meet quest conditions [*]Complete the original quest logic [/LIST] The system assists with: [B]Navigation + Travel + Quest Route Guidance[/B] The original quest mechanics remain active. [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]COMPATIBILITY[/COLOR][/B][/SIZE] [/CENTER] [B]Platform:[/B] L2JMobius [B]Chronicle:[/B] Classic Interlude [B]Implementation:[/B] Server Side [B]Language:[/B] Java [B]Quest Integration:[/B] Java / XML [B]Delivery Format:[/B] Source modifications / Patch [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]PACKAGE INCLUDES[/COLOR][/B][/SIZE] [/CENTER] [LIST] []Quest Auto Move Engine []Smart Teleport System []Quest Condition Detection []Automatic Next-Step Detection []Route Management []Missing Route Detection []Class Transfer Support []Quest Route Configuration []Supported Quest Routes []Installation Instructions []Source Code Changes []Unified .patch File [/LIST] [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]IDEAL FOR[/COLOR][/B][/SIZE] [/CENTER] [LIST] []Retail-style servers []Low-rate servers []Craft-oriented servers []Classic Interlude servers []New-player friendly servers []Premium membership features [*]Custom Quest Helper systems [/LIST] Especially useful for low-rate environments where quests remain important but players may not remember every NPC, region and quest route. [CENTER] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]SCREENSHOTS[/COLOR][/B][/SIZE] [IMG][/IMG] [IMG] [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]PRICE[/COLOR][/B][/SIZE] [SIZE=5][B][COLOR=#4ADE80]€50.00[/COLOR][/B][/SIZE] Additional quest routes or custom integrations can be discussed separately. [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]UPDATES[/COLOR][/B][/SIZE] Future updates may include: Quest route improvements Additional supported quests Additional class-transfer routes Navigation improvements Compatibility fixes [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#C084FC]CONTACT[/COLOR][/B][/SIZE] [B]Contact:[/B] PM HERE [COLOR=#8B5CF6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/COLOR] [SIZE=5][B][COLOR=#22D3EE]QUEST SMARTER[/COLOR][/B][/SIZE] [SIZE=4][B]Navigate Faster — Keep the Classic Gameplay[/B][/SIZE] [B][COLOR=#C084FC]L2JMobius Classic Interlude Quest Auto Move + Smart Teleport System[/COLOR][/B] [/CENTER]
    • Interesting service. I've been looking into Telegram bot promotion and your pricing seems reasonable for the keywords and country targeting.
    • [WTS] Celestial Destiny | L2 Essence 563 | Source Code or Full Project | Lifetime Support 📄 VIEW THE FULL PRESENTATION — FEATURES & SCREENSHOTS Celestial Destiny — Lineage 2 Essence | Protocol 563 2 years of development · Extensive custom features · RU / EN Celestial Destiny is available for purchase — as server pack source code or as a complete project. After two years of development, the project was shut down following a DDoS attack. The owner no longer has the funds to restore operations and continue development, leading to the decision to sell. Key features Essence mechanics: classes, skills, bosses, collections, guardians, and progression systems. Over 3,000 bug reports processed across the projects. Telegram bot: Telegram Stars payments, character statistics, notifications, teleportation, resurrection, and auto-hunting controls. Live class balancing: adjust damage, defense, critical damage, and individual multipliers without restarting the server. PvP content: 1v1 and 3v3 Olympiad, castle sieges, World Siege of Aden, and scheduled PvE/PvP modes. Enhanced client: additional skill bars, improved auto-hunting, searchable inventory, bulk enchanting, and convenient item management. Custom systems: expanded costumes, seasonal collections, Combat Power rankings, Revelation skills, Season Pass, promo codes, and two-way Discord chat. Economy: world trading with two currencies and a server-side donation shop that requires no client edits. Two purchase options ① Server pack source code Essence protocol 563 source code with the implemented mechanics and custom features, for use in your own project. ② The entire project The server pack with source code, game client, all web components, donation system, Telegram bot, and all existing configured integrations — transferred in their current state. We will show the project, its web components, and connected systems privately, and discuss the exact scope of the transfer. Free lifetime support All official content and custom features already included in the server pack are covered by free lifetime support, with no monthly fees. Additional custom development is discussed separately. Serious buyers only For serious investors and server administrators with the budget to purchase and develop the project. This is not a low-budget offer. Pricing for both options is discussed privately. Please specify whether you are interested in source code or the complete project. ✉️ CONTACT US ON TELEGRAM — @L2scripts 📄 VIEW THE FULL PRESENTATION — FEATURES & SCREENSHOTS
    • I've found the Conquest maps and Marketplace flipping to be the most reliable for me. Don't sleep on those Diamond Quest challenges either, just watch that 10% tax carefully.
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..