Advertisement
Guest User

Untitled

a guest
Dec 20th, 2010
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 55.26 KB | None | 0 0
  1. import sys
  2. from java.lang import System
  3. from com.l2jserver import Config
  4. from com.l2jserver  import L2DatabaseFactory
  5. from com.l2jserver.gameserver.cache import HtmCache
  6. from com.l2jserver.gameserver.model.quest import State
  7. from com.l2jserver.gameserver.model.quest import QuestState
  8. from com.l2jserver.gameserver.model.quest.jython import QuestJython as JQuest
  9. from com.l2jserver.gameserver.model.actor.instance import L2PcInstance
  10. from com.l2jserver.gameserver.model.base import ClassId
  11. from com.l2jserver.gameserver.model.base import Race
  12. from com.l2jserver.gameserver.datatables import SkillTable
  13. from com.l2jserver.gameserver.datatables import SkillTreeTable
  14. from com.l2jserver.gameserver.datatables import ClanTable
  15. from com.l2jserver.gameserver.datatables import ItemTable
  16. from com.l2jserver.gameserver.datatables import CharTemplateTable
  17. from com.l2jserver.gameserver.datatables import HennaTreeTable
  18. from com.l2jserver.gameserver.instancemanager import QuestManager
  19. from com.l2jserver.gameserver.instancemanager import TownManager
  20. from com.l2jserver.gameserver.instancemanager import CastleManager
  21. from com.l2jserver.gameserver.instancemanager import FortManager
  22. from com.l2jserver.gameserver.instancemanager import FortSiegeManager
  23. from com.l2jserver.gameserver.instancemanager import SiegeManager
  24. from com.l2jserver.gameserver.model.olympiad import Olympiad
  25. from com.l2jserver.gameserver.network import SystemMessageId
  26. from com.l2jserver.gameserver.network.serverpackets import SystemMessage
  27. from com.l2jserver.gameserver.network.serverpackets import NpcHtmlMessage
  28. from com.l2jserver.gameserver.network.serverpackets import SetSummonRemainTime
  29. from com.l2jserver.gameserver.network.serverpackets import SetupGauge
  30. from com.l2jserver.gameserver.network.serverpackets import MagicSkillLaunched
  31. from com.l2jserver.gameserver.network.serverpackets import MagicSkillUse
  32. from com.l2jserver.gameserver.network.serverpackets import AcquireSkillList
  33. from com.l2jserver.gameserver.network.serverpackets import AcquireSkillDone
  34. from com.l2jserver.gameserver.network.serverpackets import HennaEquipList
  35. from com.l2jserver.gameserver.network.serverpackets import HennaRemoveList
  36. from com.l2jserver.gameserver.network.serverpackets import AcquireSkillDone
  37. 44
  38. ##############################
  39. GM_RELOAD_PANEL = True       #
  40. ##############################
  41. GM_ACCESS_LEVEL = 127        #
  42. ##############################
  43. ALLOW_VIP = False            #
  44. ##############################
  45. VIP_ACCESS_LEVEL = 1         #
  46. ##############################
  47. CLASSMASTER_GIFT = 57        #
  48. ##############################
  49. CLASSMASTER_ITEM_COUNT = 1000 #
  50. ##############################
  51. REQUEST_ITEMS_FOR_SUB = False #
  52. ##############################
  53. SUB_REQ_ITEM = 3483          #
  54. ##############################
  55. SUB_AMOUNT_ITEM = 100        #
  56. ##############################
  57. NOBLE_ITEMID = 6673          #
  58. ##############################
  59. NOBLE_ITEM_COUNT = 10000        #
  60. ##############################
  61. NOBLE_LEVEL = 80             #
  62. ##############################
  63. NOBLESS_TIARA = 7694         #
  64. ##############################
  65. ALLOW_KARMA_PLAYER = False   #
  66. ##############################
  67. FREE_TELEPORT = False        #
  68. ##############################
  69. FREE_BUFFS = False           #
  70. ##############################
  71. CONSUMABLE_ID = 57           #
  72. ##############################
  73. BUFFS_PRICE = 100000         #
  74. ##############################
  75. BUFF_REMOVE_PRICE = 10000    #
  76. ##############################
  77. HEAL_PRICE = 10000           #
  78. ##############################
  79. TIME_OUT = True              #
  80. ##############################
  81. TIME_OUT_TIME = 10           #
  82. ##############################
  83. BLOCK_TIME = 20              #
  84. ##############################
  85. DELAY = 3                    #
  86. ##############################
  87.  
  88. npcId         = 955
  89. QuestId       = 955
  90. QuestName     = "NpcService"
  91. QUEST_INFO    = str(QuestId)+"_"+QuestName
  92. QuestDesc     = "custom"
  93.  
  94. print "============================="
  95. print "INFO LOADED SERVICES MANAGER"
  96. print "============================="
  97.  
  98. def MainHtml3(st) :
  99.     MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  100.     MAIN_HTML += "<br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  101.     MAIN_HTML += "<font color=\"3366FF\"> Subclass Master Opciones </font><br><br>"
  102.     if st.player.getTotalSubClasses() == 0 and REQUEST_ITEMS_FOR_SUB == True:
  103.         MAIN_HTML += "<font color=\"FFFFFF\">If you want to add any Subclass, your<br1>current occupation must be second or<br1>third, reach level <font color=\"FFFF00\">"+str(75)+" or above</font> and get<br1><font color=\"FFFF00\">"+str(SUB_AMOUNT_ITEM)+" "+getitemname(SUB_REQ_ITEM)+"</font>.</font><br>"
  104.     if st.player.getTotalSubClasses() < Config.MAX_SUBCLASS :
  105.         MAIN_HTML += "<button value=\"Add Subclass\" action=\"bypass -h Quest " +QUEST_INFO+ " getracemenu addsub 0 0\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><br>"
  106.     if st.player.getTotalSubClasses() > 0 :
  107.         MAIN_HTML += "<button value=\"Change Subclass\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass changesub 0 0\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><br>"
  108.         MAIN_HTML += "<button value=\"Remove Subclass\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass deletesub 0 0\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><br>"
  109.     MAIN_HTML += "<br><font color=\"303030\">"+getmaster()+"</font>"   
  110.     MAIN_HTML += "</center></body></html>"
  111.     return MAIN_HTML
  112.  
  113. def MainHtml4(st) :
  114.     MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  115.     MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  116.     MAIN_HTML += "<font color=\"3366FF\"> Clan Options </font><br><br1>"
  117.     if st.player.getClanId() == 0:
  118.         MAIN_HTML += "<button value=\"Create New Clan\" action=\"bypass -h Quest " +QUEST_INFO+ " createclan 0 0 0\" width=140 height=30 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  119.     else:
  120.         MAIN_HTML += "<button value=\"Delegate Clan Leader\" action=\"bypass -h Quest " +QUEST_INFO+ " giveclanl 0 0 0\" width=140 height=30 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  121.         MAIN_HTML += "<button value=\"Increase Clan Level\" action=\"bypass -h Quest " +QUEST_INFO+ " increaseclan 0 0 0\" width=140 height=30 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  122.         MAIN_HTML += "<button value=\"Disband Clan\" action=\"bypass -h Quest " +QUEST_INFO+ " DisbandClan 0 0 0\" width=140 height=30 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  123.         MAIN_HTML += "<button value=\"Restore Clan\" action=\"bypass -h Quest " +QUEST_INFO+ " RestoreClan 0 0 0\" width=140 height=30 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  124.         MAIN_HTML += "<button value=\"Acquire Clan Skill\" action=\"bypass -h Quest " +QUEST_INFO+ " learn_clan_skills 0 0 0\" width=140 height=30 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  125.         MAIN_HTML += "<br><font color=\"3366FF\"> Alliance Options </font><br><br1>"
  126.         clan=st.player.getClan()
  127.         if clan.getAllyId() == 0:
  128.             MAIN_HTML += "<button value=\"Create a Alliance\" action=\"bypass -h Quest " +QUEST_INFO+ " createally 0 0 0\" width=115 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  129.         else:
  130.             MAIN_HTML += "<button value=\"Dissolve Alliance\" action=\"bypass -h Quest " +QUEST_INFO+ " dissolve_ally 0 0 0\" width=115 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  131.     MAIN_HTML += "<br><font color=\"303030\">"+getmaster()+"</font>"   
  132.     MAIN_HTML += "</center></body></html>"
  133.     return MAIN_HTML
  134.  
  135. def RaceMenu(st,case,case2) :
  136.     temp = st.player.getRace().ordinal()
  137.     if temp == 5:
  138.         return subclassopcions(st, case, "5", case2)
  139.     else:
  140.         MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  141.         MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  142.         MAIN_HTML += "<font color=\"3366FF\"> Chooce a Race </font><br><br1>"
  143.         MAIN_HTML += "<button value=\"Human\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass "+case+" 0 "+case2+"\" width=115 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  144.         if temp != 2: MAIN_HTML += "<button value=\"Elf\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass "+case+" 1 "+case2+"\" width=115 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  145.         if temp != 1: MAIN_HTML += "<button value=\"Dark Elf\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass "+case+" 2 "+case2+"\" width=115 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  146.         MAIN_HTML += "<button value=\"Orc\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass "+case+" 3 "+case2+"\" width=115 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  147.         MAIN_HTML += "<button value=\"Dwarf\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass "+case+" 4 "+case2+"\" width=115 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  148.         MAIN_HTML += "<br><font color=\"303030\">"+getmaster()+"</font>"
  149.         MAIN_HTML += "</center></body></html>"
  150.         return MAIN_HTML
  151.  
  152. def NobleMenu(st):
  153.     MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  154.     MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  155.     MAIN_HTML += "<font color=\"3366FF\"> Noblesse Manager </font><br><br>"
  156.     MAIN_HTML += "<table border=\"0\" cellspacing=\"0\">"
  157.     MAIN_HTML += "<tr><td valign=top><img src=icon.skill0325 width=32 height=32 align=left></td><td valign=top><img src=icon.skill0326 width=32 height=32 align=left></td>"
  158.     MAIN_HTML += "<td valign=top><img src=icon.skill0327 width=32 height=32 align=left></td><td valign=top><img src=icon.skill1323 width=32 height=32 align=left></td>"
  159.     MAIN_HTML += "<td valign=top><img src=icon.skill1324 width=32 height=32 align=left></td><td valign=top><img src=icon.skill1325 width=32 height=32 align=left></td>"
  160.     MAIN_HTML += "<td valign=top><img src=icon.skill1326 width=32 height=32 align=left></td><td valign=top><img src=icon.skill1327 width=32 height=32 align=left></td></tr>"
  161.     MAIN_HTML += "</table><br><br><br>"
  162.     MAIN_HTML += "<font color=\"FFFFFF\">If you want to be Noblesse first you need<br1>reach level <font color=\"FFFF00\">"+str(NOBLE_LEVEL)+"</font> and get <font color=\"FFFF00\">"+str(NOBLE_ITEM_COUNT)+" "+getitemname(NOBLE_ITEMID)+"</font>.</font><br><br1>"
  163.     MAIN_HTML += "<button value=\"I'm ready, make me noblesse\" action=\"bypass -h Quest " +QUEST_INFO+ " getnoble 2 0 0\" width=200 height=30 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  164.     MAIN_HTML += "<br><font color=\"303030\">"+getmaster()+"</font>"
  165.     MAIN_HTML += "</center></body></html>"
  166.     return MAIN_HTML  
  167.  
  168. def getitemname(case):
  169.     try: val =ItemTable.getInstance().createDummyItem(case).getItemName()
  170.     except: val = "0"
  171.     return val
  172.  
  173. def getnames(case):
  174.     try: val = CharTemplateTable.getInstance().getClassNameById(case)
  175.     except: val = "0"
  176.     return val
  177.  
  178. def getmaster():
  179.     xi="vice";xe="";xf="";xg="";xa="Lineage 2 Sephion";xb="";xc=" ";xd="";xk="ger";xh="Ser";xj="Mana";val=xa+xb+xc+xd+xe+xe+xf+xg
  180.     return val
  181.  
  182. def showText(type,text) :
  183.     MESSAGE = "<html><head><title>SERVICES MANAGER</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  184.     MESSAGE += "<font color=\"LEVEL\">"+type+"</font><br>"+text+"<br>"
  185.     MESSAGE += "<font color=\"303030\">"+getmaster()+"</font></center></body></html>"
  186.     return MESSAGE
  187.  
  188. def addTimeout(st,gaugeColor,amount,offset) :
  189.     endtime = int(System.currentTimeMillis()/1000) + amount
  190.     st.set("blockUntilTime",str(endtime))
  191.     st.getPlayer().sendPacket(SetupGauge(gaugeColor, amount * 1000 + offset))
  192.     return True
  193.  
  194. def ReloadConfig(st,npcid) :
  195.     try:
  196.         HtmCache.getInstance().reload(Config.DATAPACK_ROOT)
  197.         if QuestManager.getInstance().reload(QuestId): st.player.sendMessage("The Script and Htmls have been reloaded successfully.")
  198.         else: st.player.sendMessage("Script Reloaded Failed. you edited something wrong! :P, fix it and restart the server")
  199.                
  200.     except: st.player.sendMessage("Script Reloaded Failed. you edited something wrong! :P, fix it and restart the server")
  201.     filename = "data/html/teleporter/mainhtmls/mainhtml-0.htm"
  202.     html = NpcHtmlMessage(int(npcid))  
  203.     html.setFile(None,filename)
  204.     html.replace("%objectId%", npcid)
  205.     st.player.sendPacket(html)
  206.  
  207. def optionsymbol(st, cases,num):
  208.     if cases == "draws":
  209.         henna = HennaTreeTable.getInstance().getAvailableHenna(st.player.getClassId())
  210.         hel = HennaEquipList(st.player, henna)
  211.         st.player.sendPacket(hel)
  212.     elif cases == "deletes":
  213.         hasHennas = False
  214.         for i in range(3):
  215.             henna = st.player.getHenna(i+1)
  216.             if henna != None: hasHennas = True
  217.         if hasHennas == True:
  218.             st.player.sendPacket(HennaRemoveList(st.player))
  219.             return
  220.         else:
  221.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  222.             MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You don't have any symbol to remove!</font><br>"
  223.             MAIN_HTML += "</center></body></html>"
  224.             return MAIN_HTML
  225.  
  226. def heal(st,case) :
  227.     if st.player.isInCombat() :
  228.         return False
  229.     if case == "0":
  230.         st.getPlayer().getStatus().setCurrentHp(st.getPlayer().getStat().getMaxHp())
  231.         st.getPlayer().getStatus().setCurrentMp(st.getPlayer().getStat().getMaxMp())
  232.         st.getPlayer().getStatus().setCurrentCp(st.getPlayer().getStat().getMaxCp())
  233.  
  234.     if case == "1" and st.player.getPet() != None :
  235.         st.player.getPet().getStatus().setCurrentHp(st.player.getPet().getStat().getMaxHp())
  236.         st.player.getPet().getStatus().setCurrentMp(st.player.getPet().getStat().getMaxMp())
  237.         try:
  238.             st.player.getPet().setCurrentFed(st.player.getPet().getMaxFed())
  239.             st.player.sendPacket(SetSummonRemainTime(st.player.getPet().getMaxFed(), st.player.getPet().getCurrentFed()))
  240.         except:
  241.             try:
  242.                 st.player.getPet().decTimeRemaining(st.player.getPet().getTimeRemaining() - st.player.getPet().getTotalLifeTime())
  243.                 st.player.sendPacket(SetSummonRemainTime(st.player.getPet().getTotalLifeTime(), st.player.getPet().getTimeRemaining()))
  244.             except: pass
  245.     return True
  246.  
  247. def classmaster(st):
  248.     classId = st.player.getClassId()
  249.     level = st.player.getLevel()
  250.     jobLevel= classId.level()
  251.     newJobLevel = jobLevel + 1
  252.     MAIN_HTML = "<html><title>Class Master</title><body><center>"
  253.    
  254.     if jobLevel ==2 and level > 75 or jobLevel ==1 and level > 39 or jobLevel ==0 and level > 19:
  255.         MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  256.         MAIN_HTML += "<font color=\"3366FF\">Change Subclass:<br1>Which class do you wish to change?</font><br><br1>"
  257.         for child in ClassId.values():
  258.             if child.childOf(classId) and child.level() == newJobLevel:
  259.                 MAIN_HTML += "<button value=\""+getnames(child.getId())+"\" action=\"bypass -h Quest " +QUEST_INFO+ " changeclass "+str(child.getId())+" 0 0 0\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  260.     else:
  261.         if jobLevel ==0 and level < 20: MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">Come back here when you reach level 20<br1>to change your class.</font><br>"
  262.         elif jobLevel <=1 and level < 40: MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">Come back here when you reach level 40<br1>to change your class.</font><br>"
  263.         elif jobLevel <=2 and level < 76: MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">Come back here when you reach level 76<br1>to change your class.</font><br>"
  264.         else: MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">There is no class change available<br>for you anymore.</font><br>"
  265.     MAIN_HTML += "</center></body></html>"
  266.     return MAIN_HTML
  267.  
  268. def subclasslist(st,cases,case2,index) :
  269.     if st.player.getLevel() < 75 and int(index) == 0 or st.getPlayer().getClassId().level() < 2:
  270.         HTML = "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You cannot add a new subclass!<br1>First your current occupation must be<br1>second or third job and all of your sub<br1>classes must be at level 75 or above.</font><br>"
  271.         return HTML
  272.  
  273.     currentBaseId = st.player.getBaseClass()
  274.     baseCID = ClassId.values()[currentBaseId]
  275.     if baseCID.level() > 2: baseClassId = baseCID.getParent().ordinal()
  276.     else: baseClassId = currentBaseId
  277.     num = 0
  278.     if baseClassId in [5,6,20,33]: subclasses = [5,6,20,33,57,51]
  279.     elif baseClassId in [8,23,36]: subclasses = [8,23,36,57,51]
  280.     elif baseClassId in [9,24,37]: subclasses = [9,24,37,57,51]
  281.     elif baseClassId in [12,27,40]: subclasses = [12,27,40,57,51]
  282.     else: subclasses = [baseClassId,57,51]
  283.     for i in range(Config.MAX_SUBCLASS):
  284.         if st.player.getSubClasses().containsKey(i+1):
  285.             if st.player.getSubClasses().get(i+1).getLevel() < 75 and int(index) == 0:
  286.                 HTML = "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You cannot add a new subclass!<br1>First your current occupation must be<br1>second or third job and all of your sub<br1>classes must be at level 75 or above.</font><br>"
  287.                 return HTML
  288.             temp = ClassId.values()[st.player.getSubClasses().get(i+1).getClassId()]
  289.             if temp.level() > 2: subclasses += [temp.getParent().ordinal()]
  290.             else: subclasses += [temp.getId()]
  291.  
  292.     HTML = "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  293.     if int(index) == 0: HTML += "<font color=\"3366FF\">Add Subclass:<br>Which subclass do you wish to add?</font><br><br1>"
  294.     if int(index) > 0: HTML += "<font color=\"3366FF\">Please<br>select a new subclass to change.</font><br1><font color=\"LEVEL\">Warning!</font> Your previous subclass and all the skills will be removed."
  295.    
  296.     for child in ClassId.values():
  297.         if child.getRace() == Race.values()[int(case2)] and child.level() == 2 and child.getId() not in subclasses:
  298.             num = 1
  299.             HTML += "<button value=\""+getnames(child.getId())+"\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass "+cases+" "+str(child.getId())+" "+index+"\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  300.     if num == 0:
  301.         HTML = "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">There are no available subclasses at this moment.</font><br>"
  302.     return HTML
  303.  
  304. def subclassopcions(st,cases,id,index) :  
  305.     if st.player.isCastingNow() or st.player.isAllSkillsDisabled():
  306.         st.player.sendPacket(SystemMessage(SystemMessageId.SUBCLASS_NO_CHANGE_OR_CREATE_WHILE_SKILL_IN_USE))
  307.         return
  308.        
  309.     if Olympiad.getInstance().isRegistered(st.player):
  310.         st.player.sendMessage("You have already been registered in a Olympiad game.")
  311.         return
  312.        
  313.     if cases == "addsub":
  314.         if st.player.getTotalSubClasses() >= Config.MAX_SUBCLASS :
  315.             if TIME_OUT == True:
  316.                 if addTimeout(st,3,BLOCK_TIME,300) : pass
  317.                     st.player.sendMessage("You can now only change one of your current sub classes.")
  318.                         return
  319.         else:
  320.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  321.             MAIN_HTML += subclasslist(st,"acceptsub",id,"0")
  322.             MAIN_HTML += "</center></body></html>"
  323.             return MAIN_HTML
  324.  
  325.     if cases == "acceptsub":
  326.             if REQUEST_ITEMS_FOR_SUB == True and st.player.getTotalSubClasses() == 0:
  327.                 if st.getQuestItemsCount(SUB_REQ_ITEM) < SUB_AMOUNT_ITEM:
  328.                     return showText("Sorry","You don't have the required items!<br>You will need: <font color =\"LEVEL\">"+str(SUB_AMOUNT_ITEM)+" "+getitemname(SUB_REQ_ITEM)+"</font><br>to add any subclass")                
  329.                 else: st.takeItems(SUB_REQ_ITEM,SUB_AMOUNT_ITEM)
  330.             if not st.player.addSubClass(int(id),st.player.getTotalSubClasses() + 1):
  331.                 st.player.sendMessage("The sub class could not be added.")
  332.                 return
  333.             st.player.setActiveClass(st.player.getTotalSubClasses())
  334.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  335.             MAIN_HTML += "<br><br>Add Subclass:<br>The sub class of <font color=\"LEVEL\">"+getnames(int(id))+"</font><br> has been added.<br>"
  336.             MAIN_HTML += "</center></body></html>"
  337.             st.player.sendPacket(SystemMessage(SystemMessageId.CLASS_TRANSFER))
  338.             return MAIN_HTML
  339.  
  340.     if cases == "acceptchangesub":
  341.             if not st.player.setActiveClass(int(index)):
  342.             if TIME_OUT == True:
  343.                 if addTimeout(st,3,BLOCK_TIME,300) : pass
  344.                     st.player.sendMessage("The sub class could not be changed.")
  345.                         return
  346.         else:
  347.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  348.             MAIN_HTML += "<br><br>Change Subclass:<br>Your active class is now a:<br><font color=\"LEVEL\">"+getnames(int(id))+"</font>"
  349.             MAIN_HTML += "</center></body></html>"
  350.             st.player.sendPacket(SystemMessage(SystemMessageId.ADD_NEW_SUBCLASS))
  351.             if TIME_OUT == True:
  352.                 if addTimeout(st,3,BLOCK_TIME,300) : pass
  353.             return MAIN_HTML
  354.  
  355.     if cases == "changesub":
  356.  
  357.             if st.player.getTotalSubClasses() > Config.MAX_SUBCLASS :
  358.                     st.player.sendMessage("You can now only delete one of your current sub classes.")
  359.             if TIME_OUT == True:
  360.                 if addTimeout(st,3,BLOCK_TIME,300) : pass
  361.                         return
  362.         else:
  363.             j=0
  364.             MAIN_HTML = "<html><title>AIO Grand Master</title><body><center>"
  365.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  366.             MAIN_HTML += "<font color=\"3366FF\">Change Subclass:<br1>Which sub class do you wish to change?</font><br>"
  367.             if st.player.isSubClassActive():
  368.                 j=1
  369.                 MAIN_HTML += "<font color=\"LEVEL\">Main-class</font>"
  370.                 MAIN_HTML += "<button value=\""+getnames(st.player.getBaseClass())+"\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass acceptchangesub "+str(st.player.getBaseClass())+" 0\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><br>"
  371.             for i in range(Config.MAX_SUBCLASS):
  372.                 if st.player.getSubClasses().containsKey(i+1):
  373.                     xsubclassid = st.player.getSubClasses().get(i+1).getClassId()  
  374.                     if int(st.player.getClassId().getId()) != xsubclassid:
  375.                         j=i+1
  376.                         MAIN_HTML += "<font color=\"LEVEL\">Sub-class "+str(i+1)+"</font>"
  377.                         MAIN_HTML += "<button value=\""+getnames(xsubclassid)+"\" action=\"bypass -h Quest " +QUEST_INFO+ " subclass acceptchangesub "+str(xsubclassid)+" "+str(i+1)+"\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  378.             if j == 0:
  379.                 MAIN_HTML = "<html><title>AIO Grand Master</title><body><center>"
  380.                 MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">There are no sub classes available<br>to change at this time.</font><br>"
  381.                 if TIME_OUT == True:
  382.                     if addTimeout(st,3,BLOCK_TIME,300) : pass    
  383.             MAIN_HTML += "</center></body></html>"
  384.             return MAIN_HTML
  385.  
  386.     if cases == "deletesub":
  387.  
  388.             if st.player.getTotalSubClasses() > Config.MAX_SUBCLASS :
  389.             if TIME_OUT == True:
  390.                 if addTimeout(st,3,BLOCK_TIME,300) : pass
  391.                     st.player.sendMessage("You can now only delete one of your current sub classes.")
  392.                         return
  393.         else:
  394.             j=0
  395.             MAIN_HTML = "<html><title>AIO Grand Master</title><body><center>"
  396.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"
  397.             MAIN_HTML += "<font color=\"3366FF\">Which sub class do you wish to delete?</font><br>"
  398.             for i in range(Config.MAX_SUBCLASS):
  399.                 if st.player.getSubClasses().containsKey(i+1):
  400.                     j=i+1
  401.                     MAIN_HTML += "<font color=\"LEVEL\">Sub-class "+str(i+1)+"</font>"
  402.                     MAIN_HTML += "<button value=\""+getnames(st.player.getSubClasses().get(i+1).getClassId())+"\" action=\"bypass -h Quest " +QUEST_INFO+ " getracemenu acceptnewsub "+str(i+1)+" 0\" width=120 height=23 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"
  403.             MAIN_HTML += "<br>If you change a sub class, you'll start at level 40<br1>after the 2nd class transfer."
  404.             if j == 0:
  405.                 MAIN_HTML = "<html><title>AIO Grand Master</title><body><center>"
  406.                 MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">There are no sub classes available<br>to delete at this time.</font><br>"
  407.                 if TIME_OUT == True:
  408.                     if addTimeout(st,3,BLOCK_TIME,300) : pass
  409.             MAIN_HTML += "</center></body></html>"
  410.             return MAIN_HTML
  411.  
  412.     if cases == "acceptnewsub":
  413.         MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  414.         MAIN_HTML += subclasslist(st,"acceptdelsub",id,index)
  415.         MAIN_HTML += "</center></body></html>"
  416.         return MAIN_HTML  
  417.  
  418.     if cases == "acceptdelsub":
  419.         if st.player.modifySubClass(int(index), int(id)):
  420.                         st.player.stopAllEffects()
  421.                         st.player.setActiveClass(int(index))
  422.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  423.             MAIN_HTML += "<br><br>Change Subclass:<br>Your sub class has been changed to<br1><font color=\"LEVEL\">"+getnames(int(id))+"</font>"
  424.             MAIN_HTML += "</center></body></html>"
  425.             st.player.sendPacket(SystemMessage(SystemMessageId.ADD_NEW_SUBCLASS))
  426.             if TIME_OUT == True:
  427.                 if addTimeout(st,3,BLOCK_TIME,300) : pass
  428.             return MAIN_HTML
  429.                 else:
  430.                         player.setActiveClass(0)
  431.             if TIME_OUT == True:
  432.                 if addTimeout(st,3,BLOCK_TIME,300) : pass
  433.                         st.player.sendMessage("The sub class could not be added, you have been reverted to your base class.")
  434.                         return
  435.                        
  436. def reloadPvpPkList(self) :
  437.     con = L2DatabaseFactory.getInstance().getConnection()
  438.     pvps = con.prepareStatement("SELECT char_name,pvpkills,pkkills FROM characters WHERE pvpkills>0 and accesslevel=0 OR pvpkills>0 and accesslevel="+str(VIP_ACCESS_LEVEL)+" ORDER BY pvpkills DESC,pkkills DESC,char_name LIMIT 100")
  439.     pvprs = pvps.executeQuery()
  440.     self.htmltext1 = []; htmlt1 = ""; i=0; j=0
  441.  
  442.     while (pvprs.next()) :
  443.         i+=1;j+=1
  444.         htmlt1 += "<tr><td width=40 align=\"center\"><font color =\"FFFFFF\">" + str(i) + "</td><td width=100 align=\"left\"><font color =\"FFFFFF\">" + pvprs.getString("char_name") +"</td><td width=30 align=\"left\"><font color =\"3366FF\">" + pvprs.getString("pvpkills") + "</td><td width=30 align=\"left\"><font color =\"FFFFFF\">" + pvprs.getString("pkkills") + "</td></tr>"
  445.         if j == 20:
  446.             self.htmltext1 += [htmlt1]
  447.  
  448.     if j > 0 : self.htmltext1 += [htmlt1]
  449.     self.pvppage = len(self.htmltext1)
  450.  
  451.     pks = con.prepareStatement("SELECT char_name,pvpkills,pkkills FROM characters WHERE pkkills>0 and accesslevel=0 OR pkkills>0 and accesslevel="+str(VIP_ACCESS_LEVEL)+" ORDER BY pkkills DESC,pvpkills DESC,char_name LIMIT 100")
  452.     pkrs = pks.executeQuery()
  453.     self.htmltext2 = []; htmlt2 = ""; i=0; j=0
  454.  
  455.     while (pkrs.next()) :
  456.         i+=1;j+=1
  457.         htmlt2 += "<tr><td width=40 align=\"center\"><font color =\"FFFFFF\">" + str(i) + "</td><td width=100 align=\"left\"><font color =\"FFFFFF\">" + pkrs.getString("char_name") +"</td><td width=30 align=\"left\"><font color =\"FFFFFF\">" + pkrs.getString("pvpkills") + "</td><td width=30 align=\"left\"><font color =\"3366FF\">" + pkrs.getString("pkkills") + "</td></tr>"
  458.         if j == 20:
  459.             self.htmltext2 += [htmlt2]
  460.             j = 0; htmlt2 = ""
  461.  
  462.     if j > 0 : self.htmltext2 += [htmlt2]
  463.     self.pkpage = len(self.htmltext2)
  464.  
  465.     try:
  466.         pvps.close()
  467.         pks.close()
  468.         pvprs.close()
  469.         pkrs.close()
  470.         con.close()
  471.     except : pass
  472.     return True
  473.  
  474. class Quest (JQuest) :
  475.    
  476.     def __init__(self,id,name,descr):
  477.         JQuest.__init__(self,id,name,descr)
  478.         self.Reload_PvpPk_Time = 0
  479.  
  480.     def onAdvEvent (self,event,npc,player) :
  481.         try: st = player.getQuestState(QUEST_INFO)
  482.         except: return
  483.         tempevent = event
  484.        
  485.         if event.startswith("gototeleport"):
  486.             event = event.replace("]","")
  487.             event = event.replace("["," ")
  488.             varSplit = event.split(" ")
  489.             try: noblesGK = int(varSplit[2])
  490.             except : noblesGK = 0
  491.             if st.player.isGM() == 1 :
  492.                 try:
  493.                     st.player.teleToLocation(int(varSplit[5]), int(varSplit[6]), int(varSplit[7]), True)
  494.                     st.player.sendMessage("You have been teleported to " + varSplit[5] +" "+varSplit[6]+ " "+varSplit[7])
  495.                 except : st.player.sendMessage("You should check the coordinates. Something is wrong!")
  496.                 return
  497.  
  498.             if noblesGK == 1 and st.player.isNoble() == 0 :
  499.                 return showText("Sorry","Only a <font color =\"LEVEL\">Noblesse</font> can be teleported to this place")
  500.  
  501.             if noblesGK > 1 and st.player.isGM() == 0 :
  502.                 return showText("Sorry","Only a <font color =\"LEVEL\">GM</font> can be teleported to this place")
  503.  
  504.             else:
  505.                 newevent="confteleport["+varSplit[3]+"]["+varSplit[4]+"] "+varSplit[5]+" "+varSplit[6]+" "+varSplit[7]
  506.                 filename = "data/html/teleporter/gatekeeper/confirmation.htm"
  507.                 html = NpcHtmlMessage(npc.getObjectId())   
  508.                 html.setFile(None,filename)
  509.                 html.replace("%place%", varSplit[1].replace("-"," "))
  510.                 html.replace("%itemName%", getitemname(int(varSplit[3])))
  511.                 html.replace("%reqitem%", varSplit[4])
  512.                 html.replace("%event%", newevent)
  513.                 html.replace("%objectId%", str(npc.getObjectId()))
  514.                 st.player.sendPacket(html)
  515.             return
  516.                
  517.         event = event.replace(","," ")
  518.         eventSplit = event.split(" ")
  519.         event = eventSplit[0]
  520.         eventParam1 = eventSplit[1]
  521.         eventParam2 = eventSplit[2]
  522.         eventParam3 = eventSplit[3]
  523.  
  524.         if event == "reloadscript": return ReloadConfig(st,eventParam1)
  525.  
  526.         if event.startswith("confteleport"):
  527.             event = event.replace("]","")
  528.             event = event.replace("["," ")
  529.             GKSplit = event.split(" ")
  530.             try: TELEPORT_ITEM_ID = int(GKSplit[1]); TELEPORT_PRICE = int(GKSplit[2])
  531.             except : TELEPORT_ITEM_ID = 57; TELEPORT_PRICE = 15000
  532.        
  533.             if SiegeManager.getInstance().getSiege(int(eventParam1), int(eventParam2), int(eventParam3)) != None:
  534.                 st.player.sendPacket(SystemMessage(SystemMessageId.NO_PORT_THAT_IS_IN_SIGE))
  535.                 return
  536.             elif TownManager.townHasCastleInSiege(int(eventParam1), int(eventParam2)):
  537.                 st.player.sendPacket(SystemMessage(SystemMessageId.NO_PORT_THAT_IS_IN_SIGE))
  538.                 return
  539.             elif not Config.ALT_GAME_KARMA_PLAYER_CAN_USE_GK and st.player.getKarma() > 0:
  540.                 st.player.sendMessage("Go away, you're not welcome here.")
  541.                 return
  542.             elif st.player.isAlikeDead():
  543.                 return
  544.             if FREE_TELEPORT == False :
  545.                 if st.getQuestItemsCount(TELEPORT_ITEM_ID) < TELEPORT_PRICE :
  546.                     return showText("Sorry","You don't have enough Items:<br>You need: <font color =\"LEVEL\">"+str(TELEPORT_PRICE)+" "+getitemname(TELEPORT_ITEM_ID)+"!")
  547.                 else :
  548.                     st.takeItems(TELEPORT_ITEM_ID,TELEPORT_PRICE)
  549.                     st.player.teleToLocation(int(eventParam1), int(eventParam2), int(eventParam3), True)
  550.                     st.player.sendMessage("You have been teleported to " + eventParam1 +" "+eventParam2+ " "+eventParam3)
  551.             else:
  552.                 st.player.teleToLocation(int(eventParam1), int(eventParam2), int(eventParam3), True)
  553.                 st.player.sendMessage("You have been teleported to " + eventParam1 +" "+eventParam2+ " "+eventParam3)  
  554.  
  555.         if event == "heal" :
  556.             if int(System.currentTimeMillis()/1000) > st.getInt("blockUntilTime"):
  557.                 if st.getQuestItemsCount(CONSUMABLE_ID) < HEAL_PRICE  :
  558.                     return showText("Sorry","You don't have the required Item.<br>You need: <font color =\"LEVEL\">"+str(HEAL_PRICE)+" "+str(getitemname(CONSUMABLE_ID))+"!")
  559.                 else :
  560.                     if heal(st,eventParam2) :pass                  
  561.                     st.takeItems(CONSUMABLE_ID,HEAL_PRICE)                 
  562.                     if TIME_OUT == True:
  563.                         if addTimeout(st,1,TIME_OUT_TIME,0): pass
  564.             filename = "data/html/teleporter/buffer/NpcBuffer-"+eventParam1+".htm"
  565.             html = NpcHtmlMessage(npc.getObjectId())   
  566.             html.setFile(None,filename)
  567.             html.replace("%objectId%", str(npc.getObjectId()))
  568.             st.player.sendPacket(html)
  569.            
  570.         if event == "removeBuffs" :
  571.             if int(System.currentTimeMillis()/1000) > st.getInt("blockUntilTime"):                     
  572.                 if st.getQuestItemsCount(CONSUMABLE_ID) < BUFF_REMOVE_PRICE :
  573.                     return showText("Sorry","You don't have the required Item.<br>You need: <font color =\"LEVEL\">"+str(BUFF_REMOVE_PRICE)+" "+str(getitemname(CONSUMABLE_ID))+"!")
  574.                 else :
  575.                     if eventParam2 == "Remove_Pet" :
  576.                         if st.player.getPet() != None :
  577.                             st.player.getPet().stopAllEffects()
  578.                     else :
  579.                         st.getPlayer().stopAllEffects()
  580.                                 if st.player.getCubics() != None:
  581.                                         for cubic in st.player.getCubics().values():  
  582.                                                 cubic.stopAction()
  583.                                                 st.player.delCubic(cubic.getId())  
  584.                     st.takeItems(CONSUMABLE_ID,BUFF_REMOVE_PRICE)
  585.                     if TIME_OUT == True:
  586.                         if addTimeout(st,2,TIME_OUT_TIME,0): pass
  587.             filename = "data/html/teleporter/buffer/NpcBuffer-"+eventParam1+".htm"
  588.             html = NpcHtmlMessage(npc.getObjectId())   
  589.             html.setFile(None,filename)
  590.             html.replace("%objectId%", str(npc.getObjectId()))
  591.             st.player.sendPacket(html)
  592.  
  593.         if event == "giveBuffs" :
  594.             if int(System.currentTimeMillis()/1000) > st.getInt("blockUntilTime"):
  595.                 temp = 0
  596.                 if eventParam2 != "Buff_Set" and eventParam2 != "Pet_Buff_Set":
  597.                     buffSplit = eventParam3.split("-")
  598.                     try: skill=SkillTable.getInstance().getInfo(int(buffSplit[1]),int(buffSplit[0]))
  599.                     except: st.player.sendMessage("This skill has an error. Contact a GM to be fixed")
  600.                     temp = 1
  601.                 else:
  602.                     listSplit = eventParam3.split("_")
  603.                     j=0;k=0
  604.                     while j == 0 :
  605.                         try: buff = listSplit[int(k)];k+=1
  606.                         except: temp = int(k);j=1
  607.  
  608.                 if FREE_BUFFS == False and eventParam2 != "Buff_Set" and eventParam2 != "Pet_Buff_Set":
  609.                     if st.getQuestItemsCount(CONSUMABLE_ID) < BUFFS_PRICE * temp:
  610.                         return showText("Sorry","You don't have the required items!<br>You will need: <font color =\"LEVEL\">"+str(BUFFS_PRICE * int(temp))+" "+getitemname(CONSUMABLE_ID)+"!")                
  611.                
  612.                 if eventParam2 == "Buff_Pet" :
  613.                     if st.player.getPet() != None :
  614.                         try : skill.getEffects(st.getPlayer().getPet(),st.getPlayer().getPet())
  615.                         except : st.player.sendMessage("This skill has an error. Contact a GM to be fixed")
  616.  
  617.                     else: return showText("Sorry","You can't buff your pet!<br>Summon it and try again!")
  618.  
  619.                 elif eventParam2 == "Pet_Buff_Set":
  620.                     if st.player.getPet() != None :                
  621.                         for i in range (temp) :
  622.                             buff = listSplit[int(i)]
  623.                             buffSplit = buff.split("-")
  624.                             Buff_lvl = buffSplit[0]
  625.                             Buff_Id = buffSplit[1]
  626.                             try : SkillTable.getInstance().getInfo(int(Buff_Id),int(Buff_lvl)).getEffects(st.getPlayer().getPet(),st.getPlayer().getPet())
  627.                             except : st.player.sendMessage("some skills have an error. Contact a GM to be fixed")
  628.                     else: return showText("Sorry","You can't buff your pet!<br>Summon it and try again!")
  629.  
  630.                 elif eventParam2 == "Buff_Cubic" :
  631.                             if st.player.getCubics() != None:
  632.                                     for cubic in st.player.getCubics().values():  
  633.                                             cubic.stopAction()
  634.                                             st.player.delCubic(cubic.getId())
  635.                     if st.getQuestItemsCount(skill.getItemConsumeId()) < skill.getItemConsume():
  636.                         return showText("Sorry","You don't have the required items!<br>You will need: <font color =\"LEVEL\">"+str(skill.getItemConsume())+" "+getitemname(skill.getItemConsumeId())+"!")
  637.                     try : st.getPlayer().useMagic(skill,False,False)
  638.                     except : st.player.sendMessage("This skill has an error. Contact a GM to be fixed")
  639.  
  640.                 elif eventParam2 == "Buff_Set":
  641.                     for i in range (temp) :
  642.                         buff = listSplit[int(i)]
  643.                         buffSplit = buff.split("-")
  644.                         Buff_lvl = buffSplit[0]
  645.                         Buff_Id = buffSplit[1]
  646.                         try : SkillTable.getInstance().getInfo(int(Buff_Id),int(Buff_lvl)).getEffects(st.getPlayer(),st.getPlayer())
  647.                         except : st.player.sendMessage("This skill has an error. Contact a GM to be fixed")
  648.                 else:
  649.                     try : skill.getEffects(st.getPlayer(),st.getPlayer())
  650.                     except : st.player.sendMessage("This skill has an error. Contact a GM to be fixed")
  651.  
  652.                 st.takeItems(CONSUMABLE_ID,BUFFS_PRICE*temp)
  653.                 if TIME_OUT == True:
  654.                     if int(temp) > 1:
  655.                         if eventParam2 == "Pet_Buff_Set" :
  656.                             if heal(st,"1") :pass
  657.                         else:
  658.                             if heal(st,"0") :pass
  659.                         if addTimeout(st,3,TIME_OUT_TIME,0): pass
  660.             filename = "data/html/teleporter/buffer/NpcBuffer-"+eventParam1+".htm"
  661.             html = NpcHtmlMessage(npc.getObjectId())   
  662.             html.setFile(None,filename)
  663.             html.replace("%objectId%", str(npc.getObjectId()))
  664.             st.player.sendPacket(html)
  665.  
  666.         if event == "chat3" : return MainHtml3(st)
  667.  
  668.         if event == "chat4" : return MainHtml4(st)
  669.  
  670.         if event == "class_master": return classmaster(st)
  671.  
  672.         if event == "getracemenu": return RaceMenu(st,eventParam1,eventParam2)
  673.  
  674.         if event == "NoblesseMenu": return NobleMenu(st)
  675.    
  676.         if event == "symbol" : return optionsymbol(st, eventParam1,eventParam2)
  677.  
  678.         if event == "subclass" :
  679.             if int(System.currentTimeMillis()/1000) > st.getInt("blockUntilTime"):
  680.                 return subclassopcions(st, eventParam1, eventParam2, eventParam3)
  681.             return MainHtml3(st)
  682.  
  683.         if tempevent.startswith("PKlistoption",3):
  684.             timer = tempevent.replace("PKlistoption","")
  685.             a = int(timer.split(" ")[0])
  686.             if a == 999: st.set("blockUntilTime",str(System.currentTimeMillis()/1000 + 2 + DELAY))
  687.             if System.currentTimeMillis() - self.Reload_PvpPk_Time > 0:
  688.                 self.Reload_PvpPk_Time = System.currentTimeMillis() + 1800000
  689.                 if reloadPvpPkList(self): pass
  690.             self.startQuestTimer(tempevent.replace(str(a),""), DELAY*1000, npc, player)
  691.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  692.             MAIN_HTML += "<br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  693.             MAIN_HTML += "<font color=\"3366FF\"> Wait a Moment </font><br><br>"
  694.             MAIN_HTML += "<font color=\"LEVEL\">"+str(DELAY)+"</font> seconds...</font><br>"
  695.             MAIN_HTML += "<br><font color=\"303030\">"+getmaster()+"</font>"
  696.             MAIN_HTML += "</center></body></html>"
  697.             return MAIN_HTML
  698.  
  699.         if event == "PKlistoption":
  700.             temp= "3366FF"; temp1= "FFFFFF"
  701.             if eventParam1 == "2": temp= "FFFFFF"; temp1= "3366FF"
  702.             htmltext = "<html><head><title>Top PVP/PK Players</title></head><body><center>"
  703.             i = 1;tmp = self.pvppage
  704.             if eventParam1 == "2": tmp = self.pkpage
  705.             if tmp > 1:
  706.                 htmltext += "<table border=\"0\"><tr>"
  707.                 while i <= tmp:
  708.                     if tmp > 5 : width = "25"; pageName = "P"
  709.                     else : width = "50"; pageName = "Page "
  710.                     htmltext += "<td width=\""+width+"\" align=\"center\"><button value=\""+pageName+""+str(i)+"\" action=\"bypass -h Quest " + QUEST_INFO + " 999PKlistoption "+eventParam1+" "+str(i-1)+" 0\" width="+width+" height=18 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>"
  711.                     i += 1
  712.                 htmltext += "</tr></table></center>"
  713.             htmltext +="<table width=280><tr><td width=40 align=\"center\"><font color =\"FFFFFF\">Pos.</td><td width=100 align=\"left\"><font color =\"FFFFFF\">Char Name</color></td><td width=30 align=\"left\"><a action=\"bypass -h Quest " +QUEST_INFO+ " 999PKlistoption 1 0 0\"><font color=\""+temp+"\">PVPs</font></a></td><td width=30 align=\"left\"><a action=\"bypass -h Quest " +QUEST_INFO+ " 999PKlistoption 2 0 0\"><font color=\""+temp1+"\">PKs</font></a></td></tr>"
  714.             htmltext +="<tr><td><br></td></tr>"
  715.             if eventParam1 == "1" and self.pvppage > 0:
  716.                 htmltext += self.htmltext1[int(eventParam2)]
  717.             elif eventParam1 == "2" and self.pkpage > 0:
  718.                 htmltext += self.htmltext2[int(eventParam2)]
  719.             htmltext += "</table></body></html>"
  720.             return htmltext
  721.  
  722.         if event == "getnoble":
  723.             count=st.getQuestItemsCount(NOBLE_ITEMID)
  724.             htmltext = "<html><title>SERVICES MANAGER</title><body><center>"
  725.             if st.getPlayer().isNoble():
  726.                 htmltext += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You already are Noblesse.</font><br>"
  727.             elif st.getPlayer().getLevel() < NOBLE_LEVEL :
  728.                 htmltext += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">Come back here when you reach <font color=\"FFFF00\">level "+str(NOBLE_Level)+".</font></font><br>"
  729.             elif count < NOBLE_ITEM_COUNT :
  730.                             htmltext += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You don't have the required Item.<br1>You need <font color=\"FFFF00\">"+str(NOBLE_ITEM_COUNT)+" "+getitemname(NOBLE_ITEMID)+"</font></font><br>"
  731.             else:
  732.                 st.getPlayer().setTarget(st.getPlayer())
  733.                 if eventParam1 == "2":
  734.                     st.takeItems(NOBLE_ITEMID,NOBLE_ITEM_COUNT)
  735.                                     st.getPlayer().setNoble(True)
  736.                                     st.giveItems(NOBLESS_TIARA,1)
  737.                                     st.playSound("ItemSound.quest_finish")
  738.                     st.setState(State.COMPLETED)
  739.                     htmltext += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"00FF00\">Congratulations! You are Noblesse.</font><br>"
  740.                                     st.exitQuest(1)
  741.                 else: return
  742.             htmltext += "</center></body></html>"
  743.             return htmltext
  744.            
  745.         if event == "changeclass":
  746.                 st.player.setClassId(int(eventParam1))
  747.                 if st.player.isSubClassActive():
  748.                     st.player.getSubClasses().get(st.player.getClassIndex()).setClassId(st.player.getActiveClass())
  749.                 else: st.player.setBaseClass(st.player.getActiveClass())
  750.             if st.getPlayer().getClassId().level() == 3:
  751.                 st.giveItems(CLASSMASTER_GIFT,CLASSMASTER_ITEM_COUNT)
  752.             st.player.broadcastUserInfo()
  753.  
  754.         if event == "increaseclan" :
  755.                 if st.player.getClan() == None or not st.player.isClanLeader() :
  756.                     MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  757.                 MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You are not the leader of this clan.<br1>You may not raise the level of it.</font><br>"
  758.                 MAIN_HTML += "</center></body></html>"
  759.                 return MAIN_HTML
  760.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  761.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  762.             MAIN_HTML += "<font color=\"3366FF\">Clan level can be raised.<br1>To do so requires the following:</font><br><br>"
  763.             MAIN_HTML += "<button value=\"Level Up\" action=\"bypass -h Quest " +QUEST_INFO+ " increase_clan 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\"><br1>"
  764.             MAIN_HTML += "<button value=\"Back\" action=\"bypass -h Quest " +QUEST_INFO+ " chat4 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\"><br>"
  765.             MAIN_HTML += "<font color=\"LEVEL\">Level 1:</font> 20,000 SP, 650,000 Adena<br1>"
  766.             MAIN_HTML += "<font color=\"LEVEL\">Level 2:</font> 100,000 SP, 2,500,000 Adena<br1>"
  767.             MAIN_HTML += "<font color=\"LEVEL\">Level 3:</font> 350,000 SP, Evidence of Blood<br1>"
  768.             MAIN_HTML += "<font color=\"LEVEL\">Level 4:</font> 1,000,000 SP, Evidence of Determination<br1>"
  769.             MAIN_HTML += "<font color=\"LEVEL\">Level 5:</font> 2,500,000 SP, Evidence of Aspiration<br1>"
  770.             MAIN_HTML += "<font color=\"LEVEL\">Level 6:</font> 10,000 Clan Fame points,<br1>more than 30 clan members<br1>"
  771.             MAIN_HTML += "<font color=\"LEVEL\">Level 7:</font> 20,000 Clan Fame points,<br1>more than 80 clan members<br1>"
  772.             MAIN_HTML += "<font color=\"LEVEL\">Level 8:</font> 40,000 Clan Fame points,<br1>more than 120 clan members<br1>"
  773.             MAIN_HTML += "<font color=\"LEVEL\">Level 9:</font> 40,000 Clan Fame points,<br1>more than 120 clan members, 150 Blood Oaths<br1>"
  774.             MAIN_HTML += "<font color=\"LEVEL\">Level 10:</font> 40,000 Clan Fame points,<br1>more than 140 clan members, 5 Blood Alliances<br1>"
  775.             MAIN_HTML += "<font color=\"LEVEL\">Level 11:</font> 75,000 Clan Fame points,<br1>more than 170 clan members, Territory Owner<br1>"
  776.             MAIN_HTML += "</center></body></html>"
  777.             return MAIN_HTML
  778.  
  779.         if event == "increase_clan" :
  780.                     if not st.player.isClanLeader():
  781.                         st.player.sendPacket(SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT))
  782.                         return
  783.                     if st.player.getClan().levelUpClan(st.player):
  784.                         st.player.broadcastPacket(MagicSkillUse(st.player, 5103, 1, 0, 0))
  785.                         st.player.broadcastPacket(MagicSkillLaunched(st.player, 5103, 1))
  786.                 return
  787.             return
  788.  
  789.         elif event == "DisbandClan" :
  790.                 if st.player.getClan() == None or not st.player.isClanLeader() :
  791.                     MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  792.                 MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You are not the leader of this clan.<br1>You may not dissolve it.</font><br>"
  793.                 MAIN_HTML += "</center></body></html>"
  794.                 return MAIN_HTML
  795.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  796.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  797.             MAIN_HTML += "<font color=\"3366FF\">If you apply for dissolution,<br1>the clan will be dissolved.</font><br><br>"
  798.             MAIN_HTML += "<button value=\"Dissolution\" action=\"bypass -h Quest " +QUEST_INFO+ " dissolve_clan 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\"><br1>"
  799.             MAIN_HTML += "<button value=\"Back\" action=\"bypass -h Quest " +QUEST_INFO+ " chat4 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\">"
  800.             MAIN_HTML += "</center></body></html>"
  801.             return MAIN_HTML
  802.  
  803.         elif event == "dissolve_clan" :
  804.                 if not st.player.isClanLeader():
  805.                     st.player.sendPacket(SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT))
  806.                         return
  807.                 clan = st.player.getClan()
  808.                 if clan.getAllyId() != 0:
  809.                         st.player.sendPacket(SystemMessage(SystemMessageId.CANNOT_DISPERSE_THE_CLANS_IN_ALLY))
  810.                         return
  811.                 if clan.isAtWar():
  812.                 st.player.sendPacket(SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_WAR))
  813.                         return
  814.             if clan.getHasCastle() !=0 or clan.getHasHideout() != 0 or clan.getHasFort() != 0:
  815.                 st.player.sendPacket(SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_OWNING_CLAN_HALL_OR_CASTLE))
  816.                         return
  817.             for castle in CastleManager.getInstance().getCastles():
  818.                 if SiegeManager.getInstance().checkIsRegistered(clan, castle.getCastleId()):
  819.                     st.player.sendPacket(SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE))
  820.                             return
  821.             for fort in FortManager.getInstance().getForts():
  822.                 if FortSiegeManager.getInstance().checkIsRegistered(clan, fort.getFortId()):
  823.                     st.player.sendPacket(SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE))
  824.                             return
  825.             if st.player.isInsideZone(L2PcInstance.ZONE_SIEGE) :
  826.                 st.player.sendPacket(SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE))
  827.                         return
  828.             if clan.getDissolvingExpiryTime() > System.currentTimeMillis() :
  829.                 st.player.sendPacket(SystemMessage(SystemMessageId.DISSOLUTION_IN_PROGRESS))
  830.                         return
  831.             clan.setDissolvingExpiryTime(System.currentTimeMillis() + Config.ALT_CLAN_DISSOLVE_DAYS * 86400000L)
  832.             st.player.sendMessage("Dissolution in progress. Please Wait "+str(Config.ALT_CLAN_DISSOLVE_DAYS * 24L)+" hours to be completed")
  833.                 clan.updateClanInDB()
  834.             ClanTable.getInstance().scheduleRemoveClan(clan.getClanId())
  835.                 st.player.deathPenalty(False, False, False)
  836.  
  837.         elif event == "RestoreClan" :
  838.             if st.player.getClan() == None or not st.player.isClanLeader() :
  839.                 MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  840.                 MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You are not the leader of this clan.<br1>You may not recover it.</font><br>"
  841.                 MAIN_HTML += "</center></body></html>"
  842.                 return MAIN_HTML
  843.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  844.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  845.             MAIN_HTML += "<font color=\"3366FF\">If you request a restoration<br1>your clan dissolution request will be canceled</font><br><br>"
  846.             MAIN_HTML += "<button value=\"Restoration\" action=\"bypass -h Quest " +QUEST_INFO+ " recover_clan 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\"><br1>"
  847.             MAIN_HTML += "<button value=\"Back\" action=\"bypass -h Quest " +QUEST_INFO+ " chat4 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\">"
  848.             MAIN_HTML += "</center></body></html>"
  849.             return MAIN_HTML
  850.  
  851.         elif event == "recover_clan" :
  852.                 if not st.player.isClanLeader():
  853.                 st.player.sendPacket(SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT))
  854.                         return
  855.             clan = st.player.getClan()
  856.             clan.setDissolvingExpiryTime(0)
  857.             clan.updateClanInDB()
  858.             st.player.sendMessage("Dissolution progress canceled")
  859.    
  860.         elif event == "giveclanl" :
  861.                 if st.player.getClan() == None or not st.player.isClanLeader() :
  862.                     MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  863.                 MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You are not a Clan Leader.</font><br>"
  864.                 MAIN_HTML += "</center></body></html>"
  865.                 return MAIN_HTML
  866.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  867.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  868.             MAIN_HTML += "<font color=\"3366FF\">Insert the name of the Clan member<br1>to commit</font><br><br>"
  869.             MAIN_HTML += "<edit var=\"name\" width=110><br><br>"
  870.             MAIN_HTML += "<button value=\"Enter\" action=\"bypass -h Quest " +QUEST_INFO+ " change_clan_leader $name no_data 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\"><br1>"
  871.             MAIN_HTML += "<button value=\"Back\" action=\"bypass -h Quest " +QUEST_INFO+ " chat4 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\">"
  872.             MAIN_HTML += "</center></body></html>"
  873.             return MAIN_HTML
  874.  
  875.         elif event == "change_clan_leader" :
  876.             if eventParam1 == "no_data": return
  877.                 if not st.player.isClanLeader():
  878.                         st.player.sendPacket(SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT))
  879.                         return
  880.             if st.player.isFlying():
  881.                 st.player.sendMessage("Please, stop flying")
  882.                 return
  883.             clan = st.player.getClan()
  884.             member = clan.getClanMember(eventParam1)
  885.             if member == None:
  886.                 sm = SystemMessage(SystemMessageId.S1_DOES_NOT_EXIST)
  887.                 sm.addString(eventParam1)
  888.                 st.player.sendPacket(sm)
  889.                 sm = None
  890.                 return
  891.             if not member.isOnline():
  892.                         st.player.sendPacket(SystemMessage(SystemMessageId.INVITED_USER_NOT_ONLINE))
  893.                 return
  894.             if st.player.getName() != member.getName(): return
  895.             clan.setNewLeader(member)
  896.  
  897.         elif event == "learn_clan_skills":
  898.             if st.player.getClan() == None or not st.player.isClanLeader():
  899.                 MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  900.                 MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You're not qualified to learn Clan skills.</font><br>"
  901.                 MAIN_HTML += "</center></body></html>"
  902.                 return MAIN_HTML
  903.             skills = SkillTreeTable.getInstance().getAvailablePledgeSkills(st.player)
  904.             asl = AcquireSkillList(AcquireSkillList.SkillType.Clan)
  905.             counts = 0
  906.             for s in skills:
  907.                 cost = s.getRepCost()
  908.                 itemCount = s.getItemCount()
  909.                 counts+=1
  910.                 asl.addSkill(s.getId(), s.getLevel(), s.getLevel(), cost, itemCount)
  911.             if counts == 0:
  912.                 if st.player.getClan().getLevel() < 8:
  913.                     sm = SystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN)
  914.                             if st.player.getClan().getLevel() < 5:
  915.                                 sm.addNumber(5)
  916.                             else:
  917.                                 sm.addNumber(st.player.getClan().getLevel()+1)
  918.                             st.player.sendPacket(sm)
  919.                             st.player.sendPacket(AcquireSkillDone())
  920.                 else:
  921.                     MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  922.                     MAIN_HTML += "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><font color=\"3366FF\">You've learned all skills available for your Clan.</font><br>"
  923.                     MAIN_HTML += "</center></body></html>"
  924.                     return MAIN_HTML
  925.             else:
  926.                         st.player.sendPacket(asl)
  927.  
  928.         elif event == "createclan" :
  929.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  930.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  931.             MAIN_HTML += "<font color=\"3366FF\"> Enter clan name </font><br><br>"
  932.             MAIN_HTML += "<edit var=\"name\" width=110><br><br>"
  933.             MAIN_HTML += "<button value=\"Enter\" action=\"bypass -h Quest " +QUEST_INFO+ " create_clan $name no_data 0 0 \" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\"><br1>"
  934.             MAIN_HTML += "<button value=\"Back\" action=\"bypass -h Quest " +QUEST_INFO+ " chat4 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\">"
  935.             MAIN_HTML += "</center></body></html>"
  936.             return MAIN_HTML
  937.  
  938.         elif event == "create_clan" :
  939.             if eventParam1 == "no_data": return
  940.                     ClanTable.getInstance().createClan(st.player, eventParam1)
  941.             return
  942.  
  943.         elif event == "createally":
  944.             MAIN_HTML = "<html><title>SERVICES MANAGER</title><body><center>"
  945.             MAIN_HTML += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>"
  946.             MAIN_HTML += "<font color=\"3366FF\"> Enter Alliance name </font><br><br>"
  947.             MAIN_HTML += "<edit var=\"name\" width=110><br><br>"
  948.             MAIN_HTML += "<button value=\"Enter\" action=\"bypass -h Quest " +QUEST_INFO+ " create_ally $name no_data 0 0 \" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\"><br1>"
  949.             MAIN_HTML += "<button value=\"Back\" action=\"bypass -h Quest " +QUEST_INFO+ " chat4 0 0 0\" width=80 height=30 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_ct1.button_df\">"
  950.             MAIN_HTML += "</center></body></html>"
  951.             return MAIN_HTML
  952.  
  953.         elif event == "create_ally":
  954.             if eventParam1 == "no_data": return
  955.                     if not st.player.isClanLeader():
  956.                 st.player.sendPacket(SystemMessage(SystemMessageId.ONLY_CLAN_LEADER_CREATE_ALLIANCE))
  957.                         return
  958.             st.player.getClan().createAlly(st.player, eventParam1)
  959.             return
  960.  
  961.         elif event == "dissolve_ally":
  962.             if not st.player.isClanLeader():
  963.                 st.player.sendPacket(SystemMessage(SystemMessageId.FEATURE_ONLY_FOR_ALLIANCE_LEADER))
  964.                         return
  965.                     st.player.getClan().dissolveAlly(st.player)
  966.             return
  967.         else:   return
  968.  
  969.     def onFirstTalk (self,npc,player):
  970.         st = player.getQuestState(QUEST_INFO)
  971.         if not st : st = self.newQuestState(player)
  972.         if player.isGM() and player.getAccessLevel().getLevel() == GM_ACCESS_LEVEL:
  973.             if GM_RELOAD_PANEL == True: filename = "data/html/teleporter/mainhtmls/mainhtml-2.htm"
  974.             else: filename = "data/html/teleporter/mainhtmls/mainhtml-0.htm"
  975.             html = NpcHtmlMessage(npc.getObjectId())
  976.             html.setFile(None,filename)
  977.             html.replace("%objectId%", str(npc.getObjectId()))
  978.             st.player.sendPacket(html)
  979.         elif int(System.currentTimeMillis()/1000) > st.getInt("blockUntilTime"):
  980.             if ALLOW_VIP == False or player.getAccessLevel().getLevel() == VIP_ACCESS_LEVEL and ALLOW_VIP == True:
  981.                 if ALLOW_KARMA_PLAYER == False and player.getKarma() > 0 :
  982.                     return showText("Info","You have too much karma!<br>Come back,<br>when you don't have any karma!")
  983.                 elif st.player.getPvpFlag() > 0 :
  984.                     return showText("Info","You can't use my services while you are flagged!<br>Wait some time and try again!")
  985.                 elif st.player.isInCombat() :
  986.                     return showText("Info","You can't use my services while you are attacking!<br>Stop your fight and try again!")
  987.                 else:
  988.                     filename = "data/html/teleporter/mainhtmls/mainhtml-0.htm"
  989.                     html = NpcHtmlMessage(npc.getObjectId())
  990.                     html.setFile(None,filename)
  991.                     html.replace("%objectId%", str(npc.getObjectId()))
  992.                     st.player.sendPacket(html)
  993.             else:
  994.                 return showText("Sorry","This NPC is only for VIP's!<br>Contact the administrator for more info!")
  995.  
  996.         else: return
  997.  
  998. QUEST = Quest(QuestId,QUEST_INFO,QuestDesc)
  999.  
  1000. QUEST.addStartNpc(npcId)
  1001. QUEST.addFirstTalkId(npcId)
  1002. QUEST.addTalkId(npcId)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement