Русское сообщество по скриптингу

импорт UTIL_FakeClientCommand

Все вопросы по скриптингу для Metamod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для
Metamod.


Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник плагина.

импорт UTIL_FakeClientCommand

Сообщение Morning Rainbow » 06 фев 2014, 23:22

Как можно использовать эту функцию из amxmodx в своих модулях для amxmodx?
Надеюсь можно обойтись без поиска сигнатуры функции)

Сначала думал, что просто перенесу эту функцию к себе, но оказалось, что это не так просто. Придётся ещё хукать Cmd_Args, Cmd_Argv и Cmd_Argc.
V8JS - 30% | Плагины на js + совместимость с amxmodx
Аватара пользователя
Morning Rainbow
 
Сообщения: 72
Зарегистрирован: 28 июл 2013, 00:35
Откуда: ??chan
Благодарил (а): 7 раз.
Поблагодарили: 50 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: импорт UTIL_FakeClientCommand

Сообщение Bos93 » 07 фев 2014, 23:06

Перенести не просто? Смотри:

[pawn]
  1. static META_FUNCTIONS gMetaFunctionTable;

  2. C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs)

  3. {

  4.         gpMetaGlobals = pMGlobals;

  5.         gpGamedllFuncs = pGamedllFuncs;

  6.  

  7.         gMetaFunctionTable.pfnGetEngineFunctions = GetEngineFunctions;

  8.  

  9.         memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));

  10.  

  11.         return true;

  12. }

  13.  

  14. enginefuncs_t g_pengfuncsTable;

  15. C_DLLEXPORT     int     GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *  )

  16. {

  17.  

  18.         pengfuncsFromEngine->pfnCmd_Argc = Cmd_Argc;

  19.         pengfuncsFromEngine->pfnCmd_Argv = Cmd_Argv;

  20.         pengfuncsFromEngine->pfnCmd_Args = Cmd_Args;

  21.  

  22.         return 1;

  23. }
[/pawn]

[pawn]
  1. struct fakecmd_t

  2. {

  3.         char args[256];

  4.         const char *argv[3];

  5.         int argc;

  6.         bool fake;

  7. };

  8.  

  9. fakecmd_t g_fakecmd;
[/pawn]

[pawn]
  1. const char *Cmd_Args(void)

  2. {

  3.         // if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function

  4.         if (g_fakecmd.fake)

  5.                 RETURN_META_VALUE(MRES_SUPERCEDE, (g_fakecmd.argc > 1) ? g_fakecmd.args : g_fakecmd.argv[0]);

  6.        

  7.         // otherwise ignore it

  8.         RETURN_META_VALUE(MRES_IGNORED, NULL);

  9. }

  10.  

  11. const char *Cmd_Argv(int argc)

  12. {

  13.         // if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function

  14.         if (g_fakecmd.fake)

  15.                 RETURN_META_VALUE(MRES_SUPERCEDE, (argc < 3) ? g_fakecmd.argv[argc] : "");

  16.        

  17.         // otherwise ignore it

  18.         RETURN_META_VALUE(MRES_IGNORED, NULL);

  19. }

  20.  

  21. int     Cmd_Argc(void)

  22. {

  23.         // if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function

  24.         if (g_fakecmd.fake)

  25.                 RETURN_META_VALUE(MRES_SUPERCEDE, g_fakecmd.argc);

  26.        

  27.         // otherwise ignore it

  28.         RETURN_META_VALUE(MRES_IGNORED, 0);

  29. }
[/pawn]

[pawn]
  1.  

  2. void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1, const char *arg2)

  3. {

  4.         if (!cmd)

  5.                 return;                                         // no command

  6.  

  7.         // store command

  8.         g_fakecmd.argv[0] = cmd;

  9.         // if only arg2 is passed, swap the arguments

  10.         if (!arg1 && arg2)

  11.         {

  12.                 arg1 = arg2;

  13.                 arg2 = NULL;

  14.         }

  15.  

  16.         // store arguments

  17.         if (arg2)

  18.         {                                                               // both arguments passed

  19.                 g_fakecmd.argc = 3;                     // 2 arguments + 1 command

  20.                 // store arguments

  21.                 g_fakecmd.argv[1] = arg1;

  22.                 g_fakecmd.argv[2] = arg2;

  23.                 // build argument line

  24.                 snprintf(g_fakecmd.args, 255, "%s %s", arg1, arg2);

  25.                 // if snprintf reached 255 chars limit, this will make sure there will be no access violation

  26.                 g_fakecmd.args[255] = 0;

  27.         }

  28.         else if (arg1)

  29.         {                                                               // only one argument passed

  30.                 g_fakecmd.argc = 2;                     // 1 argument + 1 command

  31.                 // store argument

  32.                 g_fakecmd.argv[1] = arg1;

  33.                 // build argument line

  34.                 snprintf(g_fakecmd.args, 255, "%s", arg1);

  35.                 // if snprintf reached 255 chars limit, this will make sure there will be no access violation

  36.                 g_fakecmd.args[255] = 0;

  37.         }

  38.         else

  39.                 g_fakecmd.argc = 1;                     // no argmuents -> only one command

  40.  

  41.         // set the global "fake" flag so the Cmd_Arg* functions will be superceded

  42.         g_fakecmd.fake = true;

  43.         // tell the GameDLL that the client sent a command

  44.         MDLL_ClientCommand(pEdict);

  45.         // unset the global "fake" flag

  46.         g_fakecmd.fake = false;

  47. }
[/pawn]

Это всё.

[pawn]
  1. UTIL_FakeClientCommand( pEntity, "drop", "weapon_usp"  );
[/pawn]

А тебе не надо даже регать функции, просто ункоментить.
Всем добра, любви и осознанности.

Nosce animum tuum.

А осознание и есть, что понял и осмыслил..
А коль не думал ты о том, то кто о том замыслил..?
Аватара пользователя
Bos93
 
Сообщения: 1429
Зарегистрирован: 03 апр 2010, 13:44
Благодарил (а): 149 раз.
Поблагодарили: 511 раз.


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1