Перейти к содержанию
Авторизация  
zGosu

Скрипты для JAVA сборки Lineage 2 (L2JSERVER HF5)

Рекомендуемые сообщения

Скрипты для JAVA сборки Lineage 2 (делалась на L2JServer, но думаю может подойти и к любой другой сборке)

 

AutoCp:

* активация с помощью команду .autocp

* активирует автоматическое использование банок CP (можно поменять на любые другие банки)

 

ScriptBoard:

* сборник скриптов для Community Board

+ случайная выдача предметов

+ очищение статистики PVP/PK

+ получения Дворянства

+ смена имени

+ добавление выбранного аргумента в оружие (включая статы: STR, DEX  и т.п. + аргумент)

3klQ2jDJbdY.jpg

+ смена цвета имени

+ смена пола

+ очищение статистики Олимпиады

+ восстановление очков Олимпиады

 

ScriptBoard.7z

AutoCp.7z

Изменено пользователем zGosu
  • Upvote 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скрипты для JAVA сборки Lineage 2 (делалась на L2JServer, но думаю может подойти и к любой другой сборке)

 

AutoCp:

* активация с помощью команду .autocp

* активирует автоматическое использование банок CP (можно поменять на любые другие банки)

 

ScriptBoard:

* сборник скриптов для Community Board

+ случайная выдача предметов

+ очищение статистики PVP/PK

+ получения Дворянства

+ смена имени

+ добавление выбранного аргумента в оружие (включая статы: STR, DEX  и т.п. + аргумент)

3klQ2jDJbdY.jpg

+ смена цвета имени

+ смена пола

+ очищение статистики Олимпиады

+ восстановление очков Олимпиады

 

Вы знаете, что будет с сервером, на котором установлен ваш скрипт автоцп и играет 500 человек?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы знаете, что будет с сервером, на котором установлен ваш скрипт автоцп и играет 500 человек?

Почему же, смотря какое железо, думаю 500 ещё выдержит могу сделать хард тест на ботах =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему же, смотря какое железо, думаю 500 ещё выдержит могу сделать хард тест на ботах =)

 

Почему же, смотря какое железо, думаю 500 ещё выдержит могу сделать хард тест на ботах =)

Ну, ты понял о чем я? =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, ты понял о чем я? =)

Жестко когда значение getReuseDelay() будет меньше 100  на норм онлайне =)

Самому даже интересно что будет)

Еще зависит от затрат самой сборки.

Изменено пользователем ncsSpawN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поставил + думаю пригодится на аргументацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я люблю такие скрипты вроде acp. Хочу увидеть рабочий сервер, где этот скрипт работает. :)

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можешь зайти на мой посмотреть, но там код отличается немного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можешь зайти на мой посмотреть, но там код отличается немного.

Речь идет именно о скриптах такого типа, тот кто знает поймет, то о чем речь идет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что то мне подсказывает что если он будет одновременно работать у 200-300 игроков, то уже начнет что то происходить ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и что будет ?) :D

А я скажу что будет, сервер даже на 1к онлайна это не почувствует.

Нагрузка на стандартной комплектации сервера. Даже выше 1% CPU не поднимет. Ну на этом примере мб 3-5% накинет.

Конечно нужно сделать 1 правку, и пару слушателей закинуть на борт. Дабы чуть разгрузить пул.

1-ое нужно докинуть проверку, если фулл нр, вырубаем его.

2-ое, когда ацп включено, и нр достигло н-минимума, тогда только запускаем задачу.

Изменено пользователем Mangol

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и что будет ?) :D

А я скажу что будет, сервер даже на 1к онлайна это не почувствует.

Нагрузка на стандартной комплектации сервера. Даже выше 1% CPU не поднимет. Ну на этом примере мб 3-5% накинет.

Конечно нужно сделать 1 правку, и пару слушателей закинуть на борт. Дабы чуть разгрузить пул.

1-ое нужно докинуть проверку, если фулл нр, вырубаем его.

2-ое, когда ацп включено, и нр достигло н-минимума, тогда только запускаем задачу.

