Prelude Of War part 3 - TENKAI

MrKirill1232

Прославленный
Проверенный
Победитель в номинации 2023
Мастер реакций
Неукротимое пламя
Медаль Благодарности
Победитель в номинации 2022
Старожил I степени
Сообщения
1 787
Розыгрыши
0
Решения
34
Репутация
1 025
Реакции
1 381
Баллы
1 408
Хроники
  1. Prologue: Prelude of War
Исходники
Присутствуют
Сборка
l2-tenkai
Поделюсь знаниями о запуске этого чуда...
Вообщем, не знаю кому блин это сдастся, но пускай будет ибо не хочу уже в это лезть и удалить к чертям с ПК.
==
Тенкаи это какой-то порт на 245 протокола с 228 протокола мобиуса ( но как говорит сам мобиус "стырили с первых сурсов гомункула 286" )
Скачать:
Клиент: -
Систем: -
Сервер (исходники) : -
Сервер (исходники) ( зеркало ):

О процессе и костылях при запуске смотрите ниже;
 

Сервер написан по 14 java, вполне уверенно компилируется и на 17, но со своими бедами.
0 - у исходников битый логин сервер - используйте какой-то от шмобиуса от 228 и выше;
1 - после запуска через .exe вылетает какое-то непонятное окно и все, что делать ? Нужно лезть в сурсы и вырубать его и потом успешно запускаться через .bat :) (ну или через .exe)
Ну как и говорил - залезаем в сурсы, а точнее в
Код:
\java\org\l2jmobius\gameserver\GameServer.java
ищем комментарий
Код:
// Initialize config
и комментируем
Код:
ServerGui gui = new ServerGui();
        gui.init();
