package com.l2cccp.gameserver.skills.skillclasses;
import java.util.List;
import com.l2cccp.gameserver.instancemanager.ReflectionManager;
import com.l2cccp.gameserver.model.Creature;
import com.l2cccp.gameserver.model.Player;
import com.l2cccp.gameserver.model.Skill;
import com.l2cccp.gameserver.model.Zone;
import com.l2cccp.gameserver.model.actor.instances.player.TpBookMark;
import com.l2cccp.gameserver.network.l2.components.SystemMsg;
import com.l2cccp.gameserver.network.l2.s2c.SystemMessage;
import com.l2cccp.gameserver.skills.SkillEntry;
import com.l2cccp.gameserver.templates.StatsSet;
/**
* @author VISTALL
* @date 17:03/08.08.2011
*/
public class BookMarkTeleport extends Skill
{
public BookMarkTeleport(StatsSet set)
{
super(set);
}
@Override
public boolean checkCondition(SkillEntry skillEntry, final Creature activeChar, final Creature target, boolean forceUse, boolean dontMove, boolean first)
{
if(!activeChar.isPlayer() || !super.checkCondition(skillEntry, activeChar, target, forceUse, dontMove, first))
return false;
else
activeChar.sendMessage("1");
Player player = activeChar.getPlayer();
TpBookMark loc = (TpBookMark)player.getVars().get(Player.TELEPORT_BOOKMARK);
if(loc == null)
{
player.sendPacket(new SystemMessage(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addSkillName(skillEntry));
return false;
}
else
activeChar.sendMessage("2");
if(player.isActionBlocked(Zone.BLOCKED_ACTION_USE_BOOKMARK))
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_IN_THIS_AREA);
return false;
}
else
activeChar.sendMessage("3");
if(player.getActiveWeaponFlagAttachment() != null)
{
player.sendPacket(SystemMsg.YOU_CANNOT_TELEPORT_WHILE_IN_POSSESSION_OF_A_WARD);
return false;
}
else
activeChar.sendMessage("4");
if(player.isInOlympiadMode())
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_WHILE_PARTICIPATING_IN_AN_OLYMPIAD_MATCH);
return false;
}
else
activeChar.sendMessage("5");
if(player.getReflection() != ReflectionManager.DEFAULT)
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_IN_AN_INSTANT_ZONE);
return false;
}
else
activeChar.sendMessage("6");
if(player.isInDuel())
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_DURING_A_DUEL);
return false;
}
else
activeChar.sendMessage("7");
if(player.isInCombat() || player.getPvpFlag() != 0)
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_DURING_A_BATTLE);
return false;
}
else
activeChar.sendMessage("8");
if(player.isOnSiegeField() || player.isInZoneBattle())
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_WHILE_PARTICIPATING_A_LARGESCALE_BATTLE_SUCH_AS_A_CASTLE_SIEGE_FORTRESS_SIEGE_OR_HIDEOUT_SIEGE);
return false;
}
else
activeChar.sendMessage("9");
if(player.isFlying())
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_WHILE_FLYING);
return false;
}
else
activeChar.sendMessage("10");
if(player.isInWater() || player.isInBoat())
{
player.sendPacket(SystemMsg.YOU_CANNOT_USE_MY_TELEPORTS_UNDERWATER);
return false;
}
else
activeChar.sendMessage("11");
if(first && !player.consumeItem(13016, 1))
{
player.sendPacket(SystemMsg.YOU_CANNOT_TELEPORT_BECAUSE_YOU_DO_NOT_HAVE_A_TELEPORT_ITEM);
return false;
}
else
activeChar.sendMessage("12");
return true;
}
@Override
public void useSkill(SkillEntry skillEntry, Creature activeChar, List<Creature> targets)
{
activeChar.sendMessage("use 13");
}
}
package com.l2cccp.gameserver.network.l2.c2s;
import com.l2cccp.commons.collections.CollectionUtils;
import com.l2cccp.gameserver.model.Player;
import com.l2cccp.gameserver.model.actor.instances.player.TpBookMark;
import com.l2cccp.gameserver.skills.SkillEntry;
import com.l2cccp.gameserver.tables.SkillTable;
public class RequestTeleportBookMark extends L2GameClientPacket
{
private static final SkillEntry SKILL = SkillTable.getInstance().getSkillEntry(2588, 1);
private int _slot;
@Override
protected void readImpl()
{
_slot = readD();
}
@Override
protected void runImpl()
{
Player activeChar = getClient().getActiveChar();
if(activeChar == null)
return;
if(activeChar.isActionsDisabled() || activeChar.isTeleportBlocked())
{
activeChar.sendActionFailed();
return;
}
TpBookMark bookMark = CollectionUtils.safeGet(activeChar.getTpBookMarks(), _slot - 1);
if(bookMark == null)
return;
activeChar.getVars().set(Player.TELEPORT_BOOKMARK, bookMark);
activeChar.getAI().Cast(SKILL, activeChar);
}
}
@Override
public void onMagicUseTimer(Creature aimingTarget, SkillEntry skillEntry, boolean forceUse)
{
if(!(skillEntry.getTemplate().isHandler() || skillEntry.getTemplate().isTrigger() || isGM() || skillEntry.getId() >= 40000 || skillEntry.getId() == 2588)) // FIXME: Hardcode skill id!
{
if(!getAllSkills().contains(skillEntry))
{
onCastEndTime(skillEntry);
return;
}
}
super.onMagicUseTimer(aimingTarget, skillEntry, forceUse);
}
нз. Но вообще немного не понятно нахрена юзать по настоящему скилл? Для визуального отображения - более правильно бутафорно его использовать - на такое не будет проверок базовых по ядру.Argest, спасибо большое за помощь!
Hibiki, как-то жестоко давать возможность юзать точки тп только админу, надо бы исключение добавтиь. ) Спасибо за ответ!
Может кому решение пригодится:
Java:@Override public void onMagicUseTimer(Creature aimingTarget, SkillEntry skillEntry, boolean forceUse) { if(!(skillEntry.getTemplate().isHandler() || skillEntry.getTemplate().isTrigger() || isGM() || skillEntry.getId() >= 40000 || skillEntry.getId() == 2588)) // FIXME: Hardcode skill id! { if(!getAllSkills().contains(skillEntry)) { onCastEndTime(skillEntry); return; } } super.onMagicUseTimer(aimingTarget, skillEntry, forceUse); }
Докинул исключение: || skillEntry.getId() == 2588 - профит.
<skill id="2588" levels="1" name="My Teleport" >
<set name="magicType" val="SPECIAL" />
<set name="icon" val="icon.skill0000" />
<set name="magicLevel" val="1" />
<set name="hitTime" val="3000" />
<set name="hitCancelTime" val="500" />
<set name="target" val="TARGET_SELF" />
<set name="skillType" val="BOOKMARK_TELEPORT" />
<set name="operateType" val="OP_ACTIVE" />
</skill>
Я имел ввиду даже если сам скилл не тратит ману - использование скилла по настоящему через какой-то метод на который могут не действовать иные проверки - или не учитываться какая-то проверка может привести к плачевным последствиям.Argest, ману не будет брать, там скилл без требований, но реализация и правда наркоманская. ) Вообще обделили эту функцию в дефолтной реализации, и хранение в БД кривоватое, и править нельзя, и использовать только гмы могут. )
Код:<skill id="2588" levels="1" name="My Teleport" > <set name="magicType" val="SPECIAL" /> <set name="icon" val="icon.skill0000" /> <set name="magicLevel" val="1" /> <set name="hitTime" val="3000" /> <set name="hitCancelTime" val="500" /> <set name="target" val="TARGET_SELF" /> <set name="skillType" val="BOOKMARK_TELEPORT" /> <set name="operateType" val="OP_ACTIVE" /> </skill>
public boolean tryTeleport(int slot)
{
if (!checkFirstConditions(_player) || !checkTeleportConditions(_player))
return false;
if (slot < 1 || slot > _list.size())
return false;
BookMark bookmark = _list.get(slot - 1);
if (bookmark == null)
return false;
if (!checkTeleportLocation(_player, bookmark.getX(), bookmark.getY(), bookmark.getZ()))
return false;
Skill skill = CommonSkill.MY_TELEPORT.getSkill();
if (!skill.checkCondition(_player, _player, false, false, true))
return false;
if (ItemUtils.getItemCount(_player, CommonItem.MY_TELEPORT_SCROLL.getId()) < 1)
{
_player.sendPacket(SystemMsg.YOU_CANNOT_TELEPORT_BECAUSE_YOU_DO_NOT_HAVE_A_TELEPORT_ITEM);
return false;
}
_player.getVariables().setSessionVar(Variables.VAR_BOOKMARK_EXPIRE, System.currentTimeMillis() + skill.getHitTime() * 2);
_player.getVariables().setSessionObject(Variables.VAR_BOOKMARK_OBJECT, bookmark);
_player.doCast(skill, _player, false);
return true;
}
package l2p.gameserver.model.skills.effects;
import l2p.gameserver.enums.CommonItem;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.actor.instances.player.BookMark;
import l2p.gameserver.model.actor.instances.player.BookMarkList;
import l2p.gameserver.model.actor.instances.player.Variables;
import l2p.gameserver.model.skills.Effect;
import l2p.gameserver.network.components.SystemMsg;
import l2p.gameserver.stats.Env;
import l2p.gameserver.utils.ItemUtils;
public class EffectTeleportToBookMark extends Effect
{
public EffectTeleportToBookMark(Env env, EffectTemplate template)
{
super(env, template);
}
@Override
public boolean checkCondition()
{
if (_effected == null || !_effected.isPlayer())
return false;
Player player = (Player) _effected;
if (player.getVariables().getSessionVar(Variables.VAR_BOOKMARK_EXPIRE, 0L) < System.currentTimeMillis())
return false;
Object obj = player.getVariables().getSessionObject(Variables.VAR_BOOKMARK_OBJECT);
if (obj == null || !(obj instanceof BookMark))
return false;
BookMark bookmark = (BookMark) obj;
if (!BookMarkList.checkFirstConditions(player) || !BookMarkList.checkTeleportConditions(player))
return false;
if (!BookMarkList.checkTeleportLocation(player, bookmark.getX(), bookmark.getY(), bookmark.getZ()))
return false;
if (ItemUtils.removeItem(player, CommonItem.MY_TELEPORT_SCROLL.getId(), 1) != 1)
{
player.sendPacket(SystemMsg.YOU_CANNOT_TELEPORT_BECAUSE_YOU_DO_NOT_HAVE_A_TELEPORT_ITEM);
return false;
}
return super.checkCondition();
}
@Override
public void onStart()
{
super.onStart();
Player player = (Player) _effected;
Object obj = player.getVariables().getSessionObject(Variables.VAR_BOOKMARK_OBJECT);
if (obj == null || !(obj instanceof BookMark))
return;
BookMark bookmark = (BookMark) obj;
player.teleToLocation(bookmark.getX(), bookmark.getY(), bookmark.getZ());
player.getVariables().unsetSessionVar(Variables.VAR_BOOKMARK_EXPIRE);
player.getVariables().unsetSessionObject(Variables.VAR_BOOKMARK_OBJECT);
}
}
Там тоже метод достаточно наркоманский, не советовал бы брать пример с него.Rolo, покопай сурсы мобиуса там же в ессенсе все телепорты с эффектом анимации скила идут
у него это реализовано
Удобнее всего это реализовывать отдельным скриптом в сборку - а не в исходы, в исходах оставить только направители.DarkEmpire, да куда мне эссенс, я с ИЛом-то не разобрался, полез на ХФ, как в дремучий лес, на эссенсе я вообще загнусь. )) А телепорт сделать с анимацией скилла не сложно, эта реализация меня не прельщает. )
Любая нормальная реализация будет связана с ядром, а скрипты отдельно ваять это наркомания. И сидеть потом смотреть в дп +100500 скриптов с хандлерами вот ни разу не удобно и не практично. Поэтому субуго мое мнение по серверо-стороению на такие сборки как мобиус, где все в датапаке лежит, только больше тратиться времени как раз на правки. Ибо приходится что-то править в ядре а потом еще и скрипты все проверять подгонять.Удобнее всего это реализовывать отдельным скриптом в сборку - а не в исходы, в исходах оставить только направители.
(Чтобы не компилить каждый раз целиком ядро, когда нужно будет что-то дополнить или фиксануть, а фиксить в том гавне придется со временем прилично.)
Как я это вижу:
Все необходимое вывести в конфиги, убрать использование скилла по настоящему, минимизировать общение с базой.
В checkCondition прописать все необходимые проверки (кроме тех что есть не хватает как минимум еще 5).
Ну и конечно же на всякий случай подставить затычки, что делать если мы сделали тп и сервер упал/ушел в ребут ну и т.д. дабы поменьше было у людей крашей и прочих прелестей)
ну тут не согласен, ты смотришь это со стороны разраба конечно тебе удобнее там все правитьЛюбая нормальная реализация будет связана с ядром, а скрипты отдельно ваять это наркомания. И сидеть потом смотреть в дп +100500 скриптов с хандлерами вот ни разу не удобно и не практично. Поэтому субуго мое мнение по серверо-стороению на такие сборки как мобиус, где все в датапаке лежит, только больше тратиться времени как раз на правки. Ибо приходится что-то править в ядре а потом еще и скрипты все проверять подгонять.
Все скрипты релоадить и не нужно, нужно только необходимые - лучше по 1. Если все по уму делать - и перезагрузку тоже по уму делать с нужными проверками, а так же всеми мерами предосторожности (типа тушить сам скрипт до перезагрузки, и активировать его только при полной загрузке и т..д.), то все окей - пользуюсь уже 4 года подобным на живых серверах, не раз выручало от мелких вроде фикса не того id-предмета- скилла-координат, до посерьезнее вроде фиксов дюпа.Ну релоадить скрипты без рестарта сервера тоже та еще рулетка - неизвестно что может не так переинициализироваться из-за этого.
Штатный функционал обязан быть в связке с ядром, а кастом кто мешает пилить скриптами? Просто не все сборки могут прослушивать и подгружать скрипты с датапака)ну тут не согласен, ты смотришь это со стороны разраба конечно тебе удобнее там все править, но врятли ты был по другую сторону и ощутил каково на живую ловить тот или иной баг. - в таком случае тебе придется - перекомпиливать ядро - ложить сервер и только потом уже получишь фикс.
(Это я говорю сугубо о нашей ситуации с точками тп, я же не говорю что нужно все сразу пихать в сборку.)
Но когда у тебя скрипт в сборке - ты можешь его поправить и отдельно перезалить, без ребута сервера, что позволит на лету исправлять различного рода проблемы.
А про наркоманию потом игрокам объяснять будешь и писать почему у тебя сервер постоянно в ребутах. (тут речь идет о множестве кастомок.)
По итогу ты получишь только минус к онлайну в замен своего "удобства".
Чтобы все было удобно, нужно сразу ядро подбивать под сборку, раскидывать в нужном порядке и компилить и проверять их вместе.
Даже если у человека 100500 скриптов я не вижу никакой проблемы в фиксах когда все доступно в 1 среде.
Если этого какая-то сборка не может, то это не значит что человек обязан до конца своих дней мучатся) пускай возьмет в тз - если сам не может пускай запилят люди ему правильную перезагрузку скриптов поштучно с выводом себе в гм панельку.Штатный функционал обязан быть в связке с ядром, а кастом кто мешает пилить скриптами? Просто не все сборки могут прослушивать и подгружать скрипты с датапака)
Когда сервер прослушивает весь дп и сам подгружает все скрипты - это идеал! А тот же мобиус хз что там пьет или нюхает, или просто долбится с пакетами. Все скрипты обьединять в с прогруку другими файлами а это файлы или папки грузить через хмл. (Да ну на***) мы что в 2010 году?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?