Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Sign in to follow this  
xOk

Использование define из другого мода

Добрый день!

Есть MOD_A, который использует функцию FOO_MOD_B из MOD_B.
В принципе, MOD_A может работать из без MOD_B. Однако, если запустить сервер с MOD_A, но без MOD_B, вылетает ошибка, что функция FOO_MOD_B не определена.

Я пытался решить эту проблему, добавив в MOD_B define, идентифицирующий наличие данного мода - MOD_B_IS_LOADED, затем в MOD_A обернул код, использующий FOO_MOD_B примерно так:

#ifdef MOD_B_IS_LOADED
	FOO_MOD_B();
#endif

Однако, после запуска сервера MOD_A почему-то считает, что MOD_B_IS_LOADED всегда не определена (даже, когда MOD_B загружен), из-за чего FOO_MOD_B никогда не выполняется...

 

Вопрос: что я делаю не так?

 

P.S.: в MOD_B дефайн делал и отдельным файлом (с подключением папки в config.cpp), и напрямую в файле скрипта с PlayerBase.. MOD_A в любом случае не видит этот дефайн.

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Решил проблему. Кажется, дело было в том, что я не добавил мод с дефайнами в список зависимостей.

Вот список изменений в моём моде, при которых дефайны стали работать:

1. Добавил зависимость от мода Trader в requiredAddons:

class CfgPatches {
    class MY_MOD {
        requiredAddons[] = {
			"DZ_Scripts",
			"Trader",
        };
    }
}

2. В своих скриптах обернул код с вызовом функций из мода Trader в ifdef-endif:

...
#ifdef TRADER
		if (targetPlayer.IsTrader())
			return false;
#endif
...

 

Теперь мой мод работает и когда Trader загружен, и когда Trader НЕ загружен.

 

 

Также, я научился работать с дефайнами в кастомных (своих) модах.

Чтобы создать дефайн, который будет виден в других модах, нужно:

1. В папку "ModName/Scripts/Common" добавить файл define.c, в котором прописать дефайн:

#define MOD_B_IS_LOADED

2. В config.cpp в каждый модуль прописать пусть к папке "ModName/Scripts/Common":

class CfgMods {
    class MOB_B {
        type = "mod";

        class defs {
            class worldScriptModule {
                value = "";
                files[] = {
                    "_Mods/Sources/MOB_B/Scripts/Common",
                    "_Mods/Sources/MOB_B/Scripts/4_World",
                };
            };
        }
    }
}

3. Собрать пакет мода обычным способом.

 

Всё! Теперь, описанный дефайн можно использовать и в других модах (пример см. в начале этого ответа).

Edited by xOk (see edit history)

Share this post


Link to post
Share on other sites



  • 0

Опишу конкретный пример. Есть сторонний мод Trader. В нем есть дефайн TRADER и функция PlayerBase.IsTrader().

Я хочу создать свой мод, в котором одной из проверок мне нужно проверить, не является ли цель (PlayerBase) нпц-продавцом. При этом, хотелось бы, чтобы мой мод работал бы даже если мод Trader не был бы загружен (в таком случае проверка на нпц-продавца не проводилась бы). 
Я обернул проверку с PlayerBase.IsTrader() в ifdef-endif. Но почему то мой мод никак не видит внешний дефайн TRADER.. Почему?

Edited by xOk (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.