Вот так должен файлик выглядеть после комментирования
Java:
/*
 * This file is part of the L2J Mobius project.
 *
 * This program 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.
 *
 * This program 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 org.l2jmobius.gameserver;

import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.time.Duration;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.DeadLockDetector;
import org.l2jmobius.gameserver.cache.HtmCache;
import org.l2jmobius.gameserver.data.sql.impl.AnnouncementsTable;
import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
import org.l2jmobius.gameserver.data.sql.impl.CharSummonTable;
import org.l2jmobius.gameserver.data.sql.impl.ClanTable;
import org.l2jmobius.gameserver.data.sql.impl.CrestTable;
import org.l2jmobius.gameserver.data.sql.impl.OfflineTraderTable;
import org.l2jmobius.gameserver.data.xml.impl.ActionData;
import org.l2jmobius.gameserver.data.xml.impl.AdminData;
import org.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import org.l2jmobius.gameserver.data.xml.impl.AppearanceItemData;
import org.l2jmobius.gameserver.data.xml.impl.ArmorSetData;
import org.l2jmobius.gameserver.data.xml.impl.AttendanceRewardData;
import org.l2jmobius.gameserver.data.xml.impl.BeautyShopData;
import org.l2jmobius.gameserver.data.xml.impl.BuyListData;
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
import org.l2jmobius.gameserver.data.xml.impl.ClanHallData;
import org.l2jmobius.gameserver.data.xml.impl.ClanMasteryData;
import org.l2jmobius.gameserver.data.xml.impl.ClanShopData;
import org.l2jmobius.gameserver.data.xml.impl.ClassListData;
import org.l2jmobius.gameserver.data.xml.impl.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.impl.CubicData;
import org.l2jmobius.gameserver.data.xml.impl.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemOptionsData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantSkillGroupsData;
import org.l2jmobius.gameserver.data.xml.impl.EnsoulData;
import org.l2jmobius.gameserver.data.xml.impl.EquipmentUpgradeData;
import org.l2jmobius.gameserver.data.xml.impl.EventEngineData;
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
import org.l2jmobius.gameserver.data.xml.impl.ExtendDropData;
import org.l2jmobius.gameserver.data.xml.impl.FakePlayerData;
import org.l2jmobius.gameserver.data.xml.impl.FenceData;
import org.l2jmobius.gameserver.data.xml.impl.FishingData;
import org.l2jmobius.gameserver.data.xml.impl.HennaData;
import org.l2jmobius.gameserver.data.xml.impl.HitConditionBonusData;
import org.l2jmobius.gameserver.data.xml.impl.InitialEquipmentData;
import org.l2jmobius.gameserver.data.xml.impl.InitialShortcutData;
import org.l2jmobius.gameserver.data.xml.impl.ItemCrystallizationData;
import org.l2jmobius.gameserver.data.xml.impl.KarmaData;
import org.l2jmobius.gameserver.data.xml.impl.LuckyGameData;
import org.l2jmobius.gameserver.data.xml.impl.MonsterBookData;
import org.l2jmobius.gameserver.data.xml.impl.MultisellData;
import org.l2jmobius.gameserver.data.xml.impl.NpcData;
import org.l2jmobius.gameserver.data.xml.impl.NpcNameLocalisationData;
import org.l2jmobius.gameserver.data.xml.impl.OptionData;
import org.l2jmobius.gameserver.data.xml.impl.PetDataTable;
import org.l2jmobius.gameserver.data.xml.impl.PetSkillData;
import org.l2jmobius.gameserver.data.xml.impl.PlayerTemplateData;
import org.l2jmobius.gameserver.data.xml.impl.PlayerXpPercentLostData;
import org.l2jmobius.gameserver.data.xml.impl.PrimeShopData;
import org.l2jmobius.gameserver.data.xml.impl.RecipeData;
import org.l2jmobius.gameserver.data.xml.impl.ResidenceFunctionsData;
import org.l2jmobius.gameserver.data.xml.impl.SayuneData;
import org.l2jmobius.gameserver.data.xml.impl.SecondaryAuthData;
import org.l2jmobius.gameserver.data.xml.impl.SendMessageLocalisationData;
import org.l2jmobius.gameserver.data.xml.impl.ShuttleData;
import org.l2jmobius.gameserver.data.xml.impl.SiegeScheduleData;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.data.xml.impl.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.impl.SpawnData;
import org.l2jmobius.gameserver.data.xml.impl.StaticObjectData;
import org.l2jmobius.gameserver.data.xml.impl.TeleportListData;
import org.l2jmobius.gameserver.data.xml.impl.TeleporterData;
import org.l2jmobius.gameserver.data.xml.impl.TransformData;
import org.l2jmobius.gameserver.data.xml.impl.VariationData;
import org.l2jmobius.gameserver.datatables.BotReportTable;
import org.l2jmobius.gameserver.datatables.EventDroplist;
import org.l2jmobius.gameserver.datatables.EventPrizesTable;
import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.events.instanced.EventsManager;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.gui.ServerGui;
import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.DailyMissionHandler;
import org.l2jmobius.gameserver.handler.EffectHandler;
import org.l2jmobius.gameserver.handler.SkillConditionHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.*;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.entity.Hero;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.votereward.VoteSystem;
import org.l2jmobius.gameserver.network.ClientNetworkManager;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.loginserver.LoginServerNetworkManager;
import org.l2jmobius.gameserver.network.telnet.TelnetServer;
import org.l2jmobius.gameserver.scripting.ScriptEngineManager;
import org.l2jmobius.gameserver.taskmanager.TaskManager;
import org.l2jmobius.gameserver.ui.Gui;
import org.l2jmobius.gameserver.util.Broadcast;

public class GameServer
{
    private static final Logger LOGGER = Logger.getLogger(GameServer.class.getName());
   
    private final DeadLockDetector _deadDetectThread;
    private static GameServer INSTANCE;
    public static final Calendar dateTimeServerStarted = Calendar.getInstance();
   
    public long getUsedMemoryMB()
    {
        return (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1048576;
    }
   
    public DeadLockDetector getDeadLockDetectorThread()
    {
        return _deadDetectThread;
    }
   
    public GameServer() throws Exception
    {
        final long serverLoadStart = System.currentTimeMillis();


        // GUI
        if (!GraphicsEnvironment.isHeadless())
        {
            System.out.println("GameServer: Running in GUI mode.");
            new Gui();
        }


        // Create log folder
        final File logFolder = new File(".", "log");
        logFolder.mkdir();
       
        // Create input stream for log file -- or store file data into memory
        try (InputStream is = new FileInputStream(new File("./log.cfg")))
        {
            LogManager.getLogManager().readConfiguration(is);
        }

        // Initialize config
        Config.load(ServerMode.GAME);

        /*ServerGui gui = new ServerGui();
        gui.init();
        */
        printSection("Database");
        DatabaseFactory.init();
       
        printSection("ThreadPool");
        ThreadPool.init();
       
        printSection("IdFactory");
        IdFactory.init();
        if (!IdFactory.hasInitialized())
        {
            LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
            throw new Exception("Could not initialize the ID factory!");
        }
       
        // load script engines
        printSection("Scripting Engine");
        EventDispatcher.getInstance();
        ScriptEngineManager.getInstance();
       
        printSection("Telnet");
        TelnetServer.getInstance();
       
        printSection("World");
        // start game time control early
        GameTimeController.init();
        World.getInstance();
        MapRegionManager.getInstance();
        ZoneManager.getInstance();
        DoorData.getInstance();
        FenceData.getInstance();
        AnnouncementsTable.getInstance();
        GlobalVariablesManager.getInstance();

        printSection("Data");
        ActionData.getInstance();
        CategoryData.getInstance();
        SecondaryAuthData.getInstance();
        CombinationItemsData.getInstance();
        SayuneData.getInstance();
        DailyMissionHandler.getInstance().executeScript();
        DailyMissionData.getInstance();



        printSection("Skills");
        SkillConditionHandler.getInstance().executeScript();
        EffectHandler.getInstance().executeScript();
        EnchantSkillGroupsData.getInstance();
        SkillTreeData.getInstance();
        SkillData.getInstance();
        PetSkillData.getInstance();
       
        printSection("Items");
        ConditionHandler.getInstance().executeScript();
        ItemTable.getInstance();
        EnchantItemGroupsData.getInstance();
        EnchantItemData.getInstance();
        EnchantItemOptionsData.getInstance();
        ItemCrystallizationData.getInstance();
        OptionData.getInstance();
        VariationData.getInstance();
        EnsoulData.getInstance();
        EnchantItemHPBonusData.getInstance();
        BuyListData.getInstance();
        MultisellData.getInstance();
        EquipmentUpgradeData.getInstance();
        RecipeData.getInstance();
        ArmorSetData.getInstance();
        FishingData.getInstance();
        HennaData.getInstance();
        PrimeShopData.getInstance();
        PcCafePointsManager.getInstance();
        AppearanceItemData.getInstance();
        AlchemyData.getInstance();
        CommissionManager.getInstance();
        LuckyGameData.getInstance();
        AttendanceRewardData.getInstance();
       
        printSection("Characters");
        ClassListData.getInstance();
        InitialEquipmentData.getInstance();
        InitialShortcutData.getInstance();
        ExperienceData.getInstance();
        PlayerXpPercentLostData.getInstance();
        KarmaData.getInstance();
        HitConditionBonusData.getInstance();
        PlayerTemplateData.getInstance();
        CharNameTable.getInstance();
        AdminData.getInstance();
        PetDataTable.getInstance();
        CubicData.getInstance();
        CharSummonTable.getInstance().init();
        BeautyShopData.getInstance();
        MentorManager.getInstance();
       
        if (Config.FACTION_SYSTEM_ENABLED)
        {
            FactionManager.getInstance();
        }
       
        if (Config.PREMIUM_SYSTEM_ENABLED)
        {
            LOGGER.info("PremiumManager: Premium system is enabled.");
            PremiumManager.getInstance();
        }
       
        printSection("Clans");
        ClanTable.getInstance();
        ResidenceFunctionsData.getInstance();
        ClanHallData.getInstance();
        ClanHallAuctionManager.getInstance();
        ClanEntryManager.getInstance();
        ClanMasteryData.getInstance();
        ClanShopData.getInstance();
       
        printSection("Geodata");
        GeoEngine.getInstance();
       
        printSection("NPCs");
        NpcData.getInstance();
        FakePlayerData.getInstance();
        FakePlayerChatManager.getInstance();
        ExtendDropData.getInstance();
        SpawnData.getInstance();
        MonsterBookData.getInstance();
        WalkingManager.getInstance();
        StaticObjectData.getInstance();
        ItemAuctionManager.getInstance();
        CastleManager.getInstance().loadInstances();
        GrandBossManager.getInstance();
        EventDroplist.getInstance();
       
        printSection("Instance");
        InstanceManager.getInstance();
       
        printSection("Olympiad");
        Olympiad.getInstance();
        Hero.getInstance();
       
        // Call to load caches
        printSection("Cache");
        HtmCache.getInstance();
        CrestTable.getInstance();
        TeleportListData.getInstance();
        TeleporterData.getInstance();
        MatchingRoomManager.getInstance();
        PetitionManager.getInstance();
        CursedWeaponsManager.getInstance();
        TransformData.getInstance();
        BotReportTable.getInstance();
        RankManager.getInstance();
        if (Config.SELLBUFF_ENABLED)
        {
            SellBuffsManager.getInstance();
        }
        if (Config.MULTILANG_ENABLE)
        {
            SystemMessageId.loadLocalisations();
            NpcStringId.loadLocalisations();
            SendMessageLocalisationData.getInstance();
            NpcNameLocalisationData.getInstance();
        }
       
        printSection("Scripts");
        QuestManager.getInstance();
        BoatManager.getInstance();
        AirShipManager.getInstance();
        ShuttleData.getInstance();
        GraciaSeedsManager.getInstance();
       
        try
        {
            LOGGER.info(getClass().getSimpleName() + ": Loading server scripts:");
            ScriptEngineManager.getInstance().executeScript(ScriptEngineManager.MASTER_HANDLER_FILE);
            ScriptEngineManager.getInstance().executeScriptList();
        }
        catch (Exception e)
        {
            LOGGER.log(Level.WARNING, getClass().getSimpleName() + ": Failed to execute script list!", e);
        }
       
        SpawnData.getInstance().init();
        DBSpawnManager.getInstance();
       
        printSection("Event Engine");
        EventEngineData.getInstance();
        VoteSystem.initialize();

        printSection("Siege");
        SiegeManager.getInstance().getSieges();
        CastleManager.getInstance().activateInstances();
        FortManager.getInstance().loadInstances();
        FortManager.getInstance().activateInstances();
        FortSiegeManager.getInstance();
        SiegeScheduleData.getInstance();
       
        CastleManorManager.getInstance();
        SiegeGuardManager.getInstance();
        QuestManager.getInstance().report();
       
        if (Config.SAVE_DROPPED_ITEM)
        {
            ItemsOnGroundManager.getInstance();
        }
       
        if ((Config.AUTODESTROY_ITEM_AFTER > 0) || (Config.HERB_AUTO_DESTROY_TIME > 0))
        {
            ItemsAutoDestroy.getInstance();
        }
       
        MonsterRace.getInstance();
       
        TaskManager.getInstance();
       
        AntiFeedManager.getInstance().registerEvent(AntiFeedManager.GAME_ID);
       
        if (Config.ALLOW_MAIL)
        {
            MailManager.getInstance();
        }
        if (Config.CUSTOM_MAIL_MANAGER_ENABLED)
        {
            CustomMailManager.getInstance();
        }


        printSection("Tenkai Features");
        EventPrizesTable.getInstance().load();
        EventsManager.getInstance().start();
        FarmZoneManager.getInstance();
        UpgradableFarmZoneManager.getInstance();

        PunishmentManager.getInstance();
       
        Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
       
        LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
       
        if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
        {
            OfflineTraderTable.getInstance().restoreOfflineTraders();
        }
       
        if (Config.SERVER_RESTART_SCHEDULE_ENABLED)
        {
            ServerRestartManager.getInstance();
        }
       
        if (Config.DEADLOCK_DETECTOR)
        {
            _deadDetectThread = new DeadLockDetector(Duration.ofSeconds(Config.DEADLOCK_CHECK_INTERVAL), () ->
            {
                if (Config.RESTART_ON_DEADLOCK)
                {
                    Broadcast.toAllOnlinePlayers("Server has stability issues - restarting now.");
                    Shutdown.getInstance().startShutdown(null, 60, true);
                }
            });
            _deadDetectThread.setDaemon(true);
            _deadDetectThread.start();
        }
        else
        {
            _deadDetectThread = null;
        }
        System.gc();
        final long totalMem = Runtime.getRuntime().maxMemory() / 1048576;
        LOGGER.info(getClass().getSimpleName() + ": Started, using " + getUsedMemoryMB() + " of " + totalMem + " MB total memory.");
        LOGGER.info(getClass().getSimpleName() + ": Maximum number of connected players is " + Config.MAXIMUM_ONLINE_USERS + ".");
        LOGGER.info(getClass().getSimpleName() + ": Server loaded in " + ((System.currentTimeMillis() - serverLoadStart) / 1000) + " seconds.");
       
        ClientNetworkManager.getInstance().start();
       
        if (Boolean.getBoolean("newLoginServer"))
        {
            LoginServerNetworkManager.getInstance().connect();
        }
        else
        {
            LoginServerThread.getInstance().start();
        }
       
        Toolkit.getDefaultToolkit().beep();
    }
   
    public long getStartedTime()
    {
        return ManagementFactory.getRuntimeMXBean().getStartTime();
    }
   
    public String getUptime()
    {
        final long uptime = ManagementFactory.getRuntimeMXBean().getUptime() / 1000;
        final long hours = uptime / 3600;
        final long mins = (uptime - (hours * 3600)) / 60;
        final long secs = ((uptime - (hours * 3600)) - (mins * 60));
        if (hours > 0)
        {
            return hours + "hrs " + mins + "mins " + secs + "secs";
        }
        return mins + "mins " + secs + "secs";
    }
   
    public static void main(String[] args) throws Exception
    {
        INSTANCE = new GameServer();
    }
   
    private void printSection(String s)
    {
        s = "=[ " + s + " ]";
        while (s.length() < 61)
        {
            s = "-" + s;
        }
        LOGGER.info(s);
    }
   
    public static GameServer getInstance()
    {
        return INSTANCE;
    }
}
Заккоментировали - компилируем - заменяем либы и тд.
Заходим в game и создаем там start.bat файлик.
Открываем для редактирования и втыкаем туда вот этот код
Код:
@echo off
title Game Server Console l2-tenkai pow3
color 0B
:start
echo Starting L2J Game Server.
echo.

java -server -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.util.logging.manager=org.l2jmobius.log.ServerLogManager -Dorg.slf4j.simpleLogger.log.com.zaxxer.hikari=error -Xmx8g -Xms8g -jar ..\libs\GameServer.jar -nogui
if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto restart

:restart
echo.
echo Admin Restarted Game Server.
echo.
goto start

:error
echo.
echo Game Server Terminated Abnormally!
echo.
Сохраняем - запускаем.
Код:
@echo off
title Game Server Console l2-tenkai pow3
color 0B
:start
echo Starting L2J Game Server.
echo.

"C:\Program Files\BellSoft\LibericaJDK-14\bin\java" -server -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.util.logging.manager=org.l2jmobius.log.ServerLogManager -Dorg.slf4j.simpleLogger.log.com.zaxxer.hikari=error -Xmx14g -Xms12g -jar ..\libs\GameServer.jar -nogui
if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto restart

:restart
echo.
echo Admin Restarted Game Server.
echo.
goto start

:error
echo.
echo Game Server Terminated Abnormally!
echo.
Вместо
Код:
"C:\Program Files\BellSoft\LibericaJDK-14\bin\java"
впишите путь к нужной java, ну и в конце java не забудьте
2 - запустился через .bat, сервер не стартует, ошибка с 3DPoint какая-то;
Не знаю как её правильно решать, на сервере тенкая скинули фикс, я и забрал его;
Заходишь в папку libs, открываешь gameserver.jar как архив.
Переходишь по пути
Код:
java\org\l2jmobius\gameserver\util
и вставляешь туда 2 файла, с архива "Point3D-fix" (предварительно расспаковав с архива)
Имена файлов:
  • Point3D$Companion
  • Point3D
