Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_MobiusРазбор файла QuestManager.java
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
Основные элементы
[*]Лицензия
[*]Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
[*]Импорты
QuestManager.java — управление квестами и скриптами.
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
1. Лицензионное соглашение
/*
* Этот файл является частью проекта L2J Mobius.
*
* Эта программа является свободным ПО: вы можете распространять её и/или изменять
* её в соответствии с условиями GNU General Public License, опубликованной
* Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
*
* Эта программа распространяется в надежде, что она будет полезной,
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
* См. GNU General Public License для получения более подробной информации.
*
* Вы должны были получить копию GNU General Public License
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
*/Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
2. Импортируемые библиотеки
package org.l2jmobius.gameserver.instancemanager;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.scripting.ScriptEngineManager;java.util.Map — интерфейс для работы с коллекциями, которые сопоставляют ключи со значениями.java.util.concurrent.ConcurrentHashMap — потокобезопасная реализация карты для использования в многопоточных приложениях.java.util.logging.Logger — класс для логирования информации (вывод сообщений в консоль или лог-файлы).org.l2jmobius.Config — класс конфигурации сервера.org.l2jmobius.commons.util.CommonUtil — утилиты, которые могут использоваться в различных частях программы.org.l2jmobius.gameserver.model.quest.Quest — базовый класс квеста, представляющий игровой квест.org.l2jmobius.gameserver.scripting.ScriptEngineManager — менеджер для работы с игровыми скриптами.
3. Описание класса QuestManager
/**
* Менеджер квестов и скриптов.
* Автор: Zoey76
*/
public class QuestManager
{
private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
/** Карта, содержащая все квесты. */
private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
/** Карта, содержащая все скрипты. */
private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
protected QuestManager()
{
}
}4. Методы
Метод reload(String questFolder)
public boolean reload(String questFolder)
{
final Quest q = getQuest(questFolder);
if (q == null)
{
return false;
}
return q.reload();
}
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
Метод reload(int questId)
/**
* Перезагружает квест по ID.
* @param questId ID квеста для перезагрузки
* @return {@code true} если перезагрузка успешна, {@code false} в противном случае
*/
public boolean reload(int questId)
{
final Quest q = getQuest(questId);
if (q == null)
{
return false;
}
return q.reload();
}
[*]Аналогично предыдущему методу, но перезагружает квест по его ID.
Метод reloadAllScripts()
/**
* Выгружает все квесты и скрипты, а затем перезагружает их.
*/
public void reloadAllScripts()
{
unloadAllScripts();
LOGGER.info("Перезагрузка всех серверных скриптов.");
try
{
ScriptEngineManager.getInstance().executeScriptList();
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
}
getInstance().report();
}Метод unloadAllScripts()
/**
* Выгружает все квесты и скрипты.
*/
public void unloadAllScripts()
{
LOGGER.info("Выгрузка всех серверных скриптов.");
// Выгрузка квестов.
for (Quest quest : _quests.values())
{
if (quest != null)
{
quest.unload(false);
}
}
_quests.clear();
// Выгрузка скриптов.
for (Quest script : _scripts.values())
{
if (script != null)
{
script.unload(false);
}
}
_scripts.clear();
}
[*]Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
Метод report()
/**
* Логирует количество загруженных квестов и скриптов.
*/
public void report()
{
LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
}
[*]Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
Метод getQuest(String name)
/**
* Получает квест по имени.
* @param name имя квеста
* @return квест
*/
public Quest getQuest(String name)
{
if (_quests.containsKey(name))
{
return _quests.get(name);
}
return _scripts.get(name);
}
[*]Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
Метод getQuest(int questId)
/**
* Получает квест по ID.
* @param questId ID квеста
* @return квест, если найден, {@code null} в противном случае
*/
public Quest getQuest(int questId)
{
for (Quest q : _quests.values())
{
if (q.getId() == questId)
{
return q;
}
}
return null;
}
[*]Этот метод ищет квест по его уникальному идентификатору.
Метод addQuest(Quest quest)
/**
* Добавляет новый квест.
* @param quest квест для добавления
*/
public void addQuest(Quest quest)
{
if (quest == null)
{
throw new IllegalArgumentException("Аргумент квеста не может быть null");
}
final Quest old = _quests.put(quest.getName(), quest);
if (old != null)
{
old.unload();
LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
}
if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
{
final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
}
}
``Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
Страниц:
[1]