Админ конды для BookMarkTeleport (l2cccp)

Rolo

Верховньій Интерлюд Викинг
Викинги Рулона
Победитель в номинации 2023
Старожил I степени
Признанный автор
Знаток Lineage2
Разработчик
За знание датапака
За знание ядра
Просветитель
Медаль Благодарности
За заслуги перед форумом
Преподаватель
За веру и верность форуму
Веселый флудер
Медаль за активность на Форуме
Клиент разработчик
Магистр реакций
Стальной Визионер
Знаток письма
Архивариус
Победитель в номинации 2022
Победитель в номинации 2021
Мастер реакций
Стратег Данных
Любитель реакций
Куратор Данных
Неукротимое пламя
Победитель в номинации 2020
Сообщения
899
Розыгрыши
6
Решения
28
Репутация
1 960
Реакции
2 253
Баллы
1 063
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
CCCP HF last (https://mmo-dev.info/threads/cccp-hf-last.18160/)
Здравствуйте! Направьте, пожалуйста, в какую сторону копать.
Во время юза скилла какая-то вакханалия происходит, админ чары нормально все этапы проходят, а обычные почему-то фейлятся. Я никак не могу понять, где может быть зарыта эта проверка.

Прикрутил дебаг буквально на каждый конд, персонаж их успешно проходит, а потом молча фейлится:
Java:
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");
    }
}
На всякий случай:
Java:
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);
    }
}
Выглядит это вот так, сначала админ чар, потом обычный:
Посмотреть вложение 2021-07-26 13-22-58.mp4
 
Решение
Нигде там проверки не зарыто в исходах на запрет юз скилла которого у чара нет или быть не может?
Админ такую проверку может перескакивать.

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

По пакетам тут нужно смотреть., так пока точно не ясно.
 
  • Мне нравится
Реакции: Rolo

    Rolo

    Баллов: 5
    Да, Вы совершенно правы, спасибо большое за наводку, пол дня мне сэкономили, не меньше! )
Решение
На админке нет проверки на наличие скиллов, на обычном есть нельзя издать скилы которых нет в списке скиллов на момент завершения, баг при смене Саба и Юза скила разумеется не работает
 
  • Мне нравится
Реакции: Rolo
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 - профит.
 
Последнее редактирование:
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 - профит.
нз. Но вообще немного не понятно нахрена юзать по настоящему скилл? Для визуального отображения - более правильно бутафорно его использовать - на такое не будет проверок базовых по ядру.
А так получается, что человек в самом деле использует скилл 2588, то есть будет тратить ману и т.д.

Какой-то странный чувак писал этот скрипт.
 
  • Мне нравится
Реакции: Rolo
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>
 
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>
Я имел ввиду даже если сам скилл не тратит ману - использование скилла по настоящему через какой-то метод на который могут не действовать иные проверки - или не учитываться какая-то проверка может привести к плачевным последствиям.
К примеру можно забагать очередь с помощью использование данного скилла + другого скилла + действий выкинуть/поднять + пета.
(Тут нужно иметь в этом деле опыт и понимать что делать, а так я натыкался на очень неприятных читеров которые чудеса творили.)
Забагованная очередь приводит к багам когда чар может использовать скиллы - перепрыгивая базовые conditoins, или того хуже минуя откаты скиллов. К багам очередей уязвимы все сборки от оверов и фениксов до всяких лыж и т.д.

Поэтому использовать скриптами юз настоящих скиллов без должных проверок на очередь + проверки на иные действия, плюшки и т.д. - я бы не рекомендовал.
 
  • Вау
Реакции: Rolo
По логике проверки на наличие скилла должны быть по идее не в onMagicUseTimer, а в пакетах на запрос каста, типа RequestMagicSkillUse или RequestExMagicSkillUseGround, т.к. тогда это не будет ломать возможность запроса каста каких либо скиллов игроком вызовом из каких либо скриптов.

У меня кстати тоже та еще фигня в реализации телепортации в букмарках, но главное работает.
Ну а все знают главное правило "работает - не трогай" :D
Java:
    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;
    }
Java:
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
Rolo, покопай сурсы мобиуса там же в ессенсе все телепорты с эффектом анимации скила идут
у него это реализовано
 
DarkEmpire, да куда мне эссенс, я с ИЛом-то не разобрался, полез на ХФ, как в дремучий лес, на эссенсе я вообще загнусь. )) А телепорт сделать с анимацией скилла не сложно, эта реализация меня не прельщает. )
 
Rolo, покопай сурсы мобиуса там же в ессенсе все телепорты с эффектом анимации скила идут
у него это реализовано
Там тоже метод достаточно наркоманский, не советовал бы брать пример с него.

