Найти - Пользователи
Полная версия: Python Lineage2. Скрипт, хелп!
Начало » Python для Java » Python Lineage2. Скрипт, хелп!
1
Holsten
Это скрипт эвента для 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()
Но так же не понятно куда етот кусок вставлять и при каких условиях. Кто разбирается плиз помогите.
kocmoc
Я конечно только начал стизю питона, но не пойму причём лвл игрока??? если написано почти по русски
TEAM1.append(player.getName())???? Вам надо сравнить с именем игрока вас атакующего, если он не в команде, то нанести урон ему (либо убить: player.reduceCurrentHp(99999,player)), либо добавить себе хп в зависимости от его урона (тут есть баг, но об этом не сейчас), с самим игроком вас атакующем ничего сделать не получиться на сколько я понимаю (сам пол года назад заморочился линейкой, но времени не хватает…).
Singularity
“=” не эквивалентно “==”
Результат сравнения“==” может быть True или False, а результат присвоения“=” мне влом проверять. Всегда None, кажется.
py.user.next
Singularity
Результат сравнения“==” может быть True или False, а результат присвоения“=” мне влом проверять. Всегда None, кажется.
в питоне операцию присваивание вообще нельзя вкладывать, у неё нет результата
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB