|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
pvPrivateData float
|
|
Immortal_BLG | Дата: Понедельник, 19.05.2008, 06:47:56 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 56
Статус: Не в сети
| Хотел портировать из 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)); } очень прошу помочь
|
|
| |
DaTa | Дата: Понедельник, 19.05.2008, 08:46:09 | Сообщение # 2 |
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| 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
Статус: Не в сети
| Выкинь ее и все дела.
|
|
| |
Immortal_BLG | Дата: Понедельник, 19.05.2008, 17:53:51 | Сообщение # 4 |
Лейтенант
Группа: Пользователи
Сообщений: 56
Статус: Не в сети
| 2 slogic хороший ответ... 2 DaTa непонял полет твоей мысли...
|
|
| |
slogic | Дата: Понедельник, 19.05.2008, 18:05:22 | Сообщение # 5 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Так лучше? Code return *((float *)INDEXENT (index)->pvPrivateData + offset); Из того что DaTa выложил можно было понять, что это сделано для преобразования между типом данных вида cell в amx/x и данными из C++.
|
|
| |
Immortal_BLG | Дата: Вторник, 20.05.2008, 04:18:26 | Сообщение # 6 |
Лейтенант
Группа: Пользователи
Сообщений: 56
Статус: Не в сети
| хм... сор я вначале не врубилсо)) , теперь компилирует нормально, но всеравно показывает только нуль, может быть это из-за того, что я поставил 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
Статус: Не в сети
| Это не из движка бота, а на самом деле из HLSDK. Файл dll/util.h. А вот из-за чего у тебя где-то нуль, я не понимаю, я не телепат.
|
|
| |
Immortal_BLG | Дата: Вторник, 20.05.2008, 17:00:18 | Сообщение # 8 |
Лейтенант
Группа: Пользователи
Сообщений: 56
Статус: Не в сети
| Ну а вообще по сути для бота нужна эта функция INDEXENT2 а конкретно Code if (iEdictNum >= 1 && iEdictNum <= gpGlobals->maxClients) return MF_GetPlayerEdict(iEdictNum) ?
|
|
| |
slogic | Дата: Среда, 21.05.2008, 13:21:11 | Сообщение # 9 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Блин, эта функция по идентификатору entity получает ссылку на объект структуры entvars. Причем будет работать только для игроков, т.к. идет фильтрация идентификатора (от 1 до maxplayers). Нужна она или нет - тебе виднее.
|
|
| |
Immortal_BLG | Дата: Среда, 21.05.2008, 17:20:40 | Сообщение # 10 |
Лейтенант
Группа: Пользователи
Сообщений: 56
Статус: Не в сети
| Ну ты прости что я такой тупой, но по идее если я имею дело с ботами , то эта функция не нужна?
|
|
| |
slogic | Дата: Среда, 21.05.2008, 17:24:27 | Сообщение # 11 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| В случае, который указан в первом посте, сокрее всего НЕ нужна, потому что функция вызывается только в твоем коде, и она не публикуется для использования сторонними людьми.
|
|
| |
Immortal_BLG | Дата: Четверг, 22.05.2008, 12:25:38 | Сообщение # 12 |
Лейтенант
Группа: Пользователи
Сообщений: 56
Статус: Не в сети
| хм... получается, что все правильно, но все-равно функция возвращает нуль, даже если убрать проверку 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
Статус: Не в сети
| Если index больше GetMaxClients(), то вернуть 0. Если равен, то это id игрока.
|
|
| |
Immortal_BLG | Дата: Пятница, 23.05.2008, 12:55:27 | Сообщение # 14 |
Лейтенант
Группа: Пользователи
Сообщений: 56
Статус: Не в сети
| Все, наконецто, свершилось!!!! на этот раз я просто сделал так: Code float GetPrivateDataFloat (edict_t *ent, int offset) { if (FNullEnt (ent) || offset < 0) return 0;
return *((float *) ent->pvPrivateData + offset); } и, ЭВРИКА!!! З.Ы. СПАСИБО ЗА ПОМОЩЬ!!!
|
|
| |
| AMX Mod X Russian Community © 2006-2024 | |
|
| |