Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Python] эвент для Lineage2 
:(
    Опции темы
Holsten2
Дата 7.2.2012, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.2.2012

Репутация: нет
Всего: нет



Это скрипт эвента для Lineage2 серверов. Эвент "Захват базы". Никак не могу дописать скрипт, чтобы посторонние игроки не наносили дамаг игрокам, которые участвуют в эвенте. Или запретить выделять участвующих в таргет.

Код

import sys
from l2dot.gameserver.model.quest import State
from l2dot.gameserver.model.quest import QuestState
from l2dot.gameserver.datatables import DoorTable
from l2dot.gameserver.datatables import        SkillTable
from l2dot.gameserver.model.quest.jython import QuestJython as JQuest
from l2dot.gameserver import Announcements
from l2dot import L2DatabaseFactory
from l2dot.gameserver.ai import CtrlIntention
from l2dot.util import Rnd
from java.lang import System
from l2dot.gameserver.model import L2World

qn = "5556_Base"
# =======================================
#                НЕ ТРОГАЕМ
# =======================================
closed=1
res_timer=0
npc1=0
npc2=0
TEAM1 = []
TEAM2 = []
attacked = 0
annom = 1
# =======================================
#                КОНФИГ
# =======================================
NAME = u"\u0417\u0430\u0445\u0432\u0430\u0442 \u0431\u0430\u0437\u044b"    # Название (только английские символы)
LOC = u"\u0413\u0438\u0440\u0430\u043d"                        # Место, где вы поставили регистрирующего НПЦ.
REGISTER = 99998                        # Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
locr = [82840,149402,-3468]            # Соответственно координаты, где будет появляться НПЦ
PENI = 4037                            # Итем, необходимый для участия
PENI_KOL = 0                            # Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
LEVEL = 76                                # Минимальный уровень, на котором игрок сможет принять участие в ивенте.
AFTER_RESTART = 3                        # Время, которое пройдёт от запуска сервера(перезагрузки скрипта) до начала ивента.
TIME_FOR_WAIT = 60                    # Время между ивентами в минутах
TIME_FOR_REG = 1                        # Время на регистрацию в минутах
ANNOUNCE_INTERVAL = 1                    # Как часто аннонсить о регистрации на ивент в минутах.
YCH_MIN = 1                            # Минимальное количество участников в команде
YCH_MAX = 20                            # Максимальное количество участников в команде
REWARD =[[8762,1,100],[6407,1,100]]    # Список наград. Выдаётся каждому участнику. Формат записи: [[itemId1,count1,chance1],[itemId2,count2,chanceN],...[itemIdN,countN,chanceN]]
t1 =[-90915,148611,-3626]                # Место телепорта 1 команды и 1 базы
t2 =[-91182,151404,-3626]                # Место телепорта 2 команды и 1 базы
BASE1 = 55561                            # ИД НПЦ базы №1
BASE2 = 55562                            # ИД НПЦ базы №2
com1 = "Dark Team"                        # Название 1 команды
com2 = "Light Team"                    # Название 2 команды
RES_TIME = 2                            # Время, через которое будут ресаться дохлые игроки - секунды.

print "3AXBAT 6A3bI:................................Initialized"
class Quest (JQuest) :
 def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

 def init_LoadGlobalData(self) :
   self.startQuestTimer("open", AFTER_RESTART *60000, None, None)
   return

 def onTalk (Self,npc,player):
  global TEAM1,TEAM2,npc1,npc2,closed
  st = player.getQuestState(qn)
  npcId = npc.getNpcId()
  if npcId == REGISTER:
   if closed<>1:
    if not player.isInOlympiadMode() :
     if player.getLevel() >= LEVEL:
      if player.getName() not in TEAM1 + TEAM2 :
       if len(TEAM1)>len(TEAM2) :
        kolych = len(TEAM1)
       else:
        kolych = len(TEAM2)
       if kolych <= YCH_MAX :
        if PENI_KOL<>0:   
         if st.getQuestItemsCount(PENI)>PENI_KOL:
           st.takeItems(PENI,PENI_KOL)
           if len(TEAM1)>len(TEAM2):
            TEAM2.append(player.getName())
            return "reg.htm"
           else:
            TEAM1.append(player.getName())
            return "reg.htm"
         else:
           st.exitQuest(1)
           return "nopeni.htm"
        else:
           if len(TEAM1)>len(TEAM2):
            TEAM2.append(player.getName())
            return "reg.htm"
           else:
            TEAM1.append(player.getName())
            return "reg.htm"
       else:         
         return "max.htm"
      else:
       return "yje.htm"
     else:
      return "lvl.htm"
    else:
     return "You register in olympiad games now"
   else:
    return "noreg.htm"
  return

 def onAdvEvent (self,event,npc,player):
   global TEAM1,TEAM2,npc1,npc2,res_timer,annom,closed
   if event == "open" :
     TEAM1=[]
     TEAM2=[]
     closed=0
     annom=1
     npc=self.addSpawn(REGISTER,locr[0],locr[1],locr[2],30000,False,0)
     self.startQuestTimer("close", TIME_FOR_REG*60000, npc, None)
     self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
     Announcements.getInstance().announceToAll(u"\u041e\u0442\u043a\u0440\u044b\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u044d\u0432\u0435\u043d\u0442 "+str(NAME)+u". \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u0433\u043e\u0440\u043e\u0434\u0435 "+str(LOC)+".")
   if event == "close":
    res_timer = 1
    self.startQuestTimer("res", RES_TIME*1000, None, None)
    self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
    for nm in TEAM1:
     i=L2World.getInstance().getPlayer(nm)
     if i<>None:
      if not i.isOnline() or i.isInOlympiadMode():
       TEAM1.remove(nm)
     else:
       TEAM1.remove(nm)
    for nm in TEAM2:
     i=L2World.getInstance().getPlayer(nm)
     if i<>None:
      if not i.isOnline() or i.isInOlympiadMode():
       TEAM2.remove(nm)
     else:
       TEAM2.remove(nm)
    while abs(len(TEAM1)-len(TEAM2))>1:
     if len(TEAM1)>len(TEAM2):
      self.saveGlobalQuestVar(str(TEAM1[0].getObjectId()), "team2")
      TEAM2.append(TEAM1[0])
      TEAM1.remove(TEAM1[0])
     else:
      self.saveGlobalQuestVar(str(TEAM2[0].getObjectId()), "team1")
      TEAM1.append(TEAM2[0])
      TEAM2.remove(TEAM2[0])
    if (len(TEAM1)+len(TEAM2))< 2*YCH_MIN :
      npc.deleteMe()
      closed=1
      Announcements.getInstance().announceToAll(u"\u042d\u0432\u0435\u043d\u0442 "+str(NAME)+u" \u043e\u0442\u043c\u0435\u043d\u0451\u043d \u0438\u0437-\u0437\u0430 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432!!!") 
    else:
      closed=1
      Announcements.getInstance().announceToAll(u"\u042d\u0432\u0435\u043d\u0442 "+str(NAME)+u" \u043d\u0430\u0447\u0430\u043b\u0441\u044f!!!")
      npc.deleteMe()
      npc1=self.addSpawn(BASE1,t1[0],t1[1],t1[2],30000,False,0)
      npc2=self.addSpawn(BASE2,t2[0],t2[1],t2[2],30000,False,0)
      for nm in TEAM1 :
       i=L2World.getInstance().getPlayer(nm)
       if i<>None:
        if i.isOnline() :
         i.stopAllEffects()
         i.setTeam(2)
         i.broadcastStatusUpdate()
         i.broadcastUserInfo()
         i.teleToLocation(t1[0]+100,t1[1],t1[2])
      for nm in TEAM2 :
       i=L2World.getInstance().getPlayer(nm)
       if i<>None:
        if i.isOnline() :
         i.stopAllEffects()
         i.setTeam(1)
         i.broadcastStatusUpdate()
         i.broadcastUserInfo()
         i.teleToLocation(t2[0]+100,t2[1],t2[2])        
   if event == "announce" and closed==0 and (TIME_FOR_REG - ANNOUNCE_INTERVAL * annom)>0: 
     Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * annom ) + u" \u043c\u0438\u043d\u0443\u0442(\u044b) \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0432\u0435\u043d\u0442\u0430 "+str(NAME)+u" \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u0433\u043e\u0440\u043e\u0434\u0435 "+str(LOC)+u". \u0423\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e  "+str(len(TEAM1))+u" Dark Team \u0438 "+str(len(TEAM2))+u" Light Team.")
     annom=annom+1
     self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
   if event == "return_1" :
     res_timer = 0
     for nm in TEAM1 :
      i=L2World.getInstance().getPlayer(nm)
      if i<>None:
       if i.isOnline() :
        i.teleToLocation(locr[0],locr[1],locr[2])
        i.setTeam(0)
        i.broadcastStatusUpdate()
        i.broadcastUserInfo()
     for nm in TEAM2 :
      i=L2World.getInstance().getPlayer(nm)
      if i<>None:
       if i.isOnline() :
        i.teleToLocation(locr[0],locr[1],locr[2])
        i.setTeam(0)
        i.broadcastStatusUpdate()
        i.broadcastUserInfo()
     Announcements.getInstance().announceToAll(u"\u042d\u0432\u0435\u043d\u0442 "+str(NAME)+u" \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f. \u041f\u043e\u0431\u0435\u0434\u0438\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 "+str(com1)+".")
   if event == "return_2" :
     res_timer = 0
     for nm in TEAM1 :
      i=L2World.getInstance().getPlayer(nm)
      if i<>None:
       if i.isOnline() :
        i.teleToLocation(locr[0],locr[1],locr[2])
        i.setTeam(0)
        i.broadcastStatusUpdate()
        i.broadcastUserInfo()
     for nm in TEAM2 :
      i=L2World.getInstance().getPlayer(nm)
      if i<>None:
       if i.isOnline() :
        i.teleToLocation(locr[0],locr[1],locr[2])
        i.setTeam(0)
        i.broadcastStatusUpdate()
        i.broadcastUserInfo()
     Announcements.getInstance().announceToAll(u"\u042d\u0432\u0435\u043d\u0442 "+str(NAME)+u" \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f. \u041f\u043e\u0431\u0435\u0434\u0438\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 "+str(com2)+".")
   if event == "exit" :
     if player.getName() in TEAM1:
      TEAM1.remove(player.getName())
     else:
      TEAM2.remove(player.getName())
     return "exit.htm"
   if event == "res" and res_timer==1:
    self.startQuestTimer("res", RES_TIME*1000, None, None)
    for nm in TEAM1:
     i=L2World.getInstance().getPlayer(nm)
     if i<>None:
      if i.isOnline() :
       if i.isDead():
        i.doRevive(0)
        i.setCurrentCp(i.getMaxCp())
        i.setCurrentHp(i.getMaxHp())
        i.setCurrentMp(i.getMaxMp())
        i.stopAllEffects()
        i.setTeam(0)
        i.setTeam(2)
        i.broadcastStatusUpdate()
        i.broadcastUserInfo()
        i.teleToLocation(t1[0]+100,t1[1],t1[2])
    for nm in TEAM2:
     i=L2World.getInstance().getPlayer(nm)
     if i<>None:
      if i.isOnline() :
       if i.isDead():
        i.doRevive(0)
        i.setCurrentCp(i.getMaxCp())
        i.setCurrentHp(i.getMaxHp())
        i.setCurrentMp(i.getMaxMp())
        i.stopAllEffects()
        i.setTeam(0)
        i.setTeam(1)
        i.broadcastStatusUpdate()
        i.broadcastUserInfo()
        i.teleToLocation(t2[0]+100,t2[1],t2[2])
   return 

 def onAttack (self,npc,player,damage,isPet):
  npcId = npc.getNpcId()
  if npcId == BASE2 and player.getName() not in TEAM1 :
     player.reduceCurrentHp(99999,player)
  if npcId == BASE1 and player.getName() not in TEAM2 :
     player.reduceCurrentHp(99999,player)
  return   

 def onSkillSee (self,npc,player,skill,targets,isPet) :
     if player.getTarget() == npc and skill.getId() in [1218,1015,1258,1011,1401,58,1217,329]:
      player.setTeam(0)
      player.broadcastStatusUpdate()
      player.broadcastUserInfo()      
      player.teleToLocation(locr[0],locr[1],locr[2])
      if player.getName() in TEAM1 :
       TEAM1.remove(player.getName())
      elif player.getName() in TEAM2 :
       TEAM2.remove(player.getName())
      
 def onKill(self,npc,player,isPet):
  global TEAM1,TEAM2,npc1,npc2,res_timer
  npcId = npc.getNpcId()
  if npcId == BASE1:
   res_timer=0
   self.startQuestTimer("return_2", 10000, None, None)  
   npc2.deleteMe()
   for nm in TEAM2 :
    i=L2World.getInstance().getPlayer(nm)
    if i<>None:
     if i.isOnline() :
      for id, count, chance in REWARD :
       if Rnd.get(100)<=chance :
        i.getQuestState(qn).giveItems(id,count)
  if npcId == BASE2:
   res_timer=0
   self.startQuestTimer("return_1", 10000, None, None)
   npc1.deleteMe()
   for nm in TEAM1 :
    i=L2World.getInstance().getPlayer(nm)
    if i<>None:
     if i.isOnline() :
      for id, count, chance in REWARD :
       if Rnd.get(100)<=chance :
        i.getQuestState(qn).giveItems(id,count)
  return