3 - Решение ошибки
Код:
java.sql.SQLSyntaxErrorException: (conn=29684) Table 'l2_tenkai_test.account_gsdata' doesn't exist
Заходим в базу - ищем сервер - создаем новую таблицу
Код:
account_gsdata
с полем:
  1. Имя - account_name
  2. Тип данных - varchar
Сохраняем - перезаходим на сервер
Опять же заходим в БД - ищем таблицу "characters" и создаем столбец "race_app"
Скачиваем одноименный файл ниже - расспаковываем и в БД его;
Заходим в сурсы, ищем
Код:
java\org\l2jmobius\gameserver\network\clientpackets\RequestEnchantItem.java
ищем строку
Код:
client.sendPacket(SystemMessageId.ENCHANT_FAILED_THE_ENCHANT_SKILL_FOR_THE_CORRESPONDING_ITEM_WILL_BE_EXACTLY_RETAINED);
и меняем ниже проверку "if (true) на if (false)"
Java:
package org.l2jmobius.gameserver.instancemanager;

import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.impl.NpcData;
import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.DropType;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.holders.DropHolder;
import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.util.xml.XmlDocument;
import org.l2jmobius.gameserver.util.xml.XmlNode;

import java.io.File;
import java.util.*;
import java.util.logging.Logger;

