AMX MOD X
Пятница, 19.04.2024, 20:58:19



Приветствую Вас Гость | RSS
[ Главная ] [ pvPrivateData float - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
AMX Mod X Форум » Half-Life SDK » Вопросы по Half-Life SDK » pvPrivateData float (как портировать с amxx)
pvPrivateData float
Immortal_BLGДата: Понедельник, 19.05.2008, 06:47:56 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 56
Репутация: 2
Статус: Не в сети
Хотел портировать из fakemeta функцию из pdata.cpp:
"static cell AMX_NATIVE_CALL get_pdata_float(AMX *amx, cell *params)"
иначе get_pdata_float(), так вот сталкнулся с проблемой немогу понять что за функция amx_ftoc() и как её можно поставить на бота?

вот оригинальный код:

Code
static cell AMX_NATIVE_CALL get_pdata_float(AMX *amx, cell *params)
{
  int index=params[1];
  CHECK_ENTITY(index);
  int iOffset=params[2];
  if (iOffset <0)
   return 1;
#ifdef __linux__
  iOffset += params[3];
#endif
  return amx_ftoc(*((float *)INDEXENT2(index)->pvPrivateData + iOffset));
}

вот мой, портированный:

Code
float getPdataFloat (edict_t *ent, int offset)
{
  if (FNullEnt (ent) || offset < 0)
   return 0;

  int index = ENTINDEX (ent) - 1;

  if (index < 0 || index >= GetMaxClients ())
   return 0;

  return amx_ftoc (*((float *)INDEXENT (index)->pvPrivateData + offset));
}

очень прошу помочь

Прикрепления: fakemeta.rar (82.5 Kb)
 
DaTaДата: Понедельник, 19.05.2008, 08:46:09 | Сообщение # 2
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
trunk/amxmodx/amx.h ::
Code
#if PAWN_CELL_SIZE==32
   #define amx_ftoc(f)   ( * ((cell*)&f) )   /* float to cell */
   #define amx_ctof(c)   ( * ((float*)&c) )  /* cell to float */
#elif PAWN_CELL_SIZE==64
   #define amx_ftoc(f)   ( * ((cell*)&f) )   /* float to cell */
   #define amx_ctof(c)   ( * ((double*)&c) ) /* cell to float */
#else

Добавлено (2008-05-19, 8:44 Am)
---------------------------------------------

Code
#if PAWN_CELL_SIZE==16
   typedef uint16_t  ucell;
   typedef int16_t   cell;
#elif PAWN_CELL_SIZE==32
   typedef uint32_t  ucell;
   typedef int32_t   cell;
#define REAL    float
#elif PAWN_CELL_SIZE==64
   typedef uint64_t  ucell;
   typedef int64_t   cell;
#define REAL    double
#else
   #error Unsupported cell size (PAWN_CELL_SIZE)
#endif

Добавлено (2008-05-19, 8:46 Am)
---------------------------------------------

Code
    #if defined __MACH__
       #include <ppc/types.h>
       typedef unsigned short int  uint16_t;
       typedef unsigned long int   uint32_t;
     #elif defined __FreeBSD__
       #include <inttypes.h>
     #else
       typedef short int           int16_t;
       typedef unsigned short int  uint16_t;
       #if defined SN_TARGET_PS2
         typedef int               int32_t;
         typedef unsigned int      uint32_t;
       #else
         typedef long int          int32_t;
         typedef unsigned long int uint32_t;
       #endif
       #if defined __WIN32__ || defined _WIN32 || defined WIN32
         typedef __int64           int64_t;
         typedef unsigned __int64  uint64_t;
         #define HAVE_I64
       #elif defined __GNUC__
         typedef long long         int64_t;
         typedef unsigned long long uint64_t;
         #define HAVE_I64
       #endif
 
slogicДата: Понедельник, 19.05.2008, 17:04:10 | Сообщение # 3
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Выкинь ее и все дела.
 
Immortal_BLGДата: Понедельник, 19.05.2008, 17:53:51 | Сообщение # 4
Лейтенант
Группа: Пользователи
Сообщений: 56
Репутация: 2
Статус: Не в сети
2 slogic хороший ответ... :(
2 DaTa непонял полет твоей мысли... :)
 
slogicДата: Понедельник, 19.05.2008, 18:05:22 | Сообщение # 5
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Так лучше?
Code
return *((float *)INDEXENT (index)->pvPrivateData + offset);

Из того что DaTa выложил можно было понять, что это сделано для преобразования между типом данных вида cell в amx/x и данными из C++.

 
Immortal_BLGДата: Вторник, 20.05.2008, 04:18:26 | Сообщение # 6
Лейтенант
Группа: Пользователи
Сообщений: 56
Репутация: 2
Статус: Не в сети
хм... сор я вначале не врубилсо)) , теперь компилирует нормально, но всеравно показывает только нуль, может быть это из-за того, что я поставил INDEXENT заместо INDEXENT2, так-как я думал, что функция MF_GetPlayerEdict() для бота не нужна, да и в движке бота ей тоже нету...

