L2J Mobius IT Classic Fix Drop\Spoil - Exp\Sp

Zion [🌿]

Постоялец
Местный
Сообщения
273
Розыгрыши
0
Репутация
73
Реакции
282
Баллы
1 083
Хроники
  1. Interlude
Сборка
L2jMobius Interlude Classic
Сидел, дорабатывал это дело для себя, но решил поделиться!

Написал скрипт для переноса параметров мобов (drop, spoil, Exp, SP) из "Lucera 3" (компилятор взят с общего доступа) в L2J Mobius Interlude Classic. Пролистав несколько XML-файлов, не нашел параметров типа "Категории", поэтому расчет шанса дропа был адаптирован без учета этой переменной, с использованием стандартного официального шанса.

Зачем это понадобилось?
Все просто: на многих мобах вообще не был прописан дроп или значения получаемого Exp и SP. Хотелось привести это в порядок.


P.S. Если кто-то знает, как в Mobius прописываются категории, дайте знать в этой теме. Я доработаю скрипт и выложу обновленные XML-файлы.

СКАЧАТЬ

ПАРОЛЬ
 
P.S. Дроп который не должен быть в интерлюде (косяки оставленые мобиусом) я не вырезал, так что нужна доработка!

пример 1734132017469.webp

Но эту проблему можно быстренько решить ручками, по вырезав ненужный дроп через nodepad++ или же банальной заменой спавна мобов, ибо этих мобов и не должно быть в интерлюде, а в тех мобах которые должны быть, дроп в файлах которых я выложил исправлен.
 

P.S. Если кто-то знает, как в Mobius прописываются категории, дайте знать в этой теме. Я доработаю скрипт и выложу обновленные XML-файлы.
XML:
                            <xs:element name="dropLists" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="drop" minOccurs="0">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:simpleContent>
                                                                <xs:extension base="xs:string">
                                                                    <xs:attribute type="xs:int" name="id" use="required"/>
                                                                    <xs:attribute type="xs:long" name="min" use="required"/>
                                                                    <xs:attribute type="xs:long" name="max" use="required"/>
                                                                    <xs:attribute type="xs:double" name="chance" use="required"/>
                                                                </xs:extension>
                                                            </xs:simpleContent>
                                                        </xs:complexType>
                                                    </xs:element>
                                                    <xs:element name="group" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:sequence>
                                                                <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                                    <xs:complexType>
                                                                        <xs:simpleContent>
                                                                            <xs:extension base="xs:string">
                                                                                <xs:attribute type="xs:int" name="id" use="required"/>
                                                                                <xs:attribute type="xs:long" name="min" use="required"/>
                                                                                <xs:attribute type="xs:long" name="max" use="required"/>
                                                                                <xs:attribute type="xs:double" name="chance" use="required"/>
                                                                            </xs:extension>
                                                                        </xs:simpleContent>
                                                                    </xs:complexType>
                                                                </xs:element>
                                                            </xs:sequence>
                                                            <xs:attribute type="xs:double" name="chance" use="optional"/>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="spoil" minOccurs="0">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:simpleContent>
                                                                <xs:extension base="xs:string">
                                                                    <xs:attribute type="xs:int" name="id" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="min" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="max" use="optional"/>
                                                                    <xs:attribute type="xs:double" name="chance" use="optional"/>
                                                                </xs:extension>
                                                            </xs:simpleContent>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="lucky" minOccurs="0">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:simpleContent>
                                                                <xs:extension base="xs:string">
                                                                    <xs:attribute type="xs:int" name="id" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="min" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="max" use="optional"/>
                                                                    <xs:attribute type="xs:double" name="chance" use="optional"/>
                                                                </xs:extension>
                                                            </xs:simpleContent>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
 
