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
killreal

NULL pointer to instance

Приветствую всех! Первый раз пишу на этот форум, но сижу уже где-то неделю, изучаю 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 из коллбэка

Edited by killreal (see edit history)

Share this post


Link to post
Share on other sites

5 answers to this question

Recommended Posts

  • 0

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

Share this post


Link to post
Share on other sites



  • 0

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

Share this post


Link to post
Share on other sites
  • 0
1 час назад, 123new сказал:

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

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

Share this post


Link to post
Share on other sites
  • 0
7 часов назад, killreal сказал:

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

×
×
  • 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.