Если бы вы смотрели сам скрипт, то там уже установлены ограничения для использовании банок:

			if ((_player.getCurrentCp() >= _player.getMaxCp()) || _player.isInvul() || _player.isInvisible() || _player.isInOlympiadMode() || _player.isDead())
			{
				return;
			}

Так же функция полностью выключается если банки закончились. Поэтому после покупки банок надо будет заново прописывать команду ацп.

И еще небольшое изменение:

				// Start use Potion.
				if (_autoCpTask == null)
				{
					_autoCpTask = ThreadPoolManager.getInstance().scheduleEventAtFixedRate(new AutoCpTask(), 0, item.getReuseDelay(), TimeUnit.MILLISECONDS);
				}

Должно немного распределить нагрузку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Должно немного распределить нагрузку

Распределить нагрузку чего? насколько мне известно обьект хендлера один или увас он должен создаватся каждому игроку? то какого перепуга

тут статик 

private static boolean _active;
private static L2PcInstance _player;

статки преременная 1 на всех идля всех ново созданных обьектов будут одинаковы.

короче скрипт только для одного игрока :)

 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Распределить нагрузку чего? насколько мне известно обьект хендлера один или увас он должен создаватся каждому игроку? то какого перепуга

тут статик 

private static boolean _active;
private static L2PcInstance _player;

статки преременная 1 на всех идля всех ново созданных обьектов будут одинаковы.

короче скрипт только для одного игрока :)

 

 

ну по факту он пашет нормально. уже тестировался. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну по факту он пашет нормально. уже тестировался. 

неможет она нормально работать 

1) _autoCpTask постоянно перезаписуется и остается висеть в пуле потоков.

2) метод  -> protected void doAutoCp()  тут _player  будет тот кто последний кто исползовал комманду. для всех созданных задач _autoCpTask 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

неможет она нормально работать 

1) _autoCpTask постоянно перезаписуется и остается висеть в пуле потоков.

2) метод  -> protected void doAutoCp()  тут _player  будет тот кто последний кто исползовал комманду. для всех созданных задач _autoCpTask 

сейчас еще раз протестирую 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сейчас еще раз протестирую 

я вам говорю тут без тестов всё видно. тестируйте 2 игроками и смотрите кто за это всё расплатится.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я вам говорю тут без тестов всё видно. тестируйте 2 игроками и смотрите кто за это всё расплатится.

просто до этого стоял сервер с 200онлайном, никто не жаловался. сейчас опишу после теста

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, вы оказались правы. Исправил и перезалил файл

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, вы оказались правы. Исправил и перезалил файл

будет всё тоже самое. так как команда(обьект) 1 на всех

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

будет всё тоже самое. так как команда(обьект) 1 на всех

Еще раз спасибо) Еще раз исправил и перезалил)

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если бы вы смотрели сам скрипт, то там уже установлены ограничения для использовании банок:

			if ((_player.getCurrentCp() >= _player.getMaxCp()) || _player.isInvul() || _player.isInvisible() || _player.isInOlympiadMode() || _player.isDead())
			{
				return;
			}

Так же функция полностью выключается если банки закончились. Поэтому после покупки банок надо будет заново прописывать команду ацп.

И еще небольшое изменение:

				// Start use Potion.
				if (_autoCpTask == null)
				{
					_autoCpTask = ThreadPoolManager.getInstance().scheduleEventAtFixedRate(new AutoCpTask(), 0, item.getReuseDelay(), TimeUnit.MILLISECONDS);
				}

Должно немного распределить нагрузку

Если перечитать мой пост пару раз, станет понятно, о чем я сказал.

 

1-ое нужно докинуть проверку, если фулл нр, вырубаем его. В вашем примере выше, оно не отключает ацп, а только игнорирует, таск дальше продолжает работать, и исполнять код опять ,и опять.

2-ое, когда ацп включено, и нр достигло н-минимума, тогда только запускаем задачу. Из этого в коде я вообще ничего не заметил.

Из того что я описал выше, не было выполнено так как следует. И да, зачем если кончились банки, опять включать ацп, ведь он включен, не логичнее повесить слушатель но добавление итема в инвентарь ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз спасибо) Еще раз исправил и перезалил)

Ничего не изменилось.

Самый лучший быдлокод который тут можно придумать это...

 

 

