Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Всём привет. Подскажите пожалуйста, где храниться обработка каста игрока, к примеру если скилл имеет тип Single, в хандлерах нет никаких условий, а хотелось бы добавить к примеру без контрол, если персонаж флагнут, то его нельзя хилить
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.targethandlers.affectscope;
import java.util.function.Consumer;
import org.l2jmobius.gameserver.handler.AffectObjectHandler;
import org.l2jmobius.gameserver.handler.IAffectObjectHandler;
import org.l2jmobius.gameserver.handler.IAffectScopeHandler;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.targets.AffectScope;
import org.l2jmobius.gameserver.model.skill.targets.TargetType;
/**
* Single target affect scope implementation.
* @author Nik
*/
public class Single implements IAffectScopeHandler
{
@Override
public void forEachAffected(Creature creature, WorldObject target, Skill skill, Consumer<? super WorldObject> action)
{
final IAffectObjectHandler affectObject = AffectObjectHandler.getInstance().getHandler(skill.getAffectObject());
if (target.isCreature())
{
if (skill.getTargetType() == TargetType.GROUND)
{
action.accept(creature); // Return yourself to mark that effects can use your current skill's world position.
}
if (((affectObject == null) || affectObject.checkAffectedObject(creature, (Creature) target)))
{
action.accept(target); // Return yourself to mark that effects can use your current skill's world position.
}
}
else if (target.isItem())
{
action.accept(target); // Return yourself to mark that effects can use your current skill's world position.
}
}
@Override
public Enum<AffectScope> getAffectScopeType()
{
return AffectScope.SINGLE;
}
}
Ни одной проверки, ни на ПК, ни на флаг, дальше идем в хандлер TARGET:
Код:
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.targethandlers;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.ITargetTypeHandler;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.targets.TargetType;
import org.l2jmobius.gameserver.network.SystemMessageId;
/**
* Any friendly selected target or enemy if force use. Works on dead targets or doors as well.
* @author Nik
*/
public class Target implements ITargetTypeHandler
{
@Override
public Enum<TargetType> getTargetType()
{
return TargetType.TARGET;
}
@Override
public WorldObject getTarget(Creature creature, WorldObject selectedTarget, Skill skill, boolean forceUse, boolean dontMove, boolean sendMessage)
{
if (selectedTarget == null)
{
return null;
}
if (!selectedTarget.isCreature())
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.INVALID_TARGET);
}
return null;
}
final Creature target = (Creature) selectedTarget;
// You can always target yourself.
if (creature == target)
{
return target;
}
// Check for cast range if character cannot move. TODO: char will start follow until within castrange, but if his moving is blocked by geodata, this msg will be sent.
if (dontMove && (creature.calculateDistance2D(target) > skill.getCastRange()))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
}
return null;
}
if (skill.isFlyType() && !GeoEngine.getInstance().canMoveToTarget(creature.getX(), creature.getY(), creature.getZ(), target.getX(), target.getY(), target.getZ(), creature.getInstanceWorld()))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.YOU_CANNOT_ATTACK_THE_TARGET);
}
return null;
}
// Geodata check when character is within range.
if (!GeoEngine.getInstance().canSeeTarget(creature, target))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.CANNOT_SEE_TARGET);
}
return null;
}
return target;
}
}
И тут ни одной проверки, а по идее то, ни флагнутого, ни ПК, нельзя хилить без КТРЛ? Где это обрабатывается?
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.targethandlers.affectscope;
import java.util.function.Consumer;
import org.l2jmobius.gameserver.handler.AffectObjectHandler;
import org.l2jmobius.gameserver.handler.IAffectObjectHandler;
import org.l2jmobius.gameserver.handler.IAffectScopeHandler;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.targets.AffectScope;
import org.l2jmobius.gameserver.model.skill.targets.TargetType;
/**
* Single target affect scope implementation.
* @author Nik
*/
public class Single implements IAffectScopeHandler
{
@Override
public void forEachAffected(Creature creature, WorldObject target, Skill skill, Consumer<? super WorldObject> action)
{
final IAffectObjectHandler affectObject = AffectObjectHandler.getInstance().getHandler(skill.getAffectObject());
if (target.isCreature())
{
if (skill.getTargetType() == TargetType.GROUND)
{
action.accept(creature); // Return yourself to mark that effects can use your current skill's world position.
}
if (((affectObject == null) || affectObject.checkAffectedObject(creature, (Creature) target)))
{
action.accept(target); // Return yourself to mark that effects can use your current skill's world position.
}
}
else if (target.isItem())
{
action.accept(target); // Return yourself to mark that effects can use your current skill's world position.
}
}
@Override
public Enum<AffectScope> getAffectScopeType()
{
return AffectScope.SINGLE;
}
}
Ни одной проверки, ни на ПК, ни на флаг, дальше идем в хандлер TARGET:
Код:
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.targethandlers;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.ITargetTypeHandler;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.targets.TargetType;
import org.l2jmobius.gameserver.network.SystemMessageId;
/**
* Any friendly selected target or enemy if force use. Works on dead targets or doors as well.
* @author Nik
*/
public class Target implements ITargetTypeHandler
{
@Override
public Enum<TargetType> getTargetType()
{
return TargetType.TARGET;
}
@Override
public WorldObject getTarget(Creature creature, WorldObject selectedTarget, Skill skill, boolean forceUse, boolean dontMove, boolean sendMessage)
{
if (selectedTarget == null)
{
return null;
}
if (!selectedTarget.isCreature())
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.INVALID_TARGET);
}
return null;
}
final Creature target = (Creature) selectedTarget;
// You can always target yourself.
if (creature == target)
{
return target;
}
// Check for cast range if character cannot move. TODO: char will start follow until within castrange, but if his moving is blocked by geodata, this msg will be sent.
if (dontMove && (creature.calculateDistance2D(target) > skill.getCastRange()))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
}
return null;
}
if (skill.isFlyType() && !GeoEngine.getInstance().canMoveToTarget(creature.getX(), creature.getY(), creature.getZ(), target.getX(), target.getY(), target.getZ(), creature.getInstanceWorld()))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.YOU_CANNOT_ATTACK_THE_TARGET);
}
return null;
}
// Geodata check when character is within range.
if (!GeoEngine.getInstance().canSeeTarget(creature, target))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.CANNOT_SEE_TARGET);
}
return null;
}
return target;
}
}
И тут ни одной проверки, а по идее то, ни флагнутого, ни ПК, нельзя хилить без КТРЛ? Где это обрабатывается?
1. Самый простой способ. В общую проверку юза умений в раздел умений на таргет создать условие, что есть определенный список умений который нельзя юзать на флаг > 0.
Выносишь этот список под конфиг. Ну и наполняешь его нужными умениями и будет пофигу что это за скилл хилл не хилл главное все id выписать.
2. Способ уже интереснее. Во все классы хиллов пропихать проверку под конфиг на флаг > 0. (Как предложил Оби.)
3. Этот способ немного посложнее.
Создать отдельное условие true/false и вынести в наполнение xml. Прописываем необходимые условия и выносим в xml нужную строчку. Будет что-то вроде: <set name="UseSkillTargetPvpFlag" val="True"/>
Ну и еще можно пяток вариантов реализовать, но дальше уже сам додумывай
Самое правильное по моему мнению реализовать по 3 варианту, так как это будет подниматься с загрузкой сборки и больше не парить никаким образом код.
На данном сайте используются файлы cookie, чтобы персонализировать содержимое и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.