XML:
                            <xs:element name="dropLists" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="drop" minOccurs="0">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:simpleContent>
                                                                <xs:extension base="xs:string">
                                                                    <xs:attribute type="xs:int" name="id" use="required"/>
                                                                    <xs:attribute type="xs:long" name="min" use="required"/>
                                                                    <xs:attribute type="xs:long" name="max" use="required"/>
                                                                    <xs:attribute type="xs:double" name="chance" use="required"/>
                                                                </xs:extension>
                                                            </xs:simpleContent>
                                                        </xs:complexType>
                                                    </xs:element>
                                                    <xs:element name="group" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:sequence>
                                                                <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                                    <xs:complexType>
                                                                        <xs:simpleContent>
                                                                            <xs:extension base="xs:string">
                                                                                <xs:attribute type="xs:int" name="id" use="required"/>
                                                                                <xs:attribute type="xs:long" name="min" use="required"/>
                                                                                <xs:attribute type="xs:long" name="max" use="required"/>
                                                                                <xs:attribute type="xs:double" name="chance" use="required"/>
                                                                            </xs:extension>
                                                                        </xs:simpleContent>
                                                                    </xs:complexType>
                                                                </xs:element>
                                                            </xs:sequence>
                                                            <xs:attribute type="xs:double" name="chance" use="optional"/>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="spoil" minOccurs="0">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:simpleContent>
                                                                <xs:extension base="xs:string">
                                                                    <xs:attribute type="xs:int" name="id" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="min" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="max" use="optional"/>
                                                                    <xs:attribute type="xs:double" name="chance" use="optional"/>
                                                                </xs:extension>
                                                            </xs:simpleContent>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="lucky" minOccurs="0">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
                                                        <xs:complexType>
                                                            <xs:simpleContent>
                                                                <xs:extension base="xs:string">
                                                                    <xs:attribute type="xs:int" name="id" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="min" use="optional"/>
                                                                    <xs:attribute type="xs:long" name="max" use="optional"/>
                                                                    <xs:attribute type="xs:double" name="chance" use="optional"/>
                                                                </xs:extension>
                                                            </xs:simpleContent>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>

спасибо, чуть позже обновлю скрипт и выложу новую версию дропа.
 
  • Мне нравится
Реакции: Bankir

    Bankir

    Баллов: 5
    И скрипт за одно выложи)

спасибо, чуть позже обновлю скрипт и выложу новую версию дропа.

а у мобиуса идет проверка на то, чтобы сумма шансов в группе была 100% ровно, или у него плавающий сумарный процент в группе? у люцеры насколько помню - идет проверка на 100%. Могут быть разные принципы создания групп дропа и их проверки, и они между собой не стакаются
 
а у мобиуса идет проверка на то, чтобы сумма шансов в группе была 100% ровно, или у него плавающий сумарный процент в группе? у люцеры насколько помню - идет проверка на 100%. Могут быть разные принципы создания групп дропа и их проверки, и они между собой не стакаются
Сурс мобиуса - в шаре, как и репозиторий в доступе, смотри и изучай "не хочу".
 
Сурс мобиуса - в шаре, как и репозиторий в доступе, смотри и изучай "не хочу".
ну эт надо не мне, а автору. если ты знаешь уже и ковырялся - мог бы ответить. мне в это Г лезть не интересно. опять же, если есть сурс - я бы переписал расчет шанса взяв из акиса. У него есть обратная совместимость с другой методикой рассчета. а ПТСовская методика на другом типе рассчета не заработает. И проще править дроп по "неПТСной" методике.
 
ну эт надо не мне, а автору. если ты знаешь уже и ковырялся - мог бы ответить. мне в это Г лезть не интересно. опять же, если есть сурс - я бы переписал расчет шанса взяв из акиса. У него есть обратная совместимость с другой методикой рассчета. а ПТСовская методика на другом типе рассчета не заработает. И проще править дроп по "неПТСной" методике.
Он переписан у меня, то что у Мобиуса (и еще 90%) - не возможно использовать, реализация для C1, С2.
Даже посмотрев в любой слитый ПТС, можно определиться что система дропа не на столько убогая должна быть.
 
Он переписан у меня, то что у Мобиуса (и еще 90%) - не возможно использовать, реализация для C1, С2.
Даже посмотрев в любой слитый ПТС, можно определиться что система дропа не на столько убогая должна быть.
Из твоей формулиррвки однозначно не ясно, убоготое то что у мобиуса, или то что и в птс. Так как по мне и то что в птс- убого. Ну точнее переусложнено для оптимизации. Это имеет смысл, когда у тебя есть все тулзы дополнителтные разработчика. А для простых админов фришек это лишняя головная боль и балансировка процентов всех айтемов в группе и шанса группы при изменении всего лишь одного айтема из группы.
А в чем отличия моделей дропа с1 и поздних хроник?
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Bankir, не знал, что у мобиуса и дроп написан скажем так "не идеально"...Хотя меня всегда удивляли странные шансы дропа на различных выборках... где шанс указан в 70%, на выборке в 50 мобов - получалось примерно такое значение, потом делал вторую выборку в 50 мобов и уже ловил реальный шанс в 30%....
 