/*

 * Copyright © 2004-2016 L2J DataPack

 *

 * This file is part of L2J DataPack.

 *

 * L2J DataPack 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.

 *

 * L2J DataPack 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.voicedcommandhandlers;

import com.l2jserver.gameserver.ThreadPoolManager;

import com.l2jserver.gameserver.handler.IItemHandler;

import com.l2jserver.gameserver.handler.IVoicedCommandHandler;

import com.l2jserver.gameserver.handler.ItemHandler;

import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;

 

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.Future;

import java.util.concurrent.TimeUnit;

 

/**

 * @author Константин

 */

public class AutoCp implements IVoicedCommandHandler {

    private final String[] _voicedCommands = { "autocp" };

    private final double _curCpAction = 95;

    private static final Map<Integer, Acp> maps = new ConcurrentHashMap<>();

 

    @Override

    public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) {

        final L2ItemInstance item = activeChar.getInventory().getItemByItemId(5592);

 

        if(command.equalsIgnoreCase("autocp")) {

            Acp acp = maps.get(activeChar.getObjectId());

            if(acp == null) {

                acp = maps.put(activeChar.getObjectId(), new Acp());

                acp.setPlayer(activeChar);

            }

            if(!acp.isActive()) {

                if(item == null) {

                    activeChar.sendMessage("You no have Greater CP Potion.");

                    return false;

                }

 

                activeChar.sendMessage("AutoCp enabled.");

                // Забыдлосим, мало ли игрок вышел, и зашел обратно, ссылка на него уже возможно будет мертва.

                acp.setPlayer(activeChar);

                acp.start();

            }

            else {

                acp.stop();

                activeChar.sendMessage("AutoCp disabled.");

            }

 

        }

        return true;

    }

 

    class AutoCpTask implements Runnable {

        private final Acp acp;

 

        private AutoCpTask(final Acp acp) {

            this.acp = acp;

        }

 

        @Override

        public void run() {

            if(acp.getPlayer() == null) {

                acp.stop();

                maps.remove(acp.getObjId());

                return;

            }

            final IItemHandler handler = ItemHandler.getInstance().getHandler(acp.getPlayer().getInventory().getItemByItemId(5592).getEtcItem());

            if(handler == null) {

                acp.getPlayer().sendMessage("You no have Greater CP Potion.");

                acp.getPlayer().sendMessage("AutoCp disabled.");

                return;

            }

            if(((acp.getPlayer().getCurrentCp() * (_curCpAction / 100.)) >= acp.getPlayer().getMaxCp()) || acp.getPlayer().isInvul() || acp.getPlayer().isInvisible() || acp.getPlayer().isInOlympiadMode() || acp.getPlayer().isDead()) {

                return;

            }

            handler.useItem(acp.getPlayer(), acp.getPlayer().getInventory().getItemByItemId(5592), false);

        }

    }

 

    static class Acp {

        private boolean _active;

        private int objId;

        private L2PcInstance _player;

        private Future<?> _autoCpTask;

 

        public void start() {

            _active = true;

            if(_player == null) {

                return;

            }

            taskStop();

            _autoCpTask = ThreadPoolManager.getInstance().scheduleEventAtFixedRate(new AutoCpTask(this), 0, item.getReuseDelay(), TimeUnit.MILLISECONDS);

        }

 

        public void stop() {

            _active = false;

            taskStop();

        }

        

        private void taskStop() {

            if(_autoCpTask != null) {

                _autoCpTask.cancel(true);

                _autoCpTask = null;

            }

        }

 

        public boolean isActive() {

            return _active;

        }

 

        public L2PcInstance getPlayer() {

            return _player;

        }

 

        public int getObjId() {

            return objId;

        }

        

        public void setPlayer(L2PcInstance player) {

            _player = player;

            objId = player.getObjectId();

        }

    }

 

    @Override

    public String[] getVoicedCommandList() {

        return _voicedCommands;

    }

}

 

P.S. Код даже не грузил, запилил прямо в странице. Методы из L2PcInstance могут быть ошибочными, с л2джи не имел дел лет 6.

Изменено пользователем Mangol

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего не изменилось.

Самый лучший быдлокод который тут можно придумать это...

 

 

