Mod Расширение класса item скриптовым классом.

Автор темы #1
Дата рег
19 Фев 2011
Сообщения
197
Симпатии
72
Позволяет расширить класс Item своим скриптовым классом.
Резервирует переменную итема val9, там хранится ссылка на объект, не используйте ее если предмет расширен.
Апи и пример будут добпвлены в скором времени отдельным постом.
Сохранение данных на вашей совести, можно делать в самом классе.
Сборка на скорую руку, позже буду улучшать, можете добавлять реквесты какие-то.
 

Вложения

Последнее редактирование:
Автор темы #2
Дата рег
19 Фев 2011
Сообщения
197
Симпатии
72
const bool Item::IsExpansion // указывает на то расширен ли предмет. Регистрируется в самой dll, при подключении ее к серверу.

EXPORT void ExpansionItemFinish(Item& item, bool deleted);
// Следует вызывать при финише итема, вызывать обязательно. Либо в вашем обработчике эвента, либо назначать обработчиком эвента.
EXPORT void ExpansionItemInit( Item& item, bool first, ScriptString& className );
// Следует вызывать в скрипте инициализации предмета. Через строку передается имя класса расширения. Вызывать обязательно, в противном случае можно получить дамп при получении расширения предмета после рестарта сервера.
EXPORT void Item_GetExpansion( Item& item, asIScriptObject& obj );
// Получает копию класса расширения для работы с ним.
EXPORT void Item_UpdateExpansion( Item& item, asIScriptObject& obj );
// Приравниваем расширение предмета к классу аргумента. ( классы должны быть одни и те-же )
Код:
#pragma bindfunc "void Item::GetExpansion( ?&out value ) -> expasion_item.dll Item_GetExpansion"
#pragma bindfunc "void Item::UpdateExpansion( ?&in value ) -> expasion_item.dll Item_UpdateExpansion"
#pragma bindfunc "void ExpansionItemInit( Item& item, bool first, string&in className ) -> expasion_item.dll ExpansionItemInit"
 
void TestExpansionItemInit( Item& it, bool first )
{
ExpansionItemInit( it, first, "ItemMove" );
it.SetEvent( ITEM_EVENT_FINISH, "expasion_item.dll@ExpansionItemFinish" );
}
void TestExpansionItem( Critter& cr, int pid, int count, int )
{
Item@ it = cr.AddItem( pid, count );
if( valid( it ) )
{
it.SetScript( "TestExpansionItemInit" );
 
{
ItemMove im( it );
im.Var = 100;
} // im Destruct
 
Log( "-----------" );
{
ItemMove im( it );
} // im Destruct
 
}
}
uint countIM = 0;
class ItemMove
{
ItemMove()
{
Log( "Test " + countIM++ );
ItemId = 0;
Var = 0;
@ it = null;
}
 
ItemMove( Item@ item )
{
Var = 0;
ItemId = 0;
Log( "Construct" );
item.GetExpansion( this );
@ it = item;
 
Log( "Var = " + Var );
}
 
~ItemMove( )
{
if( valid( it ) )
{
// Чтобы не зациклило обнулим ссылку.
Item@ itMemm = it;
@ it = null;
Log( "Destruct update" );
itMemm.UpdateExpansion( this );
}
else Log( "Destruct" );
}
 
void Init( Item& item, bool first )
{
Log( "Init" );
if( not first )
{
// Load data
}
ItemId = item.Id;
}
 
void Finish( Item& item, bool deleted )
{
if( deleted )
{
// Erase data
}
else
{
// Save data
}
Log( "Finish" );
}
 
Item@ it;
uint Var;
uint ItemId;
}
 
Последнее редактирование:
Автор темы #3
Дата рег
19 Фев 2011
Сообщения
197
Симпатии
72
Поправил пример, добавлена автосинхронизация данных с итемом.
 
Автор темы #4
Дата рег
19 Фев 2011
Сообщения
197
Симпатии
72
В близжайших планах добавить насильное присовывание эвента финиша, и объвление других эвентов если в скриптовом классе есть функции подходящие под функцию обработчика. ( по имени, аргументам и возвращаемым значениям )
 
Дата рег
22 Мар 2014
Сообщения
166
Симпатии
17
В чем моя проблема?)

Ошибок столько:( Ревизия 412