- Регистрация
- 26 Мар 2004
- Сообщения
- 2.001
- Благодарности
- 971
- Баллы
- 295
MobInter содержит «вшитую» проверку на предмет необходимый герою для взаимодействия с Mob'ом. Данный плагин «отвязывает» проверку на WithItem , осуществляя перехват функции разрешающий взаимодействие с объектом в новой общей Condition функции вызываемой из скриптов.
Спасибо ElderGamer за идею, спасибо Xeдин за реализацию, спасибо Gratt за то что лишил нас костылей, спасибо Slavemaster за то что делает Юнион совершенным.
***
После установки плагина на уровне скриптов надо добавить две функции:
Внутри функции кондишион моба можно делать проверку на необходимые условия для взаимодействием с данным мобом, как в оригинальных скриптах: наличие у героя каких то вещей , навыков, времени суток, наличие друзей / врагов рядом и так далее.
Для прочих объектов я написал черновик универсальной функции C_Hero_GetInv_MobInterItem.
В ней проверяется есть ли у героя предмет для взаимодействия с МОБом, если его нет то выводится какое-то сообщение и/или герой машет руками и/или герой что то говорит. То есть данная функция дописывается/настраивается согласно тому как автор видит данное событие.
***
Из бонусов:
***
Спасибо ElderGamer за идею, спасибо Xeдин за реализацию, спасибо Gratt за то что лишил нас костылей, спасибо Slavemaster за то что делает Юнион совершенным.
***
После установки плагина на уровне скриптов надо добавить две функции:
- G_MobInter_CanInteractWith – разрешает / запрещает взаимодействие с моб объектом.
- G_MobInter_UseWithItem – заменяет Item(при необходимости)
- G_MobInter_SendCallOnStateFunc - заменяет StateFunc функции(при необходимости)
Daedalus:
// функция вызывается движком если НПС - герой
func int G_MobInter_CanInteractWith(var string sceme, var int useWithItem)
{
Hlp_PrintConsole(Str_Format(" G_MobInter_CanInteractWith: sceme: %s useWithItem (%i)", sceme, useWithItem));
if (Hlp_StrCmp(sceme,"LAB")) { return C_Hero_GetInv_MobInterItem(ItMi_Flask); };
//if (Hlp_StrCmp(sceme,"RMAKER")) { return hero_RMaker_Condition(useWithItem); };// это рунный стол, делаем проверку внутри HERO_ALCHEMY_CONDITION
if (useWithItem == -1) { return true; }; // Item не требуется
return C_Hero_GetInv_MobInterItem(useWithItem); // вроверка на наличие у героя Item
};
Для прочих объектов я написал черновик универсальной функции C_Hero_GetInv_MobInterItem.
Daedalus:
func int C_Hero_GetInv_MobInterItem(var int useWithItem)
{
if (Npc_GetInvItem(hero,useWithItem))
{
return true; // у героя есть предмет -- > взаимодействие
};
// создаём красивый отказ от взаимодействия
CreateInvItem(hero,useWithItem);
var string msg;
msg = ConcatStrings("Для использования необдим: ", item.name) ;
PrintDialog( 1, msg , -1, -1, FONT_ScreenSmall, 2);
AI_PlayAni(hero,"T_DONTKNOW");
Npc_RemoveInvItem(hero,useWithItem);
return false;
};
|
***
Из бонусов:
- теперь предмет необходимый для взаимодействия с мобом не будет удалять у героя движок. То есть в диалоге выхода из производства не придётся создавать «неиспользованную» руну/колбу/заготовку.
- в функции C_MobInter_UseWithItem можно заменить item который герой будет использовать при взаимодействие с МОБ'ом.
Daedalus:
// функция вызывается движком если НПС - герой
func int G_MobInter_UseWithItem(var string sceme, var int useWithItem)
{
Hlp_PrintConsole(Str_Format(" call G_MobInter_UseWithItem sceme: %s, useWithItem: %i", sceme, useWithItem));
if (Hlp_StrCmp(sceme,"LAB")) { return C_MobInter_UseNewItem(ItMi_Flask_fake); };
// возвращаем оригинальную инстанцию
return useWithItem;
};
***
Daedalus:
func int G_MobInter_SendCallOnStateFunc(var string sceme, var int state)
{
Hlp_PrintConsole(Str_Format(" call G_MobInter_SendCallOnStateFunc sceme: %s, state: %i", sceme, state));
};
Вложения
Последнее редактирование: