Вопрос по ядру оверов

ツsmile10ツ

Гений мысли
Проверенный
Победитель в номинации 2022
Победитель в номинации 2016
Медаль за активность на Форуме
За заслуги перед форумом
Разработчик
Сообщения
1 438
Розыгрыши
0
Репутация
2 627
Реакции
1 242
Баллы
1 808
Собственно, так как сам я в области жавы чуть умнее ансиента (словами гринда - колхозник), хочу узнать.
Есть ли в такой параметр как поясню пожалуй подробно.
есть OnZoneEnter, есть OnZoneLeave, а OnZoneCurrently есть не?)

onActive из model.Zone просто пахать не хочет, хотя именно он за активность зоны отвечает.
Оффтоп:

Да, вопрос на уровне "село Зажопинск"
 
Последнее редактирование:
До ансиента мне увы ещё далеко , но полазив в ядре лыжи так же не нашёл схожего по типу метода.
Есть только подобные примеры :

@Override
protected void onEnter(L2Character character)
{
if (_skills != null)
{
if (getSettings().getTask() == null)
{
synchronized (this)
{
if (getSettings().getTask() == null)
{
getSettings().setTask(ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
}
}
}
}
if (character.isPlayer())
{
character.setInsideZone(ZoneId.ALTERED, true);
if (_isShowDangerIcon)

{
character.setInsideZone(ZoneId.DANGER_AREA, true);
character.sendPacket(new EtcStatusUpdate(character.getActingPlayer()));
}
}
}

@Override
protected void onExit(L2Character character)
{
if (character.isPlayer())
{
character.setInsideZone(ZoneId.ALTERED, false);
if (_isShowDangerIcon)
{
character.setInsideZone(ZoneId.DANGER_AREA, false);
if (!character.isInsideZone(ZoneId.DANGER_AREA))

{
character.sendPacket(new EtcStatusUpdate(character.getActingPlayer()));
}
}
}
if (_characterList.isEmpty() && (getSettings().getTask() != null))
{
getSettings().clear();
}
}

[P.s] А чем отличаеться к примеру Ваш предпологаемый метод типа OnActive / Current от onEnter ? суть то одна и та же практический. Быть может данный метод и не обязателен в использовании или не столь важен в использовании т.к есть подобный метод onEnter и insideZone.

Оффтоп:
Прошу прощения то что под спойлером а не как положено под {code} {/code} т.к хотел подчеркнуть текст.
 
Последнее редактирование:

    ツsmile10ツ

    Баллов: 14
    Без комментариев
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
а че сделать нужно?
 
В ДП классе подтяните зону и проверяйте по таймеру
 

    ツsmile10ツ

    Баллов: 14
    Без комментариев
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
проверять игрока в активной зоне

Чтобы проверить находиться ли игрок в зоне есть метод isInZone для Creature
Чтобы проверить активна ли зона, есть метод isActive для Zone

Конкретно опиши задачу, подскажу как сделать лучше
 

    ツsmile10ツ

    Баллов: 14
    За неоценимый вклад в развитие колхозников

    *Immortal Pony*

    Баллов: 8
    Без комментариев
Код:
private static Zone _zone = ReflectionUtils.getZone("[zona_name]");
if(_zone.isActive() && _zone.checkIfInZone(Creature)){ }
P.S. Так же установить флаг активности при ините setActive(true);, ну либо убрать активность setActive(false);. В зависимости что нужно сделать. Описания талкового то нету.
Проверить игрока в активной зоне.
 
Последнее редактирование:

    ツsmile10ツ

    Баллов: 14
    Без комментариев
Код:
private static Zone _zone = ReflectionUtils.getZone("[zona_name]");
if(_zone.isActive() && _zone.checkIfInZone(Creature)){ }
P.S. Так же установить флаг активности при ините setActive(true);, ну либо убрать активность setActive(false);. В зависимости что нужно сделать. Описания талкового то нету.
Проверить игрока в активной зоне.
Хочу снимать с плеера трансформации в активной зоне, при Enterzone снимает замечательно, а вот если заюзать её в зоне то проблема. В ентерзоне работает вот так.
3jfKZvF.webp
 
Последнее редактирование модератором:
  • Мне нравится
Реакции: FirstBlood

    Mangol

    Баллов: 4
    Без комментариев

    *Immortal Pony*

    Баллов: 8
    Без комментариев
Хочу снимать с плеера трансформации в активной зоне, при Enterzone снимает замечательно, а вот если заюзать её в зоне то проблема.
При какой трансформе ? При любой?
Есть 2 момента. Сделать костыль в какой то зоне.
Либо сделать через конд скила.
 
можно еще проверять через Н времени есть ли кто то в этой зоне в трансе
 

    ツsmile10ツ

    Баллов: 14
    Без комментариев
При какой трансформе ? При любой?
Есть 2 момента. Сделать костыль в какой то зоне.
Либо сделать через конд скила.
Да, при любой. Есть параметр в зоне <set name="transformprotection" val="true" />, в ентерзоне он его чекает, а так чет не хочет
 
Метод более гибкий через конд скила. Можно описать юз разных трансформ разными зонами для юза.
Метод для проверки в активной зоне выше.
Как еще писали через трид через н-секунд времени проверять.
DocumentBase.java = > метод parsePlayerCondition в конце после любого esle if(бла бла)

Код:
            else if("check_zone_default".equalsIgnoreCase(nodeName))
            {
                final String st = a.getNodeValue();
                cond = joinAnd(cond, new ConditionCheckZoneDefault(st));
            }

сам Класс. = > gameserver.stats.conditions сюда

Код:
/**
* @author Mangol
*/
public class ConditionCheckZoneDefault extends Condition
{
    private final String _zones_name;

    public ConditionCheckZoneDefault(final String zones_name)
    {
        _zones_name = zones_name;
    }

    @Override
    protected boolean testImpl(final Env env)
    {
        for(final String zone_name : _zones_name.split(";"))
        {
            if(ReflectionUtils.getZone(zone_name).checkIfInZone((Player) env.character))
            {
                //TODO Say нельзя юзать транcформу в этой зоне.
                return false;
            }
        }
        return true;
    }
}

На скилл трансформации вешаешь.

Код:
    <skill id="333333" levels="1" name="">
        <cond>
            <player check_zone_default="zone_name1;zone_blala;zone_ffff" />
        </cond>
    </skill>

P.S. примерно под лост.
Это подобие как в птс только там описывают сразу территорию. op_territory
P.S.S. Используется для реального мира(не инстанс)
 
Последнее редактирование:
Так же хочу отметить что... Метод с проверкой через н времени очень затратный т.к. придется вытягивать все плееров в зоне.
Так же можно сделать через Листенер(OnAttackListener) если атаковал в трансформе то Say и трансформируемся в исходное положение. (Листенер нужно инитализировать при входе в зону.)
 
Так же хочу отметить что... Метод с проверкой через н времени очень затратный т.к. придется вытягивать все плееров в зоне.
Так же можно сделать через Листенер(OnAttackListener) если атаковал в трансформе то Say и трансформируемся в исходное положение. (Листенер нужно инитализировать при входе в зону.)
угу, Ваш метод более лучше, тогда не подумал о таком))) спасибо за наводку
 
