Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной

Приветствую всех! Первый раз пишу на этот форум, но сижу уже где-то неделю, изучаю EnScript. Суть вопроса такова: для себя пишу что-то вроде админки на основе скриптов, хочу ее поставить на ванильный сервер. Уже несколько часов бьюсь с проблемой спавна вещей и машин. Тестирую со спавном ВСС в руках с обвесом и собранной нивы.

Что и как спавнить я передаю через HTTP, с помощью RestApi

Запрос:

api = GetRestApi();
cb = new GiveRestCallback();
ct = api.GetRestContext("http://127.0.0.1:8080/server/");
ct.GET(cb, "give/vss");

Коллбэк:

class GiveRestCallback: CustomRestCallback
{
	override void OnSuccess( string data, int dataSize )
	{
		if (kDEBUG == 1)
			Print("[MY_SCRIPT] GiveRestCallback.OnSuccess called");
		
		if (dataSize < 0)
			return;
			
		if (kDEBUG == 1)
			Print("Data is " + data);
		
		ApiGiveResponse resp = new ApiGiveResponse();
		string error;
		JsonSerializer js = new JsonSerializer();
		bool ok = js.ReadFromString(resp, data, error);
		
		Module.Give(resp.Name, resp.kAttachments, resp.kInventory);
	}
}

CustomRestCallback - наследуется от RestCallback, и в нем просто переписаны OnTimeout() и OnError()

ApiGiveResponse - описание структуры данных для JsonSerializer (Все это нашел в распакованных скриптах, комментариях к коду от самих разрабов)

class ApiGiveResponse
{
	string Method;
	string Name;
	array<string> kAttachments;
	array<string> kInventory;
}

Данные, которые я передаю:

{
	"Method": "give/vss",
	"Name": "VSS",
	"kAttachments": [
		"Mag_VSS_10Rnd", "PSO11Optic"
	],
	"kInventory": [
		"Mag_VSS_10Rnd",
		"Mag_VSS_10Rnd"
	]
}

Коллбэк вызывает функцию Give, которая должна заспавнить вещь в руках игрока (пока что только админа), а затем прикрепить к ней вещи из массива kAttachments

static void Give(string Name, array<string> kAttachments, array<string> kInventory)
{
		
	if (kDEBUG == 1)
		Print("[MY_SCRIPT] Module.Give called");
		
	Param1<string> Msgparam;
	PlayerBase Admin = GetAdmin();
	EntityAI given;
	
	if (!Admin)
		return;
		
	if (kDEBUG == 1)
	{
		Print("++++++++++++++++++++++++++++++++++");
		Print(Name);
		Print(kAttachments);
		Print(kInventory);
		Print("----------------------------------");
	}
	
	given = Admin.GetHumanInventory().CreateInHands(Name);

	if (given)
	{
		for (int i = 0; i < kAttachments.Count(); i++)
		{
			given.GetInventory().CreateAttachment(kAttachments[i]);
		}
		Msgparam = new Param1<string>("Done!");
	}
	else
	{
		Msgparam = new Param1<string>("Failed!");
	}
	GetGame().RPCSingleParam(Admin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, Admin.GetIdentity());
}

И вот в функции Give происходит непонятное для меня - ВСС спавнится в руках, к нему пристегивается магазин, а дальше происходит вот что:

SCRIPT       : [MY_SCRIPT] Module.Give called
SCRIPT       : [MY_SCRIPT] Module.GetAdmin called
SCRIPT       : ++++++++++++++++++++++++++++++++++
SCRIPT       : string Name = 'VSS'
SCRIPT       : array<string> kAttachments = 0x000000000d6d60a0 {'Mag_VSS_10Rnd','PSO11Optic'}
SCRIPT       : array<string> kInventory = 0x000000000d6d5160 {'Mag_VSS_10Rnd','Mag_VSS_10Rnd'}
SCRIPT       : ----------------------------------
SCRIPT    (E): NULL pointer to instance
Function: 'Give'
Stack trace:
$CurrentDir:mpmissions/dayzOffline.chernarusplus/my_scripts/Module.c:46
$CurrentDir:mpmissions/dayzOffline.chernarusplus/my_scripts/Callbacks.c:90
SCRIPT    (E): NULL pointer to instance
Function: 'Give'
Stack trace:
$CurrentDir:mpmissions/dayzOffline.chernarusplus/my_scripts/Module.c:46
$CurrentDir:mpmissions/dayzOffline.chernarusplus/my_scripts/Callbacks.c:90

И прицел не спавнится, сервер продолжает работу. Со спавном нивы примерно то же самое: спавнится нива, к ней спавнится только капот, а всего остального нет, хотя и двери, и колеса, все было указано во входных данных.

P.S. JsonSerializer все обрабатывает правильно, это видно в логах, и я это отдельно тестил.

 

Прошу помочь, объясните, что не так. В документации на community.bistudio.com читал про ключевое слово ref и Managed классы, но так до конца и не понял, что к чему, и не понял принцип работы Garbage Collector'а. Возможно, что это все из-за него 😠

UPD:

$CurrentDir:mpmissions/dayzOffline.chernarusplus/my_scripts/Module.c:46

это строка

for (int i = 0; i < kAttachments.Count(); i++) 

в функции Give, а

$CurrentDir:mpmissions/dayzOffline.chernarusplus/my_scripts/Callbacks.c:90

это вызов функции Give из коллбэка

Изменено пользователем killreal (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

Решено путем добавления ключевого слова ref к аргументам функции Give.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах



  • 0

потому как kAttachments было NULL. ref позволяет использовать массив вне функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, 123new сказал:

потому как kAttachments было NULL. ref позволяет использовать массив вне функции.

Вопрос был как раз в том, почему kAttachments становится NULL прямо в середине выполнения функции. То есть до первой итерации for переменная содержала данные, на первой же итерации - становилась NULL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
7 часов назад, killreal сказал:

Вопрос был как раз в том, почему kAttachments становится NULL прямо в середине выполнения функции. То есть до первой итерации for переменная содержала данные, на первой же итерации - становилась NULL.

входные данные надо проверять в функцию, этот же массив в функцию поступает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

А как вы написали CustomRestCallback? Я пытаюсь сделать свой вариант, который бы менял onSuccess из RestCallback, но пишет "Unknown type RestCallback"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.