public class FarmZoneManager {
    protected static final Logger LOGGER = Logger.getLogger(NpcData.class.getName());

    public class FarmZone {
        private String _name;
        private Set<NpcTemplate> _mobs = new HashSet<>();
        private boolean _showInCb;

        public FarmZone(String name) {
            _name = name;
            _showInCb = false;
        }

        public void showInCb(boolean value) { _showInCb = value; }

        public void addMob(NpcTemplate mob) {
            _mobs.add(mob);
        }

        public String getName() {
            return _name;
        }

        public Set<NpcTemplate> getMobs() {
            return _mobs;
        }

        public boolean getShowInCb() { return _showInCb; }
    }

    private Map<String, FarmZone> _farmZones = new HashMap<>();

    private static FarmZoneManager _instance;

    public double randomBetween(double low, double high) {
        Random r = new Random();
        return  low + (high - low) * r.nextDouble();
    }

    public Map<String, FarmZone> getFarmZones() {
        return _farmZones;
    }

    public static FarmZoneManager getInstance() {
        return _instance == null ? (_instance = new FarmZoneManager()) : _instance;
    }

    private FarmZoneManager() {

        load();
    }

    private void load() {
        File file = new File(Config.DATAPACK_ROOT, "/data/farm_zones/farmZone.xml");
        XmlDocument doc = new XmlDocument(file);
        for (XmlNode farmNode : doc.getChildren()) {
            if (farmNode.getName().equalsIgnoreCase("farmZone")) {
                String name = farmNode.getString("name");
                boolean showInCb = farmNode.getBool("showInCb", false);
                FarmZone farmZone = new FarmZone(name);
                if (showInCb) { farmZone.showInCb(true); }
                for (XmlNode mobNode : farmNode.getChildren()) {
                    if (mobNode.getName().equalsIgnoreCase("mob")) {
                        int mobId = mobNode.getInt("id");
                        NpcTemplate temp = NpcData.getInstance().getTemplate(mobId);
                        if (temp == null) {
                            continue;
                        }
                        farmZone.addMob(temp);
                    }
                }

                _farmZones.put(name, farmZone);
            }
        }
        LOGGER.info("Farm Zone Manager: loaded " + _farmZones.size() + " farm zone definitions.");


        List<DropHolder> eventDrops = new ArrayList<>();
        file = new File(Config.DATAPACK_ROOT, "/data/farm_zones/event.xml");
        doc = new XmlDocument(file);
        for (XmlNode eventNode : doc.getChildren()) {
            if (eventNode.getName().equalsIgnoreCase("event") && eventNode.getBool("active")) {
                String name = eventNode.getString("name");
                for (XmlNode dropNode : eventNode.getChildren()) {
                    if (dropNode.getName().equalsIgnoreCase("itemDrop")) {
                        int itemId = dropNode.getInt("itemId");
                        int min = dropNode.getInt("min");
                        int max = dropNode.getInt("max");
                        float chance = dropNode.getFloat("chance");

                        DropHolder dd = new DropHolder(DropType.DROP, itemId, min, max, chance);

                        Item item = ItemTable.getInstance().getTemplate(dd.getItemId());
                        if (item == null) {
                            LOGGER.warning("Drop data for undefined item template in custom drop definitions!");
                            continue;
                        }
                        if (dropNode.getName().equalsIgnoreCase("itemDrop")) {
                            eventDrops.add(dd);
                        }
                    }
                }
            }
        }
        LOGGER.info("Farm Zone Manager: loaded " + _farmZones.size() + " farm zone definitions.");

        file = new File(Config.DATAPACK_ROOT, "data/farm_zones/customFarmZone.xml");
        if (!file.exists()) {
            return;
        }

        doc = new XmlDocument(file);
        int customized = 0;
        for (XmlNode farmNode : doc.getChildren()) {
            if (farmNode.getName().equalsIgnoreCase("excludeDrop")) {
                int itemId = farmNode.getInt("itemId");
                for (NpcTemplate npc : NpcData.getInstance().getAllTemplates()) {
                    List<DropHolder> dropsToRemove = new ArrayList<>();
                    for (DropHolder dd : npc.getDropList(DropType.DROP)) {
                        if (dd.getItemId() == itemId) {
                            dropsToRemove.add(dd);
                        }
                    }

                    for (DropHolder dd : dropsToRemove)
                    {
                        npc.getDropList(DropType.DROP).remove(dd);
                    }

                }
            } else if (farmNode.getName().equalsIgnoreCase("customFarm")) {
                Set<NpcTemplate> mobs = new HashSet<>();
                if (farmNode.hasAttribute("farmZone")) {
                    String name = farmNode.getString("farmZone");
                    FarmZone farmZone = _farmZones.get(name);
                    for (NpcTemplate mob : farmZone.getMobs()) {
                        mobs.add(mob);
                    }
                } else if (farmNode.hasAttribute("levelRange")) {
                    String[] levelRange = farmNode.getString("levelRange").split("-");
                    int minLvl = Integer.parseInt(levelRange[0]);
                    int maxLvl = Integer.parseInt(levelRange[1]);
                    for (NpcTemplate mob : NpcData.getInstance().getAllTemplates()) {
                        if (mob.getLevel() >= minLvl && mob.getLevel() <= maxLvl) {
                            mobs.add(mob);
                        }
                    }
                } else {
                    LOGGER.warning("There's a farm customization without any monster group specified!");
                    continue;
                }

                float hpMultiplier = farmNode.getFloat("hpMultiplier", 1.0f);
                float atkMultiplier = farmNode.getFloat("atkMultiplier", 1.0f);
                float defMultiplier = farmNode.getFloat("defMultiplier", 1.0f);
                float mdefMultiplier = farmNode.getFloat("mdefMultiplier", 1.0f);
                int level = farmNode.getInt("overrideLevels", 0);
                boolean overrideDrops = farmNode.getBool("overrideDrops", false);
                float expMultiplier = farmNode.getFloat("expMultiplier", 1.0f);
                boolean includeEvent = farmNode.getBool("includeEvent", false);
                long adenaMin = farmNode.getLong("adenaMin", 0);
                long adenaMax = farmNode.getLong("adenaMax", adenaMin);
                double adenaChance = farmNode.getDouble("adenaChance", 100);
                float randomStatPercent = farmNode.getFloat("randomStatPercent", 0.0f);

                float baseMobFarmCost = 0.0f;
                if (farmNode.hasAttribute("adjustDropsPerMob")) {
                    int baseMobId = farmNode.getInt("adjustDropsPerMob");
                    NpcTemplate baseMobTemplate = NpcData.getInstance().getTemplate(baseMobId);
                    if (baseMobTemplate != null) {
                        try {
                            Spawn spawn = new Spawn(baseMobTemplate);
                            spawn.setXYZ(100, 100, 100);
                            spawn.setAmount(1);
                            spawn.setHeading(100);
                            spawn.doSpawn();
                            Npc baseMob = spawn.getSpawnedNpcs().getFirst();
                            baseMobFarmCost = baseMob.getMaxHp() *
                                    (float) (baseMob.getPDef() + baseMob.getMDef());
                            baseMob.deleteMe();
                            if (baseMob.getSpawn() != null) {
                                baseMob.getSpawn().stopRespawn();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }

                List<DropHolder> drops = new ArrayList<>();
                List<DropHolder> spoilDrops = new ArrayList<>();
                for (XmlNode dropNode : farmNode.getChildren()) {
                    if (dropNode.getName().equalsIgnoreCase("itemDrop") ||
                            dropNode.getName().equalsIgnoreCase("spoilDrop")) {
                        int itemId = dropNode.getInt("itemId");
                        int min = dropNode.getInt("min");
                        int max = dropNode.getInt("max");
                        float chance = dropNode.getFloat("chance");

                        DropHolder dd = new DropHolder(DropType.DROP, itemId, min, max, chance);

                        Item item = ItemTable.getInstance().getTemplate(dd.getItemId());
                        if (item == null) {
                            LOGGER.warning("Drop data for undefined item template in custom drop definitions!");
                            continue;
                        }

                        if (dropNode.getName().equalsIgnoreCase("itemDrop")) {
                            drops.add(dd);
                        } else {
                            spoilDrops.add(dd);
                        }
                    }
                }

                if (includeEvent && eventDrops.size() > 0) {
                    eventDrops.forEach(dropHolder -> {
                        drops.add(dropHolder);
                    });
                }



                for (NpcTemplate mob : mobs) {


                    float dropMultiplier = 1.0f;
                    if (baseMobFarmCost > 0.0f) {
                        try {
                            Spawn spawn = new Spawn(mob);
                            spawn.setXYZ(100, 100, 100);
                            spawn.setAmount(1);
                            spawn.setHeading(100);
                               spawn.doSpawn();
                            Npc mobInstance = spawn.getLastSpawn();
                            float mobFarmCost = mobInstance.getMaxHp() *
                                    (float) (mobInstance.getPDef() + mobInstance.getMDef());
                            dropMultiplier = mobFarmCost / baseMobFarmCost;
                            mobInstance.deleteMe();
                            if (mobInstance.getSpawn() != null) {
                                mobInstance.getSpawn().stopRespawn();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }



                    mob.setBaseHpMax(mob.getBaseHpMax() * hpMultiplier);
                    mob.setBasePAtk(mob.getBasePAtk() * atkMultiplier);
                    mob.setBasePDef(mob.getBasePDef() * defMultiplier);
                    mob.setBaseMDef(mob.getBaseMDef() * mdefMultiplier);


                    // mob.RewardExp = (long) (mob.RewardExp * expMultiplier);

                    if (level > 0) {
                        // mob.getLevel() = (byte) level;
                    }

                    if (randomStatPercent > 0.0f) {
                        mob.randomStat = randomStatPercent;
                    }

                    if (overrideDrops) {
                        mob.getDropList(DropType.DROP).clear();
                    }

                    if (adenaMin > 0) {
                        DropHolder dd = new DropHolder(DropType.DROP, 57,
                                (long)(Math.round(adenaMin * dropMultiplier) / Config.RATE_DROP_AMOUNT_BY_ID.get(57)), (long)(Math.round(adenaMax * dropMultiplier) / Config.RATE_DROP_AMOUNT_BY_ID.get(57)), adenaChance);
                        mob.addDrop(dd);
                    }

                    if (mob != null && mob.getDropList(DropType.DROP) != null) {
                        for (DropHolder drop : mob.getDropList(DropType.DROP)) {
                            if (drop.getItemId() == 57) {
                                DropHolder adena = new DropHolder(DropType.DROP, 57, drop.getMin(), drop.getMax(), 100);
                                mob.getDropList(DropType.DROP).remove(drop);
                                mob.addDrop(adena);
                            }
                        }
                    }

                    for (DropHolder drop : drops) {
                        long min = drop.getMin();
                        long max = drop.getMax();
                        double chance = drop.getChance() * dropMultiplier;
                        if (min >= 10 && chance > 100.0f ||
                                min * dropMultiplier >= 5 && chance / dropMultiplier <= 100.01f) {
                            min = Math.round(min * dropMultiplier);
                            max = Math.round(max * dropMultiplier);
                            chance /= dropMultiplier;
                        }

                        while (chance > 100.01f) {
                            min *= 2;
                            max *= 2;
                            chance /= 2.0f;
                        }

                        while (chance < 50.0f && min > 1) {
                            min /= 2;
                            max /= 2;
                            chance *= 2.0f;
                        }

                        mob.addDrop(new DropHolder(DropType.DROP, drop.getItemId(), min, max, chance));
                    }

                    for (DropHolder drop : spoilDrops) {
                        long min = drop.getMin();
                        long max = drop.getMax();
                        double chance = drop.getChance() * dropMultiplier;
                        if (min >= 10 && chance > 100.0f ||
                                min * dropMultiplier >= 5 && chance / dropMultiplier <= 100.01f) {
                            min = Math.round(min * dropMultiplier);
                            max = Math.round(max * dropMultiplier);
                            chance /= dropMultiplier;
                        }

                        while (chance > 100.01f) {
                            min *= 2;
                            max *= 2;
                            chance /= 2.0f;
                        }

                        while (chance < 50.0f && min > 1) {
                            min /= 2;
                            max /= 2;
                            chance *= 2.0f;
                        }

                        mob.addSpoil(new DropHolder(DropType.SPOIL, drop.getItemId(), min, max, chance));
                    }

                }

                customized++;
            }
        }
        Logger LOGGER = Logger.getLogger(NpcData.class.getName());
    }

}

Удалить эти Point3D вообще, просто каждый раз после компила кидать фикс в сервер (или попросить кого-то знабщего написать фикс путем реверса компила)
 

Вложения

  • Point3D-fix.7z
    2,6 КБ · Просмотры: 1
  • upgradable_farmzone.7z
    637 байт · Просмотры: 1
уже шарили )
 
Назад
Сверху Снизу