Delvl нпс
Сборка la2base final.
Прошу помочь в написании НПС'а который будет сливать лвл игроку, убирая все скилы у игрока и
выдовать награду за содеянное.
Никак не могу прописать, что бы после слива ЛвЛ'а обнулялся скил лист у игрока.
Мои соображения по этому поводу: нужна команда которая будет чистить скил лист (st.***)
Скрипт:
from net.sf.l2j.gameserver.model.quest import QuestState
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
from net.sf.l2j.gameserver.model import L2ItemInstance
from net.sf.l2j.gameserver.model.base import Experience
from net.sf.l2j.gameserver.serverpackets import CreatureSay
qn = "7105_Delevel"
NPC=[50015]
MEDAL = 9301
QuestId = 7105
QuestName = "Delevel"
QuestDesc = "custom"
InitialHtml = "1.htm"
print "Delevel loading.........."
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def onEvent(self,event,st):
htmltext = event
if st.getPlayer().getLevel() < 79 :
htmltext = "2.htm"
elif st.getQuestItemsCount(MEDAL) < 1 :
st.getPlayer().sendPacket(CreatureSay(st.getPlayer().getObjectId(), 2, "Delevel Manager", "Jums reikia 1 Glittering Medal norint naudotis sia funkcija!"))
elif st.getPlayer().getKarma() > 0 :
st.getPlayer().sendPacket(CreatureSay(st.getPlayer().getObjectId(), 2, "Delevel Manager", "Negalima sumazinti level turedamas karmos!"))
elif st.getPlayer().getPvpFlag() != 0 :
st.getPlayer().sendPacket(CreatureSay(st.getPlayer().getObjectId(), 2, "Delevel Manager", "Jus negalite mazinti savo level, kai esate kovoje!"))
elif st.getPlayer().isAttackingNow() == True :
st.getPlayer().sendPacket(CreatureSay(st.getPlayer().getObjectId(), 2, "Delevel Manager", "Nemuskite manes!!!!"))
elif st.getPlayer().getLevel() < 48 :
SkillTable.getInstance().getInfo(1389,3).getEffects(st.getPlayer(),st.getPlayer(
))
st.getPlayer().sendPacket(CreatureSay(st.getPlayer().getObjectId(), 2, "Delevel Manager", "Greater Shieldo galios apsaugokit! Tikiuosi jis tau pades :)"))
else:
st.getPlayer().setTarget(st.getPlayer())
if event == "2":
st.takeItems(MEDAL,1)
st.getPlayer().getStat().removeExpAndSp((st.getPlayer().getExp() - Experience.LEVEL[st.getPlayer().getStat().getLevel() - 79]),0)
st.getPlayer().sendPacket(CreatureSay(st.getPlayer().getObjectId(), 3, "Delevel Manager", "Jusu level sumazintas 1 level"))
return "1.htm"
st.setState(State.COMPLETED)
st.exitQuest(1)
if htmltext != event:
st.setState(State.COMPLETED)
st.exitQuest(1)
return htmltext
def onTalk (self,npc,player):
st = player.getQuestState(qn)
htmltext = "<html><head><body>I have nothing to say to you</body></html>"
st.setState(State.STARTED)
return InitialHtml
QUEST = Quest(QuestId,str(QuestId) + "_" + QuestName,QuestDesc)
for npcId in NPC:
QUEST.addStartNpc(npcId)
QUEST.addTalkId(npcId)
Может поможет, глянь как класс менеджер выдает скиллы, только сделай все наоборот.
Глянь может тут что найдешь,а так если бы знал то помог.
впринцепи возможно сделать через сброс профы, мб ктото знает как вписать в скрипт изменение профы на 1, но это более геморно, ибо над делать привязку на принодлежность к той или иной профе...
-Diman-: впринцепи возможно сделать через сброс профы, мб ктото знает как вписать в скрипт изменение профы на 1, но это более геморно, ибо над делать привязку на принодлежность к той или иной профе...
наверное на подобии этого
Collection<L2SkillLearn> skillTree = SkillTreeTable.getInstance().getAllowedSkills(getClassId());
// loop through all skills of player
for (L2Skill skill : getAllSkills())
{
int skillid = skill.getId();
foundskill = false;
// loop through all skills in players skilltree
for (L2SkillLearn temp : skillTree)
{
// if the skill was found and the level is possible to obtain for his class everything is ok
if(temp.getId()==skillid)
{
foundskill = true;
}
}
// exclude noble skills
if(isNoble() && (skillid >= 325 && skillid <=327) || (skillid >= 1323 && skillid <=1327 ))
{
foundskill = true;
}
// exclude hero skills
// temp workaround till heroskilltable works properly
if(isHero() && ((skillid >= 1374 && skillid <= 1376) || (skillid >=395 && skillid <= 396)))
{
foundskill = true;
}
// exclude cursed weapon skills
if(isCursedWeaponEquiped() && skillid == CursedWeaponsManager.getInstance().getCursedWeapon(_cursedWeaponEquipedId).getSk
illId())
{
foundskill = true;
}
// exclude clan skills
if(getClan()!=null && (skillid >= 370 && skillid <= 391))
{
foundskill = true;
}
// exclude seal of ruler / build siege hq
if(getClan()!=null && (skillid>=246 && skillid<=247))
if(getClan().getLeaderId()==getObjectId())
foundskill = true;
if( getKarma() >= 900000 && skillid == 3603)
{
foundskill = true;
}
// exclude fishing skills and common skills + dwarfen craft
if(skillid>=1312 && skillid<=1322)
{
foundskill = true;
}
if(skillid>=1368 && skillid<=1373)
{
foundskill = true;
}
// exclude sa / enchant bonus / penality etc. skills
if(skillid>=3000 && skillid<7000)
{
foundskill = true;
}
// remove skill and do a lil log message
if(!foundskill)
{
removeSkill(skill);
}
}
-Diman-: Вы не так поняли, проблема не делвл сделать, а убрать скилы 2 и 3 профы.
я дал код убирания лишних скилов
Кроме того, в adminskill.java есть пример удаления всех скиллов и выдачи тех, которые положены по уровню.
ГМ-команды admin_remove_all_skills, admin_give_all_skills. Последняя вроде бы должна выдавать скиллы, положенные по текущему уровню
CKA3KA: я дал код убирания лишних скилов
Благодарю за вариант пытаюсь привентить к скрипту, пока безуспешно...
VlLight: Кроме того, в adminskill.java есть пример удаления всех скиллов и выдачи тех, которые положены по уровню.
ГМ-команды admin_remove_all_skills, admin_give_all_skills. Последняя вроде бы должна выдавать скиллы, положенные по текущему уровню
про данные команды я знаю, но их же никак не реализовать в скрипте, что б они автоматом вызывались на чара
-Diman-: Благодарю за вариант пытаюсь привентить к скрипту, пока безуспешно...
про данные команды я знаю, но их же никак не реализовать в скрипте, что б они автоматом вызывались на чара
Почему это?
просто надо посторатся...
каждая команда несёт в себе какое то действие, а это действие можно спокойно (ну почти) прикрутить к квесту... так сказать "шапку" сменить...
-Diman-: про данные команды я знаю, но их же никак не реализовать в скрипте, что б они автоматом вызывались на чара
Любой метод Явы можно вызвать из Питона. Возможно понадобится импортировать нужный пакет
Соглашусь с "VlLight"...
По идеи при желании можно что угодно воткнуть в квест... единственное ограничение это то что чар должен стоять возле НПСа (и то не всегда)...
хм, спс за напутствие, получается что
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
from net.sf.l2j.gameserver.model import L2ItemInstance
from net.sf.l2j.gameserver.model.base import Experience
from net.sf.l2j.gameserver.serverpackets import CreatureSay
qn = "7105_Delevel"
NPC=[50015]
MEDAL = 9302
QuestId = 7105
QuestName = "Delevel"
QuestDesc = "custom"
InitialHtml = "1.htm"
print "Delevel loading.........."
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def onEvent(self,event,st):
htmltext = event
if st.getPlayer().getLevel() < 79 :
htmltext = "2.htm"
elif st.getQuestItemsCount(MEDAL) < 1 :
htmltext = "2.htm"
elif st.getPlayer().getKarma() > 0 :
htmltext = "2.htm"
elif st.getPlayer().getPvpFlag() != 0 :
htmltext = "2.htm"
elif st.getPlayer().isAttackingNow() == True :
htmltext = "2.htm"
elif st.getPlayer().getLevel() < 80 :
SkillTable.getInstance().getInfo(1389,3).getEffects(st.getPlayer(),st.getPlayer(
))
htmltext = "2.htm"
else:
st.getPlayer().setTarget(st.getPlayer())
if event == "2":
st.giveItems(MEDAL,1)
st.getPlayer().getStat().removeExpAndSp((st.getPlayer().getExp() - Experience.LEVEL[st.getPlayer().getStat().getLevel() - 79]),0)
st.****
htmltext = "3.htm"
st.setState(State.COMPLETED)
st.exitQuest(1)
if htmltext != event:
st.setState(State.COMPLETED)
st.exitQuest(1)
return htmltext
def onTalk (self,npc,player):
st = player.getQuestState(qn)
htmltext = "<html><head><body>I have nothing to say to you</body></html>"
st.setState(State.STARTED)
return InitialHtml
QUEST = Quest(QuestId,str(QuestId) + "_" + QuestName,QuestDesc)
for npcId in NPC:
QUEST.addStartNpc(npcId)
QUEST.addTalkId(npcId)
после st.getPlayer().getStat().removeExpAndSp((st.getPlayer().getExp() - Experience.LEVEL[st.getPlayer().getStat().getLevel() - 79]),0)
вписываем команду типо st.getPlayer().getStat().admin_remove_all_skills
нед.
Вот кусок кода оттуда, который удаляет все скиллы
{
if (activeChar.getTarget() instanceof L2PcInstance)
{
L2PcInstance player = (L2PcInstance) activeChar.getTarget();
for (L2Skill skill : player.getAllSkills())
player.removeSkill(skill);
activeChar.sendMessage("You removed all skills from " + player.getName());
player.sendMessage("Admin removed all skills from you.");
player.sendSkillList();
player.broadcastUserInfo();
}
Объект player у нас уже есть в квесте
Осталось узнать, как организовать на Питоне этот цикл
player.removeSkill(skill);
Я не знаю :)
А можно же как-то и на Яве квесты писать.
Или, не заморачиваясь на Питоне, можно создать в ядре свой метод.. и уже его вызвать из Питона