QUEST = Quest(5556, qn, "Custom")

QUEST.addKillId(int(BASE1))
QUEST.addAttackId(int(BASE1))
QUEST.addKillId(int(BASE2))
QUEST.addAttackId(int(BASE2))
QUEST.addStartNpc(int(REGISTER))
QUEST.addTalkId(int(REGISTER))
QUEST.addSkillSeeId(int(BASE1))
QUEST.addSkillSeeId(int(BASE2))


Знаю что етот кусок отвечает за запрет наносить дамаг по своей базе.

Код

 def onAttack (self,npc,player,damage,isPet):
  npcId = npc.getNpcId()
  if npcId == BASE2 and player.getName() not in TEAM1 :
     player.reduceCurrentHp(99999,player)
  if npcId == BASE1 and player.getName() not in TEAM2 :
     player.reduceCurrentHp(99999,player)
  return


Мои примерные догадки как может выглядеть:

Код

  if player = target.getLevel() not in TEAM1 :
     player.getLevel()
  if player = target.getLevel() not in TEAM2 :
     player.getLevel()


Или так:

Код

  if player = target.getLevel() not in TEAM1 :
     target.getLevel()
  if player = target.getLevel() not in TEAM2 :
     target.getLevel()


Но так же не понятно куда етот кусок вставлять и при каких условиях. Кто разбирается плиз помогите.

Это сообщение отредактировал(а) Holsten2 - 7.2.2012, 12:04
PM MAIL   Вверх
Daevaorn
Дата 7.2.2012, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 
PM MAIL WWW   Вверх
Holsten2
Дата 7.2.2012, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.2.2012

Репутация: нет
Всего: нет



Цитата(Daevaorn @ 7.2.2012,  23:31)
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена!

Каких домашних заданий ? Каких курсовых ? Вы о чём вообще ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0856 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.