Jump to content

[Share]Kill The RaidBoss & King of the hill events!


xMaylox

Recommended Posts

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>

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

  • 2 months later...

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Posts

    • How's the project doing? Is there any news? It really interesting 🤔
    • thx for answer, i tried and woks encrypting, but i still having crashes 😞 i changed the icon in skillgrp.dat from "icon.skill0003" to "Myicons.misil" as i saved the file before endec and nothing. this is the report i got
    • New Season coming May 2024! First post updated      Website: L2Kain.net  Discord: https://discord.gg/l2kain  Wiki: https://info.kain.ws/   Important Dates   Server Start: TBD  Open Beta Test: 10th of May 2024!   Basic Information     Briefly about the concept of the server! We decided to move away from the standard Mid-Rate server concept and keep the mechanics of our beloved Lineage 2 that everyone loves! Massive battles for epic bosses, battles for profitable farming locations, resource spoilage and equipment crafting, daily instances, a balanced economy and much more. This server is build as a Craft-PvP concept. The goal is to gather players with a variety of preferences in the game and make a high-quality and interesting server with alternative character development options. We are well aware that "grinding" is an integral part of the game, but we diluted the boring and the same type of farming with interesting solutions and non-standard mechanics!   We have prepared a new High Five x25 on Modern Client for you. This server will be another step in the development of the platform and the project as a whole! Your appeals to those. support was not ignored, which means the new server will be even better than the previous one!      ⭐ Promotions and Bonuses for new players!     ⭐ Events and Giveaways daily!   ⭐ Rewards for Voting!   ℹ️ Server Rates Learn more about server rates! Server rates are configured in such a way that farming is best rewarded. Adena, drops, quests, various rewards and prices in the game store are well balanced among themselves!   Basic Server Rates:  ⭐ Experience & Skill Points - x25  ⭐ Adena Drop - x15 & Fixed Chance 66%  ⭐ Drop Rates - x10  ⭐ Spoil Rates - x10   Crafting keys, recipes drop & spoil with fixed amount from 2 to 3 and increased chances on all locations and quests  related to farm them.  ⭐ Quest Rates - x5  ⭐ Fortresses & Sieges - x5  ⭐ Raid Bosses & Epic Bosses - x1  ⭐ Weight Limit - x10      Connect with Us:  Discord: https://discord.gg/l2kain  Facebook: https://www.facebook.com/KainLineage2  TikTok: https://www.tiktok.com/@l2kain.net  YouTube: https://www.youtube.com/@Lineage2Kain
  • Topics

×
×
  • Create New...