Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
[core]Модификации Java серверов
#11
Делал для шайтановской сборки, а подходит для любой феневской сборки. Мелочи жизни, но приятные Wink.

Что и с чем едят смотрим на скрине.
[Изображение: VmJsBxO8.jpg]
Открыть спойлер

Открыть спойлер

Добавлено через 6 минут
Делал для Фреи, тоже Феникса, потом переделал под сборку шайтана, подходит под любой Эпилог феникса.

[Изображение: r76Ty459.jpg]

.\data\html\admin\attribute.htm
.\data\scripts\commands\admin\AdminAttribute.java
Ответ
#12
Shutdown.java
На фениксах
Мб по нубски, но зато красивее чем было...!


public void abort(L2Player activeChar)
{
_log.warning("GM: " + activeChar.getName() + "(" + activeChar.getObjectId() + ") issued shutdown ABORT. " + _modeText[shutdownMode] + " has been stopped!");
if(this.shutdownMode == 1)
{
announce("Выключение сервера прервано!", 10000, ScreenMessageAlign.TOP_CENTER);
}
if(this.shutdownMode == 2)
{
announce("Перезагрузка сервера прервана!", 10000, ScreenMessageAlign.TOP_CENTER);
}
if(_counterInstance != null)
{
_counterInstance._abort();
}
}