DarkEmpire, да куда мне эссенс, я с ИЛом-то не разобрался, полез на ХФ, как в дремучий лес, на эссенсе я вообще загнусь. )) А телепорт сделать с анимацией скилла не сложно, эта реализация меня не прельщает. )
Удобнее всего это реализовывать отдельным скриптом в сборку - а не в исходы, в исходах оставить только направители.
(Чтобы не компилить каждый раз целиком ядро, когда нужно будет что-то дополнить или фиксануть, а фиксить в том гавне придется со временем прилично.)

Как я это вижу:
Все необходимое вывести в конфиги, убрать использование скилла по настоящему, минимизировать общение с базой.
В checkCondition прописать все необходимые проверки (кроме тех что есть не хватает как минимум еще 5).

Ну и конечно же на всякий случай подставить затычки, что делать если мы сделали тп и сервер упал/ушел в ребут ну и т.д. дабы поменьше было у людей крашей и прочих прелестей)
 
  • Мне нравится
Реакции: Rolo
Удобнее всего это реализовывать отдельным скриптом в сборку - а не в исходы, в исходах оставить только направители.
(Чтобы не компилить каждый раз целиком ядро, когда нужно будет что-то дополнить или фиксануть, а фиксить в том гавне придется со временем прилично.)

Как я это вижу:
Все необходимое вывести в конфиги, убрать использование скилла по настоящему, минимизировать общение с базой.
В checkCondition прописать все необходимые проверки (кроме тех что есть не хватает как минимум еще 5).

Ну и конечно же на всякий случай подставить затычки, что делать если мы сделали тп и сервер упал/ушел в ребут ну и т.д. дабы поменьше было у людей крашей и прочих прелестей)
Любая нормальная реализация будет связана с ядром, а скрипты отдельно ваять это наркомания. И сидеть потом смотреть в дп +100500 скриптов с хандлерами вот ни разу не удобно и не практично. Поэтому субуго мое мнение по серверо-стороению на такие сборки как мобиус, где все в датапаке лежит, только больше тратиться времени как раз на правки. Ибо приходится что-то править в ядре а потом еще и скрипты все проверять подгонять.
 
Argest,Hibiki, Gaikotsu,LordWinter ,DarkEmpire, спасибо большое за развернутые и доступные ответы и советы! Почитать разные мнения по поднятым вопросам очень полезно и познавательно, признателен вам всем!

Я не хочу стать очередным заявляющим: "я с друзьями по локалке побегать, мне не для проекта", но я пока что по фану пилю лютую дичь со своим концептом, то, что всегда хотел видеть на извращенных мультипрофах ИЛа, когда сам играл, но так и не увидел. Не исключаю, и даже надеюсь, что "это" когда-то увидит мир и там даже зайдет побегать 10 человек - уже успех. :D Но я это к чему, я в любом случае собираюсь перепиливать прям все куда руки достанут (я одмен я так вижу, ога), потому мне очень полезно видеть разные взгляды по таким фундаментальным вопросам, да еще и с примерами и конкретикой!

P.S.: я вообще раньше сидел на PW soft и считал что для подобных кастомизаций - это топ вариант, спавн из БД - удобно же для кастома, ну! Я искренне не понимал, почему спавн в xml лучше, чем из БД, пока не прочел однажды сообщение WangYi о спавне по точкам и полигонам. ) А потом присмотрелся, что там за дырка, а не сборка и воистину ужаснулся. ) Спасибо большое всем за новые знания, а не хейт и стеб за подобные вопросы. )

#сорянзамногабукав
 
Последнее редактирование:
Любая нормальная реализация будет связана с ядром, а скрипты отдельно ваять это наркомания. И сидеть потом смотреть в дп +100500 скриптов с хандлерами вот ни разу не удобно и не практично. Поэтому субуго мое мнение по серверо-стороению на такие сборки как мобиус, где все в датапаке лежит, только больше тратиться времени как раз на правки. Ибо приходится что-то править в ядре а потом еще и скрипты все проверять подгонять.
ну тут не согласен, ты смотришь это со стороны разраба конечно тебе удобнее там все править :), но врятли ты был по другую сторону и ощутил каково на живую ловить тот или иной баг. - в таком случае тебе придется - перекомпиливать ядро - ложить сервер и только потом уже получишь фикс.
(Это я говорю сугубо о нашей ситуации с точками тп, я же не говорю что нужно все сразу пихать в сборку.)

Но когда у тебя скрипт в сборке - ты можешь его поправить и отдельно перезалить, без ребута сервера, что позволит на лету исправлять различного рода проблемы.
А про наркоманию потом игрокам объяснять будешь и писать почему у тебя сервер постоянно в ребутах. (тут речь идет о множестве кастомок.)
По итогу ты получишь только минус к онлайну в замен своего "удобства".

Чтобы все было удобно, нужно сразу ядро подбивать под сборку, раскидывать в нужном порядке и компилить и проверять их вместе.
Даже если у человека 100500 скриптов я не вижу никакой проблемы в фиксах когда все доступно в 1 среде.
 
  • Мне нравится