Чё оно хочет, чёт не догоняю:D
Код:
[15.06.15 14:45:47:004] ERROR clientpackets.L2GameClientPacket: Client: IN_GAME IP: 127.0.0.1 Account: admin Player : test[268480062] - Failed running: [C] UseItem - Server Version: -1
java.lang.NullPointerException
    at org.mmocore.gameserver.stats.conditions.ConditionCheckZoneDefault.testImpl(ConditionCheckZoneDefault.java:25)
    at org.mmocore.gameserver.stats.conditions.Condition.test(Condition.java:24)
    at org.mmocore.gameserver.model.Skill.checkCondition(Skill.java:946)
    at org.mmocore.gameserver.skills.skillclasses.Transformation.checkCondition(Transformation.java:96)
    at handler.items.ItemSkills.useItem(ItemSkills.java:55)
    at org.mmocore.gameserver.clientpackets.UseItem.runImpl(UseItem.java:95)
    at org.mmocore.gameserver.clientpackets.L2GameClientPacket.run(L2GameClientPacket.java:50)
    at org.mmocore.commons.net.nio.impl.MMOExecutableQueue.run(MMOExecutableQueue.java:38)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
 
Последний метод с атакой внутри зоны.
На тест не проверял.

Код:
/**
* @author Mangol
*/
public class CustomZone implements OnInitScriptListener
{
    private static ZoneListener _zoneListener;
    private final AttackListener attackListener = new AttackListener();
    private static String[] zones = { "[zone1]", "[zone2]", };