Из твоей формулиррвки однозначно не ясно, убоготое то что у мобиуса, или то что и в птс. Так как по мне и то что в птс- убого. Ну точнее переусложнено для оптимизации. Это имеет смысл, когда у тебя есть все тулзы дополнителтные разработчика. А для простых админов фришек это лишняя головная боль и балансировка процентов всех айтемов в группе и шанса группы при изменении всего лишь одного айтема из группы.
А в чем отличия моделей дропа с1 и поздних хроник?
Оффтоп:

Рас уж ты работал с ПТС - да там очень "Хитромудро", и завязано на многих системах/расчетах.

В чем разниц от С1 и выше - да много в чем, к примеру наличие или отсутствие дополнительных групп (т.е. все в одной и имеют свой уникальный шанс, без общего расчета в 100%), есть время, когда был упор в 100% для общей группы, пришло время - когда каждый итем имеет уникальный шанс, а группа/дроп лист общая(ий).
Ивент дроп - он может быть на уровне скриптов или сразу ити в дроп листах.

Крч, возьми слитую птс Essence и посмотри что там может быть (хотя уже и этот дроп обновили), добавили несколько новых систем связных с дропом или открытием чело либо.
 
Сидел, дорабатывал это дело для себя, но решил поделиться!

Написал скрипт для переноса параметров мобов (drop, spoil, Exp, SP) из "Lucera 3" (компилятор взят с общего доступа) в L2J Mobius Interlude Classic. Пролистав несколько XML-файлов, не нашел параметров типа "Категории", поэтому расчет шанса дропа был адаптирован без учета этой переменной, с использованием стандартного официального шанса.

Зачем это понадобилось?
Exp и SP. Хотелось привести это в порядок.


P.S. Если кто-то знает, как в Mobius прописываются категории, дайте знать в этой теме. Я доработаю скрипт и выложу обновленные XML-файлы.

СКАЧАТЬ
*** Скрытый текст не может быть процитирован. ***

ПАРОЛЬ
*** Скрытый текст не может быть процитирован. ***
thanks
 
Из-за неприятного инцидента было утрачено множество файлов, включая файлы сборки. Начинать всё с нуля нет особого желания, поэтому я решил поделиться исходной версией скрипта для переноса дропа. Скрипт написан на Python и при необходимости легко поддаётся доработке или адаптации под ваши нужды.
Код:
import os
import xml.etree.ElementTree as ET

# Путь к папкам с файлами
OLD_FILES_DIR = r"C:\путь к файлу с которого адаптируем"
NEW_FILES_DIR = r"C:\путь к файлу под который адаптируем"
OUTPUT_DIR = r"C:\путь куда сохраняем результат"

# Создаём выходную папку, если её нет
os.makedirs(OUTPUT_DIR, exist_ok=True)

def parse_drops_and_spoils(old_drops):
    """Разделяет дропы и спойлы из старого формата."""
    drops = []
    spoils = []
    for category in old_drops.findall("category"):
        category_type = category.attrib.get("type", "").upper()
        category_chance = float(category.attrib.get("chance", 0))
        for drop in category.findall("drop"):
            item_id = drop.attrib.get("itemid", "")
            min_amount = drop.attrib.get("min", "0")
            max_amount = drop.attrib.get("max", "0")
            drop_chance = float(drop.attrib.get("chance", 0))

            # Общий шанс дропа = шанс категории * шанс предмета
            total_chance = category_chance * drop_chance / 100

            # Разделяем дропы и спойлы по типу категории
            if category_type == "SPOIL":
                spoils.append({
                    "id": item_id,
                    "min": min_amount,
                    "max": max_amount,
                    "chance": round(total_chance, 4)
                })
            else:
                drops.append({
                    "id": item_id,
                    "min": min_amount,
                    "max": max_amount,
                    "chance": round(total_chance, 4)
                })

    return drops, spoils

