Jump to content
zGosu

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

Recommended Posts

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

 

AutoCp:

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

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

 

ScriptBoard:

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

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

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

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

+ смена имени

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

3klQ2jDJbdY.jpg

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

+ смена пола

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

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

 

ScriptBoard.7z

AutoCp.7z

Edited by zGosu
  • Upvote 2

Share this post


Link to post
Share on other sites

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

 

AutoCp:

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

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

 

ScriptBoard:

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

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

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

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

+ смена имени

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

3klQ2jDJbdY.jpg

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

+ смена пола

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by ncsSpawN

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

  • Upvote 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Edited by Mangol

Share this post


Link to post
Share on other sites

Ну и что будет ?) :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);
				}

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

Share this post


Link to post
Share on other sites
Должно немного распределить нагрузку

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

тут статик 

private static boolean _active;
private static L2PcInstance _player;

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

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

 

  • Upvote 1

Share this post


Link to post
Share on other sites

 

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

тут статик 

private static boolean _active;
private static L2PcInstance _player;

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

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

 

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

  • Upvote 1

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

  • Upvote 1

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

  • Upvote 1

Share this post


Link to post
Share on other sites

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

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

  • Upvote 1

Share this post


Link to post
Share on other sites

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

			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-ое, когда ацп включено, и нр достигло н-минимума, тогда только запускаем задачу. Из этого в коде я вообще ничего не заметил.

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

Share this post


Link to post
Share on other sites

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

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

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

 

 

/*

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

Edited by Mangol

Share this post


Link to post
Share on other sites

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

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

 

 

/*

 * 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?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...