    @Override
    public void onInit()
    {
        _zoneListener = new ZoneListener();
        for(final String z : zones)
        {
            final Zone zone = ReflectionUtils.getZone(z);
            zone.addListener(_zoneListener);
        }
    }

    private class ZoneListener implements OnZoneEnterLeaveListener
    {
        @Override
        public void onZoneEnter(final Zone zone, final Creature cha)
        {
            if(zone.getParams() == null || !cha.isPlayable())
            {
                return;
            }
            final Player player = cha.getPlayer();
            if(zone.getParams().getBool("transformprotection"))
            {
                if(player != null)
                {
                    player.setTransformation(0);
                    player.sendMessage("Что творишь Что творишь!!1");
                }
            }
            player.addListener(attackListener);
        }

        @Override
        public void onZoneLeave(final Zone zone, final Creature cha)
        {
            if(cha.isPlayer())
            {
                cha.removeListener(attackListener);
            }
        }
    }

    private class AttackListener implements OnAttackListener
    {
        @Override
        public void onAttack(final Creature actor, final Creature target)
        {
            if(actor.isPlayer())
            {
                final Player player = actor.getPlayer();
                if(player.getTransformation() > 0)
                {
                    player.setTransformation(0);
                    player.sendMessage("Что творишь Что творишь!!1");
                }
            }
        }
    }
}

s10 А ты на итем чтоле завязал конд ?
P.S. покажи скил на котором висит конд.
 
Последний метод с атакой внутри зоны.
На тест не проверял.

Код:
/**
* @author Mangol
*/
public class CustomZone implements OnInitScriptListener
{
    private static ZoneListener _zoneListener;
    private final AttackListener attackListener = new AttackListener();
    private static String[] zones = { "[zone1]", "[zone2]", };

    @Override
    public void onInit()
    {
        _zoneListener = new ZoneListener();
        for(final String z : zones)
        {
            final Zone zone = ReflectionUtils.getZone(z);
            zone.addListener(_zoneListener);
        }
    }

    private class ZoneListener implements OnZoneEnterLeaveListener
    {
        @Override
        public void onZoneEnter(final Zone zone, final Creature cha)
        {
            if(zone.getParams() == null || !cha.isPlayable())
            {
                return;
            }
            final Player player = cha.getPlayer();
            if(zone.getParams().getBool("transformprotection"))
            {
                if(player != null)
                {
                    player.setTransformation(0);
                    player.sendMessage("Что творишь Что творишь!!1");
                }
            }
            player.addListener(attackListener);
        }

        @Override
        public void onZoneLeave(final Zone zone, final Creature cha)
        {
            if(cha.isPlayer())
            {
                cha.removeListener(attackListener);
            }
        }
    }

    private class AttackListener implements OnAttackListener
    {
        @Override
        public void onAttack(final Creature actor, final Creature target)
        {
            if(actor.isPlayer())
            {
                final Player player = actor.getPlayer();
                if(player.getTransformation() > 0)
                {
                    player.setTransformation(0);
                    player.sendMessage("Что творишь Что творишь!!1");
                }
            }
        }
    }
}

s10 А ты на итем чтоле завязал конд ?
P.S. покажи скил на котором висит конд.
но это на все трансы, красивее будет когда в скиле прописано какие можно юзать и какие нет
 
Последний метод с атакой внутри зоны.
На тест не проверял.

Код:
/**
* @author Mangol
*/
public class CustomZone implements OnInitScriptListener
{
    private static ZoneListener _zoneListener;
    private final AttackListener attackListener = new AttackListener();
    private static String[] zones = { "[zone1]", "[zone2]", };

    @Override
    public void onInit()
    {
        _zoneListener = new ZoneListener();
        for(final String z : zones)
        {
            final Zone zone = ReflectionUtils.getZone(z);
            zone.addListener(_zoneListener);
        }
    }