def indent_tree(elem, level=0):
    """Добавляет отступы для читаемого форматирования XML."""
    i = "\n" + "\t" * level
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "\t"
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for child in elem:
            indent_tree(child, level + 1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

def update_npc(new_npc, old_npc):
    """Обновляет данные NPC в новом формате, используя старый."""
    # Обновляем exp и sp
    acquire = new_npc.find("acquire")
    if acquire is not None:
        exp = old_npc.find("set[@name='exp']")
        sp = old_npc.find("set[@name='sp']")
        if exp is not None:
            acquire.set("exp", exp.attrib["val"])
        if sp is not None:
            acquire.set("sp", sp.attrib["val"])

    # Обновляем дропы
    old_drops = old_npc.find("drops")
    if old_drops is None:
        return

    drop_lists = new_npc.find("dropLists")
    if drop_lists is not None:
        new_npc.remove(drop_lists)

    new_drop_lists = ET.Element("dropLists")

    # Разделяем дропы и спойлы
    drops, spoils = parse_drops_and_spoils(old_drops)

    # Добавляем дропы, если они есть
    if drops:
        drop_element = ET.SubElement(new_drop_lists, "drop")
        for drop in drops:
            ET.SubElement(drop_element, "item", {
                "id": drop["id"],
                "min": drop["min"],
                "max": drop["max"],
                "chance": str(drop["chance"])
            })

    # Добавляем спойлы, если они есть
    if spoils:
        spoil_element = ET.SubElement(new_drop_lists, "spoil")
        for spoil in spoils:
            ET.SubElement(spoil_element, "item", {
                "id": spoil["id"],
                "min": spoil["min"],
                "max": spoil["max"],
                "chance": str(spoil["chance"])
            })

    new_npc.append(new_drop_lists)

def create_old_npc_index(old_files):
    """Создаёт индекс NPC из старых файлов для быстрого доступа по ID."""
    old_npc_index = {}
    for old_file in old_files:
        try:
            old_tree = ET.parse(old_file)
            old_root = old_tree.getroot()
            for old_npc in old_root.findall("npc"):
                old_id = old_npc.attrib.get("id")
                if old_id:
                    old_npc_index[old_id] = old_npc
        except Exception as e:
            print(f"Ошибка при обработке файла {old_file}: {e}")
    return old_npc_index

def process_files(new_file, old_npc_index, output_file):
    """Обрабатывает новый файл, обновляя его на основе старого индекса."""
    try:
        new_tree = ET.parse(new_file)
        new_root = new_tree.getroot()

        # Сопоставляем NPC по ID и обновляем
        for new_npc in new_root.findall("npc"):
            new_id = new_npc.attrib.get("id")
            if new_id and new_id in old_npc_index:
                update_npc(new_npc, old_npc_index[new_id])

        # Добавляем отступы и сохраняем файл
        indent_tree(new_root)
        new_tree.write(output_file, encoding="utf-8", xml_declaration=True)

        print(f"Обработан файл: {output_file}")

    except Exception as e:
        print(f"Ошибка обработки файла {new_file}: {e}")

def main():
    """Основная функция."""
    old_files = [os.path.join(OLD_FILES_DIR, f) for f in os.listdir(OLD_FILES_DIR) if f.endswith(".xml")]
    new_files = [os.path.join(NEW_FILES_DIR, f) for f in os.listdir(NEW_FILES_DIR) if f.endswith(".xml")]

    if not old_files:
        print("Старые файлы не найдены.")
        return

    if not new_files:
        print("Новые файлы не найдены.")
        return

    # Создаём индекс для старых NPC
    old_npc_index = create_old_npc_index(old_files)

    # Обрабатываем каждый новый файл
    for new_file in new_files:
        output_file = os.path.join(OUTPUT_DIR, os.path.basename(new_file))
        process_files(new_file, old_npc_index, output_file)

if __name__ == "__main__":
    main()
    print("Обработка завершена.")
 
J'étais assis et finalisais cette affaire par moi-même, mais j'ai décidé de partager !

J'ai écrit un script pour transférer les paramètres mob ( drop, spoil, Exp, SP ) de "Lucera 3" (le compilateur a été extrait du domaine public) vers L2J Mobius Interlude Classic. Après avoir parcouru plusieurs fichiers XML, je n'ai pas trouvé de paramètres comme « Catégories », le calcul du drop chance a donc été adapté sans prendre en compte cette variable, en utilisant le standard officiel du hasard.

Pourquoi était-ce nécessaire ?
C'est simple : sur de nombreux mobs le drop ou les valeurs des Exp et SP reçus n'étaient pas du tout enregistrées . Je voulais mettre cela de l'ordre.


PS Si quelqu'un sait comment les catégories sont écrites dans Mobius, faites-le moi savoir dans ce fil. Je finaliserai le script et publierai les fichiers XML mis à jour.

TÉLÉCHARGER
*** Le texte masqué ne peut pas être cité. ***

MOT DE PASSE
*** Le texte masqué ne peut pas être cité. ***
Thanks man
 
Назад
Сверху