Реакции: Rolo
Ну релоадить скрипты без рестарта сервера тоже та еще рулетка - неизвестно что может не так переинициализироваться из-за этого.
 
  • Мне нравится
Реакции: Rolo
Ну релоадить скрипты без рестарта сервера тоже та еще рулетка - неизвестно что может не так переинициализироваться из-за этого.
Все скрипты релоадить и не нужно, нужно только необходимые - лучше по 1. Если все по уму делать - и перезагрузку тоже по уму делать с нужными проверками, а так же всеми мерами предосторожности (типа тушить сам скрипт до перезагрузки, и активировать его только при полной загрузке и т..д.), то все окей - пользуюсь уже 4 года подобным на живых серверах, не раз выручало от мелких вроде фикса не того id-предмета- скилла-координат, до посерьезнее вроде фиксов дюпа.
 
  • Мне нравится
Реакции: Rolo
чот немного перегиб в том плане, чтоб ваять отдельный эффект под телепорты, результат более чем хороший, но можно и проще)
 
ну тут не согласен, ты смотришь это со стороны разраба конечно тебе удобнее там все править :), но врятли ты был по другую сторону и ощутил каково на живую ловить тот или иной баг. - в таком случае тебе придется - перекомпиливать ядро - ложить сервер и только потом уже получишь фикс.
(Это я говорю сугубо о нашей ситуации с точками тп, я же не говорю что нужно все сразу пихать в сборку.)

Но когда у тебя скрипт в сборке - ты можешь его поправить и отдельно перезалить, без ребута сервера, что позволит на лету исправлять различного рода проблемы.
А про наркоманию потом игрокам объяснять будешь и писать почему у тебя сервер постоянно в ребутах. (тут речь идет о множестве кастомок.)
По итогу ты получишь только минус к онлайну в замен своего "удобства".

Чтобы все было удобно, нужно сразу ядро подбивать под сборку, раскидывать в нужном порядке и компилить и проверять их вместе.
Даже если у человека 100500 скриптов я не вижу никакой проблемы в фиксах когда все доступно в 1 среде.
Штатный функционал обязан быть в связке с ядром, а кастом кто мешает пилить скриптами? Просто не все сборки могут прослушивать и подгружать скрипты с датапака)
Когда сервер прослушивает весь дп и сам подгружает все скрипты - это идеал! А тот же мобиус хз что там пьет или нюхает, или просто долбится с пакетами. Все скрипты обьединять в с прогруку другими файлами а это файлы или папки грузить через хмл. (Да ну на***) мы что в 2010 году?
 
  • Мне нравится
Реакции: Rolo
Штатный функционал обязан быть в связке с ядром, а кастом кто мешает пилить скриптами? Просто не все сборки могут прослушивать и подгружать скрипты с датапака)
Когда сервер прослушивает весь дп и сам подгружает все скрипты - это идеал! А тот же мобиус хз что там пьет или нюхает, или просто долбится с пакетами. Все скрипты обьединять в с прогруку другими файлами а это файлы или папки грузить через хмл. (Да ну на***) мы что в 2010 году?
Если этого какая-то сборка не может, то это не значит что человек обязан до конца своих дней мучатся) пускай возьмет в тз - если сам не может пускай запилят люди ему правильную перезагрузку скриптов поштучно с выводом себе в гм панельку.
У себя я сделал обычный лист который все подгруженные скрипты мне цепляет и отображает в админке - создает мне кнопочки по которым я могу перегружать - таким образом не нужно каждый скрипт туда вручную добавлять - сам добавится.

Ну штатный функционал возможно тут никто не спорит, но я бы точки тп все таки вынес бы в отдельный скрипт - по крайне мере пока это все будет дебажится на лайве, у меня такие читеры были из-за которых на эти точки тп не только пришлось вешать около 20 проверок сверху базовых, но и в конце концов вообще переписывать всю систему с нуля - психанул.
Стабилизировал ее только благодаря полному дебагу и возможности быстро править на живую.

Ну а что мобиус, что скрипты - там разрабы не особо вообще в ла2 шарят, им сложно понимать что, куда и почему. Им дают баг репорт - они пытаются въехать и поправить что-то.

Самое смешное что они еще умудряются друг у друга куски кода тащить (один гавнокод напишет - другой его себе скомуниздит).
Посмотри как-нибудь у них запил altb баффера) это просто что-то с чем-то...

Если уж говорить открыто, то я вообще ни 1 сборки не видел еще где все сделано для людей, так или иначе все равно под себя все переделывать нужно будет везде.
Тут вопрос времени и желания.

Но когда много кастомок пилишь, в любом случае доходишь до того, что нужен этот функционал перезалива, доходишь до сразу правильной разметки скриптов, чтобы все было под рукой и не путаться в них - создаешь свою систему по которой тебе будет понятно.
Сейчас у меня около 400 своих скриптов - по своей системе расписаны - вроде не путаюсь).
 
  • Мне нравится
Реакции: Rolo
Назад
Сверху Снизу