Это из amxx:

Code
inline edict_t* INDEXENT2( int iEdictNum )
{   
   if (iEdictNum >= 1 && iEdictNum <= gpGlobals->maxClients)
    return MF_GetPlayerEdict(iEdictNum);
   else
    return (*g_engfuncs.pfnPEntityOfEntIndex)(iEdictNum);   
}

Это из движка бота:

Code
inline edict_t *INDEXENT (int iEdictNum) { return (*g_engfuncs.pfnPEntityOfEntIndex) (iEdictNum); }


Сообщение отредактировал Immortal_BLG - Вторник, 20.05.2008, 04:22:19
 
slogicДата: Вторник, 20.05.2008, 15:37:02 | Сообщение # 7
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Это не из движка бота, а на самом деле из HLSDK. Файл dll/util.h.

А вот из-за чего у тебя где-то нуль, я не понимаю, я не телепат.

 
Immortal_BLGДата: Вторник, 20.05.2008, 17:00:18 | Сообщение # 8
Лейтенант
Группа: Пользователи
Сообщений: 56
Репутация: 2
Статус: Не в сети
Ну а вообще по сути для бота нужна эта функция INDEXENT2 а конкретно
Code
if (iEdictNum >= 1 && iEdictNum <= gpGlobals->maxClients)  
     return MF_GetPlayerEdict(iEdictNum)

?
 
slogicДата: Среда, 21.05.2008, 13:21:11 | Сообщение # 9
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Блин, эта функция по идентификатору entity получает ссылку на объект структуры entvars. Причем будет работать только для игроков, т.к. идет фильтрация идентификатора (от 1 до maxplayers). Нужна она или нет - тебе виднее.
 
Immortal_BLGДата: Среда, 21.05.2008, 17:20:40 | Сообщение # 10
Лейтенант
Группа: Пользователи
Сообщений: 56
Репутация: 2
Статус: Не в сети
Ну ты прости что я такой тупой, но по идее если я имею дело с ботами :) , то эта функция не нужна?
 
slogicДата: Среда, 21.05.2008, 17:24:27 | Сообщение # 11
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
В случае, который указан в первом посте, сокрее всего НЕ нужна, потому что функция вызывается только в твоем коде, и она не публикуется для использования сторонними людьми.
 
Immortal_BLGДата: Четверг, 22.05.2008, 12:25:38 | Сообщение # 12
Лейтенант
Группа: Пользователи
Сообщений: 56
Репутация: 2
Статус: Не в сети
хм... получается, что все правильно, но все-равно функция возвращает нуль, даже если убрать проверку ent и index...

Кстати, я чето не нашел оффсет времени перезарядки(пока только для этого мне эта функция и нужна...) и я взял этот оффсет из плагина VEN'a "Reload Status Bar", который равен 83 для win32 и 88 для linux, воть... Ведь это верно? :)

Code
float GetPrivateDataFloat (edict_t *ent, int offset)
{
   if (FNullEnt (ent) || offset < 0)
    return 0;

   int index = ENTINDEX (ent) - 1;

   if (index < 0 || index >= GetMaxClients ())
    return 0;

   return *((float *) INDEXENT (index)->pvPrivateData + offset);
}


Сообщение отредактировал Immortal_BLG - Четверг, 22.05.2008, 12:34:16
 
slogicДата: Четверг, 22.05.2008, 20:24:35 | Сообщение # 13
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Если index больше GetMaxClients(), то вернуть 0. Если равен, то это id игрока.
 
Immortal_BLGДата: Пятница, 23.05.2008, 12:55:27 | Сообщение # 14
Лейтенант
Группа: Пользователи
Сообщений: 56
Репутация: 2
Статус: Не в сети
Все, наконецто, свершилось!!!! на этот раз я просто сделал так:

Code
float GetPrivateDataFloat (edict_t *ent, int offset)
{
  if (FNullEnt (ent) || offset < 0)
   return 0;

  return *((float *) ent->pvPrivateData + offset);
}

и, ЭВРИКА!!! :)

З.Ы. СПАСИБО ЗА ПОМОЩЬ!!!

 
AMX Mod X Форум » Half-Life SDK » Вопросы по Half-Life SDK » pvPrivateData float (как портировать с amxx)
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024