    private class ZoneListener implements OnZoneEnterLeaveListener
    {
        @Override
        public void onZoneEnter(final Zone zone, final Creature cha)
        {
            if(zone.getParams() == null || !cha.isPlayable())
            {
                return;
            }
            final Player player = cha.getPlayer();
            if(zone.getParams().getBool("transformprotection"))
            {
                if(player != null)
                {
                    player.setTransformation(0);
                    player.sendMessage("Что творишь Что творишь!!1");
                }
            }
            player.addListener(attackListener);
        }

        @Override
        public void onZoneLeave(final Zone zone, final Creature cha)
        {
            if(cha.isPlayer())
            {
                cha.removeListener(attackListener);
            }
        }
    }

    private class AttackListener implements OnAttackListener
    {
        @Override
        public void onAttack(final Creature actor, final Creature target)
        {
            if(actor.isPlayer())
            {
                final Player player = actor.getPlayer();
                if(player.getTransformation() > 0)
                {
                    player.setTransformation(0);
                    player.sendMessage("Что творишь Что творишь!!1");
                }
            }
        }
    }
}

s10 А ты на итем чтоле завязал конд ?
P.S. покажи скил на котором висит конд.
Код:
<skill id="22205" levels="1" name="Transform Anakim">
        <set name="magicType" val="SPECIAL" />
        <set name="icon" val="icon.skilltransform1" />
        <set name="hitTime" val="500" />
        <set name="target" val="TARGET_SELF" />
        <set name="skillType" val="TRANSFORMATION" />
        <set name="addSkills" val="721;2;724;1;722;2;720;2;723;1;619;1;5491;1" />
        <set name="npcId" val="13100" />
        <set name="operateType" val="OP_ACTIVE" />
        <set name="isHandler" val="true" />
        <set name="itemConsumeId" val="21186" />
        <set name="itemConsumeCount" val="1" />
        <cond msgId="1509">
            <not>
                <player olympiad="true" />
            </not>
        </cond>
        <cond>
            <player check_zone_default="queen_ant_epic" />
        </cond>
        <for>
            <effect count="1" name="Transformation" time="1800" val="306">
                <set order="0x40" stat="STR" val="46" />
                <set order="0x40" stat="DEX" val="30" />
                <set order="0x40" stat="CON" val="49" />
                <set order="0x40" stat="INT" val="50" />
                <set order="0x40" stat="WIT" val="20" />
                <set order="0x40" stat="MEN" val="45" />
            </effect>
        </for>
    </skill>
 
Код:
<skill id="22205" levels="1" name="Transform Anakim">
        <set name="magicType" val="SPECIAL" />
        <set name="icon" val="icon.skilltransform1" />
        <set name="hitTime" val="500" />
        <set name="target" val="TARGET_SELF" />
        <set name="skillType" val="TRANSFORMATION" />
        <set name="addSkills" val="721;2;724;1;722;2;720;2;723;1;619;1;5491;1" />
        <set name="npcId" val="13100" />
        <set name="operateType" val="OP_ACTIVE" />
        <set name="isHandler" val="true" />
        <set name="itemConsumeId" val="21186" />
        <set name="itemConsumeCount" val="1" />
        <cond msgId="1509">
            <not>
                <player olympiad="true" />
            </not>
        </cond>
        <cond>
            <player check_zone_default="queen_ant_epic" />
        </cond>
        <for>
            <effect count="1" name="Transformation" time="1800" val="306">
                <set order="0x40" stat="STR" val="46" />
                <set order="0x40" stat="DEX" val="30" />
                <set order="0x40" stat="CON" val="49" />
                <set order="0x40" stat="INT" val="50" />
                <set order="0x40" stat="WIT" val="20" />
                <set order="0x40" stat="MEN" val="45" />
            </effect>
        </for>
    </skill>

Случайно не так ?
<cond>
<player check_zone_default="[queen_ant_epic]" />
</cond>
 
но это на все трансы, красивее будет когда в скиле прописано какие можно юзать и какие нет
Все верно. Но можно закостылить конечно вложив в массив иды трансформ и сравнивать :-)
 
Назад
Сверху Снизу