/*

 * Copyright © 2004-2016 L2J DataPack

 *

 * This file is part of L2J DataPack.

 *

 * L2J DataPack 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.

 *

 * L2J DataPack 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.voicedcommandhandlers;

import com.l2jserver.gameserver.ThreadPoolManager;

import com.l2jserver.gameserver.handler.IItemHandler;

import com.l2jserver.gameserver.handler.IVoicedCommandHandler;

import com.l2jserver.gameserver.handler.ItemHandler;

import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;

 

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.Future;

import java.util.concurrent.TimeUnit;

 

/**

 * @author Константин

 */

public class AutoCp implements IVoicedCommandHandler {

    private final String[] _voicedCommands = { "autocp" };

    private final double _curCpAction = 95;

    private static final Map<Integer, Acp> maps = new ConcurrentHashMap<>();

 

    @Override

    public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) {

        final L2ItemInstance item = activeChar.getInventory().getItemByItemId(5592);

 

        if(command.equalsIgnoreCase("autocp")) {

            Acp acp = maps.get(activeChar.getObjectId());

            if(acp == null) {

                acp = maps.put(activeChar.getObjectId(), new Acp());

                acp.setPlayer(activeChar);

            }

            if(!acp.isActive()) {

                if(item == null) {

                    activeChar.sendMessage("You no have Greater CP Potion.");

                    return false;

                }

 

                activeChar.sendMessage("AutoCp enabled.");

                // Забыдлосим, мало ли игрок вышел, и зашел обратно, ссылка на него уже возможно будет мертва.

                acp.setPlayer(activeChar);

                acp.start();

            }

            else {

                acp.stop();

                activeChar.sendMessage("AutoCp disabled.");

            }

 

        }

        return true;

    }

 

    class AutoCpTask implements Runnable {

        private final Acp acp;

 

        private AutoCpTask(final Acp acp) {

            this.acp = acp;

        }

 

        @Override

        public void run() {

            if(acp.getPlayer() == null) {

                acp.stop();

                maps.remove(acp.getObjId());

                return;

            }

            final IItemHandler handler = ItemHandler.getInstance().getHandler(acp.getPlayer().getInventory().getItemByItemId(5592).getEtcItem());

            if(handler == null) {

                acp.getPlayer().sendMessage("You no have Greater CP Potion.");

                acp.getPlayer().sendMessage("AutoCp disabled.");

                return;

            }

            if(((acp.getPlayer().getCurrentCp() * (_curCpAction / 100.)) >= acp.getPlayer().getMaxCp()) || acp.getPlayer().isInvul() || acp.getPlayer().isInvisible() || acp.getPlayer().isInOlympiadMode() || acp.getPlayer().isDead()) {

                return;

            }

            handler.useItem(acp.getPlayer(), acp.getPlayer().getInventory().getItemByItemId(5592), false);

        }

    }

 

    static class Acp {

        private boolean _active;

        private int objId;

        private L2PcInstance _player;

        private Future<?> _autoCpTask;

 

        public void start() {

            _active = true;

            if(_player == null) {

                return;

            }

            taskStop();

            _autoCpTask = ThreadPoolManager.getInstance().scheduleEventAtFixedRate(new AutoCpTask(this), 0, item.getReuseDelay(), TimeUnit.MILLISECONDS);

        }

 

        public void stop() {

            _active = false;

            taskStop();

        }

        

        private void taskStop() {

            if(_autoCpTask != null) {

                _autoCpTask.cancel(true);

                _autoCpTask = null;

            }

        }

 

        public boolean isActive() {

            return _active;

        }

 

        public L2PcInstance getPlayer() {

            return _player;

        }

 

        public int getObjId() {

            return objId;

        }

        

        public void setPlayer(L2PcInstance player) {

            _player = player;

            objId = player.getObjectId();

        }

    }

 

    @Override

    public String[] getVoicedCommandList() {

        return _voicedCommands;

    }

}

 

P.S. Код даже не грузил, запилил прямо в странице. Методы из L2PcInstance могут быть ошибочными, с л2джи не имел дел лет 6.

Хочу уточнить 1й пункт: Т.е. когда ха доходит до максимума, отключать функцию ацп? Т.е. для повторного включения надо еще раз ввести команду .autocp?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...