private void countdown()
{
if (this.shutdownMode == 1)
{
while(secondsShut > 0)
try
{
switch(secondsShut)
{

case 120:
announce("Внимание!!!Сервер будет выключен через 2 минуты!Покиньте игру!", 10000, ScreenMessageAlign.BOTTOM_RIGHT);
break;
case 60:
System.out.println(l2p.gameserver.model.L2ObjectsStorage.getStats());
System.out.println();
System.out.println(l2p.gameserver.geodata.PathFindBuffers.getStats());
System.out.println();
if(Config.PROTECT_ENABLE && Config.PROTECT_COMPRESSION > 0)
{
System.out.println(SelectorThread.getStats());
System.out.println();
}

announce("Внимание!!!Сервер будет выключен через 1 минуту!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
if(!Config.DONTLOADSPAWN)
try
{
L2World.deleteVisibleNpcSpawns();
}
catch(Throwable t)
{
System.out.println("Error while unspawn Npcs!");
t.printStackTrace();
}
break;
case 30:
announce("Внимание!!!Сервер будет выключен через 30 секунд!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
break;
case 15:
announce("Сервер будет выключен через 15 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 10:
announce("Сервер будет выключен через 10 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 5:
announce("Сервер будет выключен через 5 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 4:
announce("Сервер будет выключен через 4 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 3:
announce("Сервер будет выключен через 3 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 2:
announce("Сервер будет выключен через 2 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 1:
announce("Сервер будет выключен через 1 секунду!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
}

this.secondsShut -= 1;
int delay = 1000;
Thread.sleep(delay);
if (this.shutdownMode == 3)
{
return;
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (this.shutdownMode == 2)
{
while(secondsShut > 0)
try
{
switch(secondsShut)
{

case 120:
announce("Внимание!!!Перезагрузка сервера начнется через 2 минуты!Покиньте игру!", 10000, ScreenMessageAlign.BOTTOM_RIGHT);
break;
case 60:
System.out.println(l2p.gameserver.model.L2ObjectsStorage.getStats());
System.out.println();
System.out.println(l2p.gameserver.geodata.PathFindBuffers.getStats());
System.out.println();
if(Config.PROTECT_ENABLE && Config.PROTECT_COMPRESSION > 0)
{
System.out.println(SelectorThread.getStats());
System.out.println();
}

announce("Внимание!!!Перезагрузка сервера начнется через 1 минуту!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
if(!Config.DONTLOADSPAWN)
try
{
L2World.deleteVisibleNpcSpawns();
}
catch(Throwable t)
{
System.out.println("Error while unspawn Npcs!");
t.printStackTrace();
}
break;
case 30:
announce("Внимание!!!Перезагрузка сервера начнется через 30 секунд!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
break;
case 15:
announce("Сервер будет перезагружен через 15 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 10:
announce("Сервер будет перезагружен через 10 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 5:
announce("Сервер будет перезагружен через 5 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 4:
announce("Сервер будет перезагружен через 4 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 3:
announce("Сервер будет перезагружен через 3 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 2:
announce("Сервер будет перезагружен через 2 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 1:
announce("Сервер будет перезагружен через 1 секунду!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
}

this.secondsShut -= 1;
int delay = 1000;
Thread.sleep(delay);
if (this.shutdownMode == 3)
{
return;
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Ответ
#13
weTr1k Написал:Shutdown.java
На фениксах
Мб по нубски, но зато красивее чем было...!


public void abort(L2Player activeChar)
{
_log.warning("GM: " + activeChar.getName() + "(" + activeChar.getObjectId() + ") issued shutdown ABORT. " + _modeText[shutdownMode] + " has been stopped!");
if(this.shutdownMode == 1)
{
announce("Выключение сервера прервано!", 10000, ScreenMessageAlign.TOP_CENTER);
}
if(this.shutdownMode == 2)
{
announce("Перезагрузка сервера прервана!", 10000, ScreenMessageAlign.TOP_CENTER);
}
if(_counterInstance != null)
{
_counterInstance._abort();
}
}



private void countdown()
{
if (this.shutdownMode == 1)
{
while(secondsShut > 0)
try
{
switch(secondsShut)
{

case 120:
announce("Внимание!!!Сервер будет выключен через 2 минуты!Покиньте игру!", 10000, ScreenMessageAlign.BOTTOM_RIGHT);
break;
case 60:
System.out.println(l2p.gameserver.model.L2ObjectsStorage.getStats());
System.out.println();
System.out.println(l2p.gameserver.geodata.PathFindBuffers.getStats());
System.out.println();
if(Config.PROTECT_ENABLE && Config.PROTECT_COMPRESSION > 0)
{
System.out.println(SelectorThread.getStats());
System.out.println();
}

announce("Внимание!!!Сервер будет выключен через 1 минуту!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
if(!Config.DONTLOADSPAWN)
try
{
L2World.deleteVisibleNpcSpawns();
}
catch(Throwable t)
{
System.out.println("Error while unspawn Npcs!");
t.printStackTrace();
}
break;
case 30:
announce("Внимание!!!Сервер будет выключен через 30 секунд!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
break;
case 15:
announce("Сервер будет выключен через 15 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 10:
announce("Сервер будет выключен через 10 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 5:
announce("Сервер будет выключен через 5 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 4:
announce("Сервер будет выключен через 4 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 3:
announce("Сервер будет выключен через 3 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 2:
announce("Сервер будет выключен через 2 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 1:
announce("Сервер будет выключен через 1 секунду!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
}

this.secondsShut -= 1;
int delay = 1000;
Thread.sleep(delay);
if (this.shutdownMode == 3)
{
return;
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (this.shutdownMode == 2)
{
while(secondsShut > 0)
try
{
switch(secondsShut)
{

case 120:
announce("Внимание!!!Перезагрузка сервера начнется через 2 минуты!Покиньте игру!", 10000, ScreenMessageAlign.BOTTOM_RIGHT);
break;
case 60:
System.out.println(l2p.gameserver.model.L2ObjectsStorage.getStats());
System.out.println();
System.out.println(l2p.gameserver.geodata.PathFindBuffers.getStats());
System.out.println();
if(Config.PROTECT_ENABLE && Config.PROTECT_COMPRESSION > 0)
{
System.out.println(SelectorThread.getStats());
System.out.println();
}

announce("Внимание!!!Перезагрузка сервера начнется через 1 минуту!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
if(!Config.DONTLOADSPAWN)
try
{
L2World.deleteVisibleNpcSpawns();
}
catch(Throwable t)
{
System.out.println("Error while unspawn Npcs!");
t.printStackTrace();
}
break;
case 30:
announce("Внимание!!!Перезагрузка сервера начнется через 30 секунд!Покиньте игру!", 10000, ScreenMessageAlign.TOP_CENTER);
break;
case 15:
announce("Сервер будет перезагружен через 15 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 10:
announce("Сервер будет перезагружен через 10 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 5:
announce("Сервер будет перезагружен через 5 секунд!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 4:
announce("Сервер будет перезагружен через 4 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 3:
announce("Сервер будет перезагружен через 3 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 2:
announce("Сервер будет перезагружен через 2 секунды!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
case 1:
announce("Сервер будет перезагружен через 1 секунду!", 10000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER);
break;
}

this.secondsShut -= 1;
int delay = 1000;
Thread.sleep(delay);
if (this.shutdownMode == 3)
{
return;
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

Вот тебе что-то вроде наброска, доработай чтобы были правильные окончания (секунд/минут, минута/секунда) и т.п. Wink Будет и правильно и вкусно, да и полезно для тебя.

Код:
if (secondsShut / 60 > 0) text = "Сервер будет выключен через " + (int) (secondsShut / 60) + " минут.";
else if (secondsShut > 0) text = "Сервер будет выключен через " + secondsShut + " секунд.";
else text = "Сервер отключен.";

announce(text, 10000, ScreenMessageAlign.TOP_CENTER);
Ответ
#14
Дайте плиз фикс 2.22... и баг с ВХ на фениксе, кому не в лом, а то чет лень напрягатсяBig Grin
Ответ
#15
с 2,22 наверно к ним
Ответ
#16
Amorph1s Написал:а то чет лень напрягатсяBig Grin
оффтоп
Ответ
#17
нынче не дешевое это занятие, программистов наниматьBig Grin
Подскажи плиз почему твои наработки не пахают?
Я просто начинающий копипастер как бэWink
[Изображение: 53486406.jpg]

Uploaded with ImageShack.us
:negodue:
Ответ
#18
Amorph1s м.б надо сохранять всё в utf-8 ? Wink)))
----
Ну раз пошло про фениксов, то кину свою горе наработку (в буквальном смысле слова Smile )
Войс команда на вызов хтмля с инфой по ХБ (Траст поинты и доступность)
----
Для начала ходим в scripts/services/Caravan.java
Код:
private static long getConfidence()
Меняем приват на паблик
Код:
public static long getConfidence()
Далее в scripts/command/voiced мутим файлище HellBound.java с содержанием:
Код:
package commands.voiced;

import services.Caravan;
import l2p.Config;
import l2p.extensions.scripts.Functions;
import l2p.extensions.scripts.ScriptFile;
import l2p.gameserver.handler.IVoicedCommandHandler;
import l2p.gameserver.handler.VoicedCommandHandler;
import l2p.gameserver.model.L2Player;
import l2p.util.Files;

/**
* User: KilRoy
* Команда .hellbound
* Выводит инфу о доступности острова и уровне доверия
*/
public class HellBound extends Functions implements IVoicedCommandHandler, ScriptFile {


    private String[] _commandList = new String[]{"hellbound"};

    public boolean useVoicedCommand(String command, L2Player activeChar, String args) {

        if (command.equals("hellbound")){

            
            Long Trust = Caravan.getConfidence();
            long curr = Caravan.getConfidence();

            String dialog = Files.read("data/scripts/commands/voiced/hellbound.htm", activeChar);
            String status = "";
            if (curr >= 1)
                status = "Open.";
            else
                status = "Closed.";
            dialog = dialog.replaceFirst("%status%", status);
            dialog = dialog.replaceFirst("%trust%", Trust.toString());
            show(dialog, activeChar);
            return true;

        }
        return true;
    }

    public String[] getVoicedCommandList(){
        return _commandList;
    }

    public void onLoad(){
            VoicedCommandHandler.getInstance().registerVoicedCommandHandler(this);
    }

    public void onReload()
    {}

    public void onShutdown()
    {}
}
На этом же уровне стряпаем хтм (hellbound.htm) для этого дела:
Код:
<html>
<body>HellBound Status<br><br>
<table>
<tr>
<td width=5></td>
<td width=100>State: <font color="LEVEL">%status%</font></td>
</tr>
<tr>
<td width=5></td>
<td width=100>Current Trust-level:</td>
<td width=30><font color="LEVEL">%trust%</font></td>
</tr>
</table>
</body></html>

========================================================================

Ну до кучи ещё с камаель ребы вам подарочек "ClassMaster Spawn/UnSpawn"
Для любителей делать всё кагнаоффе Wink
Следовательно фишка работает через евент (вкл\выкл через админку, удобно, практично Smile )
Первое что делаем, это делетим нахер классмастеров из базы спавн-листа (spawnlist)
ID 31860 Ищем всех и выносим их оттуда (их там 17шт)
Ну и далее начинаем копипастить Smile
scripts/events/ClassMaster/ClassMaster.java ( Ясен бок папку и файл создаём Wink )
Код:
package events.ClassMaster;

import l2p.Config;
import l2p.gameserver.cache.Msg;
import l2p.extensions.scripts.Functions;
import l2p.extensions.scripts.ScriptFile;
import l2p.extensions.multilang.CustomMessage;
import l2p.gameserver.Announcements;
import l2p.gameserver.model.L2ObjectsStorage;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.L2Spawn;
import l2p.gameserver.model.instances.L2NpcInstance;
import l2p.util.Files;
import l2p.util.GArray;
import l2p.util.Util;

// User: KilRoy
// Спавн Class Master по основным городам ( Предварительно включать
// Класс Мастера в настройках сервера (events.properties)
// Удобно для так называемого "всё как на оффе" :)
public class ClassMaster extends Functions implements ScriptFile
{

    private static int EVENT_MANAGER_ID = 31860;
    private static GArray<L2Spawn> _spawns = new GArray<L2Spawn>();
    private static boolean _active = false;

    /**
     * Спавнит эвент менеджеров
     */
    private void spawnEventManagers()
    {
        final int EVENT_MANAGERS[][] = {
                { -84522, 243213, -3731, 21481 }, // Talking Island Village
                { 45911, 49912, -3086, 6626 }, // Elven Village
                { 11862, 17641, -4576, 43758 }, // Dark Elven Village
                { 115634, -178033, -914, 39597 }, // Dwarven Village
                { -44801, -113031, -241, 15800 }, // Orc Village
                { -116592, 44984, 341, 16277 }, // Kamael Village
                { -14022, 123829, -3118, 39678 }, // 1 (Unknow)
                { -81637, 150251, -3130, 16277 }, // 2 (Unknow)
                { 82651, 54338, -1551, 10558 }, // Oren
                { 18012, 145166, -3075, 64469 }, // Dion
                { 83199, 147870, -3495, 37217 }, // Giran
                { 111705, 219449, -3697, 10970 }, // Heine
                { 116236, 76957, -2752, 337 }, // Hunter Village
                { 147866, 26615, -2231, 16167 }, // Aden
                { 148923, -55829, -2807, 39721 }, // Goddard
                { 86161, -142903, -1368, 7038 }, // Schuttgart
                { 44251, -47640, -823, 49152 } // Rune
        };

        SpawnNPCs(EVENT_MANAGER_ID, EVENT_MANAGERS, _spawns);
    }

    /**
     * Удаляет спавн эвент менеджеров
     */
    private void unSpawnEventManagers()
    {
        deSpawnNPCs(_spawns);
    }

    /**
     * Читает статус эвента из базы.
     * @return
     */
    private static boolean isActive()
    {
        return IsActive("ClassMaster");
    }
    /**
    * Запускает эвент
    */
    public void startEvent()
    {
        L2Player player = (L2Player) getSelf();
        if(!player.getPlayerAccess().IsEventGm)
        {
            return;
        }
        if(SetActive("ClassMaster", true))
        {
            spawnEventManagers();
            System.out.println("EventCMS: ClassMaster spawned.");
            Announcements.getInstance().announceByCustomMessage("scripts.events.ClassMaster.AnnounceEventStarted", null);
        }
        else
        {
            player.sendMessage("EventCMS 'ClassMaster' already spawned.");
        }
        _active = true;
        show(Files.read("data/html/admin/events/events.htm", player), player);
    }

    /**
    * Останавливает эвент
    */
    public void stopEvent()
    {
        L2Player player = (L2Player) getSelf();
        if(!player.getPlayerAccess().IsEventGm)
        {
            return;
        }
        if(SetActive("ClassMaster", false))
        {
            unSpawnEventManagers();
            System.out.println("EventCMS: ClassMaster unspawned.");
            Announcements.getInstance().announceByCustomMessage("scripts.events.ClassMaster.AnnounceEventStoped", null);
        }
        else
        {
            player.sendMessage("EventCMS 'ClassMaster' not spawned.");
        }
        _active = false;
        show(Files.read("data/html/admin/events/events.htm", player), player);
    }

    public void onLoad()
    {
        if(isActive())
        {
            _active = true;
            spawnEventManagers();
            System.out.println("Loaded EventCMS: ClassMaster [state: spawned]");
        }
        else
        {
            System.out.println("Loaded EventCMS: ClassMaster [state: unspawned]");
        }
    }

    public void onReload()
    {
        unSpawnEventManagers();
    }

    public void onShutdown()
    {
        unSpawnEventManagers();
    }
    

    public static void OnPlayerEnter(int objectId)
    {
        if(_active)
        {
            L2Player player = L2ObjectsStorage.getPlayer(objectId);
            Announcements.getInstance().announceToPlayerByCustomMessage(player, "scripts.events.ClassMaster.AnnounceEventStarted", null);
        }
    }

}
Далее ползем в оформление мессаджей (data/localization) и в оба файла вписуем
Код:
scripts.events.ClassMaster.AnnounceEventStarted=The event 'Class Master' started. Class Master spawned to town.
scripts.events.ClassMaster.AnnounceEventStoped=The event 'Class Master' stopped. Class Master unspawned.
Осталось дело за малым Smile Лезем в data/html/admin/events/events.htm и в любое удобное вам место суём
Код:
<td width=140>Class Master S/UnS</td>
<td width=45><button value="Spawn" action="bypass -h scripts_events.ClassMaster.ClassMaster:startEvent" width=40 height=20 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
<td width=45><button value="UnSpawn" action="bypass -h scripts_events.ClassMaster.ClassMaster:stopEvent" width=40 height=20 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
<td width=45></td>
</tr><tr>

P.S СОХРАНЯТЬ ВСЁ В UTF-8 БЕЗ BOM
Ответ
#19
Кто сможет вот в это
Код:
package l2p.gameserver.clientpackets;

import java.util.logging.Logger;

import l2p.Config;
import l2p.extensions.multilang.CustomMessage;
import l2p.gameserver.cache.Msg;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.items.L2ItemInstance;
import l2p.gameserver.model.items.PcInventory;
import l2p.gameserver.serverpackets.EnchantResult;
import l2p.gameserver.serverpackets.InventoryUpdate;
import l2p.gameserver.serverpackets.SystemMessage;
import l2p.gameserver.tables.ItemTable;
import l2p.gameserver.tables.SkillTable;
import l2p.gameserver.templates.L2Item;
import l2p.util.Log;
import l2p.util.Rnd;

public class RequestEnchantItem extends L2GameClientPacket
{
    protected static Logger _log = Logger.getLogger(RequestEnchantItem.class.getName());

    // Format: cd
    private int _objectId, _catalystObjId;

    @Override
    public void readImpl()
    {
        _objectId = readD();
        _catalystObjId = readD();
    }

    @Override
    public void runImpl()
    {
        L2Player activeChar = getClient().getActiveChar();
        if(activeChar == null)
            return;

        if(activeChar.isOutOfControl() || activeChar.isActionsDisabled())
        {
            activeChar.sendActionFailed();
            return;
        }

        PcInventory inventory = activeChar.getInventory();
        L2ItemInstance itemToEnchant = inventory.getItemByObjectId(_objectId);
        L2ItemInstance catalyst = _catalystObjId > 0 ? inventory.getItemByObjectId(_catalystObjId) : null;
        L2ItemInstance scroll = activeChar.getEnchantScroll();
        activeChar.setEnchantScroll(null);

        if(itemToEnchant == null || scroll == null)
        {
            activeChar.sendActionFailed();
            return;
        }

        // Затычка, ибо клиент криво обрабатывает RequestExTryToPutEnchantSupportItem
        if(!RequestExTryToPutEnchantSupportItem.checkCatalyst(itemToEnchant, catalyst))
            catalyst = null;

        // С помощью Master Yogi's Scroll: Enchant Weapon можно точить только Staff of Master Yogi
        if(scroll.getItemId() == 13540 && itemToEnchant.getItemId() != 13539 || itemToEnchant.getItemId() == 13539 && scroll.getItemId() != 13540)
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
            activeChar.sendActionFailed();
            return;
        }

        Log.add(activeChar.getName() + "|Trying to enchant|" + itemToEnchant.getItemId() + "|+" + itemToEnchant.getEnchantLevel() + "|" + itemToEnchant.getObjectId(), "enchants");

        // Затычка, разрешающая точить Staff of Master Yogi
        if(!itemToEnchant.canBeEnchanted() && !isYogiStaffEnchanting(scroll, itemToEnchant))
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
            activeChar.sendActionFailed();
            return;
        }

        if(itemToEnchant.getLocation() != L2ItemInstance.ItemLocation.INVENTORY && itemToEnchant.getLocation() != L2ItemInstance.ItemLocation.PAPERDOLL)
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
            activeChar.sendActionFailed();
            return;
        }

        if(activeChar.getPrivateStoreType() != L2Player.STORE_PRIVATE_NONE)
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendPacket(Msg.YOU_CANNOT_PRACTICE_ENCHANTING_WHILE_OPERATING_A_PRIVATE_STORE_OR_PRIVATE_MANUFACTURING_WORKSHOP);
            activeChar.sendActionFailed();
            return;
        }

        if(itemToEnchant.isStackable() || (scroll = inventory.getItemByObjectId(scroll.getObjectId())) == null)
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendActionFailed();
            return;
        }

        int crystalId = itemToEnchant.getEnchantCrystalId(scroll, catalyst);

        // Затычка, разрешающая точить Staff of Master Yogi
        if(crystalId == 0 && !isYogiStaffEnchanting(scroll, itemToEnchant))
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
            activeChar.sendActionFailed();
            return;
        }

        // Staff of Master Yogi можно точить до 23
        if(!isYogiStaffEnchanting(scroll, itemToEnchant) && itemToEnchant.getEnchantLevel() >= Config.ENCHANT_MAX || isYogiStaffEnchanting(scroll, itemToEnchant) && itemToEnchant.getEnchantLevel() >= 23)
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendMessage(new CustomMessage("l2p.gameserver.clientpackets.RequestEnchantItem.MaxLevel", activeChar));
            activeChar.sendActionFailed();
            return;
        }

        // Запрет на заточку чужих вещей, баг может вылезти на серверных лагах
        if(itemToEnchant.getOwnerId() != activeChar.getObjectId())
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
            activeChar.sendActionFailed();
            return;
        }

        L2ItemInstance removedScroll, removedCatalyst = null;
        synchronized (inventory)
        {
            removedScroll = inventory.destroyItem(scroll.getObjectId(), 1, true);
            if(catalyst != null)
                removedCatalyst = inventory.destroyItem(catalyst.getObjectId(), 1, true);
        }

        //tries enchant without scrolls
        if(removedScroll == null || catalyst != null && removedCatalyst == null)
        {
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendActionFailed();
            return;
        }

        int itemType = itemToEnchant.getItem().getType2();
        int safeEnchantLevel = itemToEnchant.getItem().getBodyPart() == L2Item.SLOT_FULL_ARMOR ? Config.SAFE_ENCHANT_FULL_BODY : Config.SAFE_ENCHANT_COMMON;

        double chance;
        if(itemToEnchant.getEnchantLevel() < safeEnchantLevel)
            chance = 100;
        else if(itemType == L2Item.TYPE2_WEAPON)
            chance = removedScroll.isCrystallEnchantScroll() ? Config.ENCHANT_CHANCE_CRYSTAL_WEAPON : Config.ENCHANT_CHANCE_WEAPON;
        else if(itemType == L2Item.TYPE2_SHIELD_ARMOR)
            chance = removedScroll.isCrystallEnchantScroll() ? Config.ENCHANT_CHANCE_CRYSTAL_ARMOR : Config.ENCHANT_CHANCE_ARMOR;
        else if(itemType == L2Item.TYPE2_ACCESSORY)
            chance = removedScroll.isCrystallEnchantScroll() ? Config.ENCHANT_CHANCE_CRYSTAL_ACCESSORY : Config.ENCHANT_CHANCE_ACCESSORY;
        else
        {
            System.out.println("WTF? Request to enchant " + itemToEnchant.getItemId());
            activeChar.sendPacket(EnchantResult.CANCEL);
            activeChar.sendActionFailed();
            activeChar.sendPacket(Msg.SYSTEM_ERROR);
            inventory.addItem(removedScroll);
            return;
        }

        if(scroll.isDivineEnchantScroll()) // Item Mall divine
            chance = 100;
        else if(scroll.isItemMallEnchantScroll()) // Item Mall normal/ancient
            chance += 10;

        if(removedCatalyst != null)
            chance += removedCatalyst.getCatalystPower();

        if(Rnd.chance(chance))
        {
            itemToEnchant.setEnchantLevel(itemToEnchant.getEnchantLevel() + 1);
            itemToEnchant.updateDatabase();

            activeChar.sendPacket(new InventoryUpdate().addModifiedItem(itemToEnchant));

            Log.add(activeChar.getName() + "|Successfully enchanted|" + itemToEnchant.getItemId() + "|to+" + itemToEnchant.getEnchantLevel() + "|" + chance, "enchants");
            Log.LogItem(activeChar, Log.EnchantItem, itemToEnchant);
            activeChar.sendPacket(EnchantResult.SUCESS);

            if(itemToEnchant.getEnchantLevel() >= (itemType == L2Item.TYPE2_WEAPON ? 6 : 5))
            {
                activeChar.altUseSkill(SkillTable.getInstance().getInfo(21006, 1), activeChar);
                activeChar.broadcastPacket(new SystemMessage(SystemMessage.C1_HAS_SUCCESSFULY_ENCHANTED_A__S2_S3).addName(activeChar).addNumber(itemToEnchant.getEnchantLevel()).addItemName(itemToEnchant.getItemId()));
            }
        }
        else
        {
            Log.add(activeChar.getName() + "|Failed to enchant|" + itemToEnchant.getItemId() + "|+" + itemToEnchant.getEnchantLevel() + "|" + chance, "enchants");

            if(scroll.isBlessedEnchantScroll()) // фейл, но заточка блесед
            {
                itemToEnchant.setEnchantLevel(0);
                activeChar.sendPacket(new InventoryUpdate().addModifiedItem(itemToEnchant));
                activeChar.sendPacket(Msg.FAILED_IN_BLESSED_ENCHANT_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
                activeChar.sendPacket(EnchantResult.BLESSED_FAILED);
            }
            else if(scroll.isAncientEnchantScroll()) // фейл, но заточка ancient
                activeChar.sendPacket(EnchantResult.ANCIENT_FAILED);
            else
            // фейл, разбиваем вещь
            {
                if(itemToEnchant.isEquipped())
                    inventory.unEquipItemInSlot(itemToEnchant.getEquipSlot());

                L2ItemInstance destroyedItem = inventory.destroyItem(itemToEnchant.getObjectId(), 1, true);
                if(destroyedItem == null)
                {
                    _log.warning("failed to destroy " + itemToEnchant.getObjectId() + " after unsuccessful enchant attempt by char " + activeChar.getName());
                    activeChar.sendActionFailed();
                    return;
                }

                Log.LogItem(activeChar, Log.EnchantItemFail, itemToEnchant);

                if(crystalId > 0)
                {
                    L2ItemInstance crystalsToAdd = ItemTable.getInstance().createItem(crystalId);

                    int count = (int) (itemToEnchant.getItem().getCrystalCount() * 0.87);
                    if(destroyedItem.getEnchantLevel() > 3)
                        count += itemToEnchant.getItem().getCrystalCount() * 0.25 * (destroyedItem.getEnchantLevel() - 3);
                    if(count < 1)
                        count = 1;
                    crystalsToAdd.setCount(count);

                    inventory.addItem(crystalsToAdd);
                    Log.LogItem(activeChar, Log.Sys_GetItem, crystalsToAdd);

                    activeChar.sendPacket(new EnchantResult(1, crystalsToAdd.getItemId(), count), SystemMessage.obtainItems(crystalId, count, 0));
                }
                else
                    activeChar.sendPacket(EnchantResult.FAILED_NO_CRYSTALS);

                activeChar.refreshExpertisePenalty();
            }
        }

        activeChar.refreshOverloaded();
        activeChar.setEnchantScroll(null);
        activeChar.sendChanges();
    }

    private static boolean isYogiStaffEnchanting(L2ItemInstance scroll, L2ItemInstance itemToEnchant)
    {
        if(scroll.getItemId() == 13540 && itemToEnchant.getItemId() == 13539)
            return true;
        return false;
    }
}
влить вот это
Код:
private static boolean checkEnchant(L2ItemInstance itemToEnchant)
{
int itemType = itemToEnchant.getItem().getType2();
int maxWep = 0, maxArmJew = 0; // инициализация(оружие,арм/бижа)
switch(itemToEnchant.getCrystalType())
{
case C:
maxWep = 25;
maxArmJew = 15;
break;
case B:
maxWep = 20;
maxArmJew = 10;
break;
case A:
maxWep = 16;
maxArmJew = 8;
break;
case S:
maxWep = 13;
break;
case S80:
maxWep = 8;
break;
case S84:
maxWep = 7;
break;
default:
maxArmJew = 6;
break;
}
if(itemType == L2Item.TYPE2_WEAPON && itemToEnchant.getEnchantLevel() >= maxWep)
return true;
else if((itemType == L2Item.TYPE1_SHIELD_ARMOR || itemType == L2Item.TYPE2_ACCESSORY) && itemToEnchant.getEnchantLevel() >= maxArmJew)
return true;
return false;
}
да так что бы пахало.
Суть в том, что этот код ставит ограничение заточек по грейду, через клиентпакет.

Добавлено через 13 часов 20 минут
KilRoy Написал:P.S СОХРАНЯТЬ ВСЁ В UTF-8 БЕЗ BOM
собственно так и делаю. в том то и трабл.:negodue:
Ответ
#20
Цитата:собственно так и делаю. в том то и трабл.
а на картинке текст в cp1251 Wink
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Мануал! Создание дуалов - Java PROGRAMMATOR 13 17,143 04-01-2021, 02:07 PM
Последний пост: Demon88
  Нужна помощь по Компиляции из .Java в .Class Kafmaer 2 2,944 05-26-2019, 02:34 AM
Последний пост: Kafmaer
  Несколько серверов TPAKC 18 6,307 01-10-2016, 09:30 PM
Последний пост: TPAKC
  Оптимизация Java сервера Lineage 2 для онлайна 1000+ 1ZeroS1 32 75,489 05-06-2014, 01:37 PM
Последний пост: Pretus
  "Java" не является внутренней или внешней командой Devilop 2 11,588 05-24-2011, 10:40 AM
Последний пост: [STIGMATED]
  Мануал по редактированию скилов в Java сборках [Red Dragon] 2 10,774 08-23-2010, 12:51 AM
Последний пост: [Red Dragon]
  ZG-compiller - установка и компиляция сборок ява серверов PROGRAMMATOR 49 24,433 08-05-2010, 08:44 AM
Последний пост: FischeR

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)