HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- (edict_s) Как достать Edict игрока ? (https://hlfx.ru/forum/showthread.php?threadid=3861)
Отправлено Andrei 26-03-2013 в 22:06:
(edict_s) Как достать Edict игрока ?
Здравствуйте. Мне нужен эдикт игрока,как его достать?
C++ Source Code:
1 | void UpdateClientData_Post(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd) |
3 | edict_t* pEntity = const_cast< edict_t * >( ent ); |
5 | UTIL_ColorChat(0, " %d ", pEntity ); |
7 | cd->m_flNextAttack = gpGlobals->time + 0.001; |
9 | RETURN_META(MRES_IGNORED); |
Отправлено XaeroX 27-03-2013 в 03:51:
Цитата:
Andrei писал:
const struct edict_s *ent
А это что?__________________
Отправлено pRoxxx 27-03-2013 в 09:28:
Цитата:
XaeroX писал:
А это что?
Судя по этому
C++ Source Code:
UTIL_ColorChat(0, " %d ", pEntity ); |
Ему надо не Эдикт, а айди.
Отправлено XaeroX 27-03-2013 в 10:16:
pRoxxx
Он же написал, что ему нужен эдикт.
Когда понадобится айди - он так и напишет. Чего мы гадать будем?
__________________
Отправлено Andrei 27-03-2013 в 14:19:
pRoxxx,да вы правы. Извините.
Отправлено Дядя Миша 27-03-2013 в 16:11:
Цитата:
pRoxxx писал:
Судя по этому
C++ Source Code:
UTIL_ColorChat(0, " %d ", pEntity );
Ему надо не Эдикт, а айди.
Судя вот по этому, тут нужен не ID, а IQ.
Отправлено XaeroX 27-03-2013 в 16:37:
Как вариант - IDDQD.
__________________
Отправлено Andrei 27-03-2013 в 17:35:
Я не понимаю,объясните пожалуйста.
Мне просто нужно проверить тут значение v.iuser2
Я сохроняю режим в своем оружии в него и хочу в UpdatePostClient проверять,если он равен двум,я заблокирую UpdatePostClient
Отправлено Дядя Миша 27-03-2013 в 18:10:
Цитата:
Andrei писал:
Мне просто нужно проверить тут значение v.iuser2
Что мешает?
Отправлено Andrei 27-03-2013 в 18:19:
Ноль всегда возвращает.
C++ Source Code:
1 | void UpdateClientData_Post(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd) |
3 | edict_t* pEntity = const_cast< edict_t * >( ent ); |
5 | UTIL_ColorChat(0, "%d", pEntity->v.iuser2); |
7 | cd->m_flNextAttack = gpGlobals->time + 0.001; |
9 | RETURN_META(MRES_IGNORED); |
Отправлено Дядя Миша 27-03-2013 в 18:38:
А покажи место, где ты пишешь в него ID.
Отправлено Andrei 27-03-2013 в 19:14:
Когда получаю оружие:
C++ Source Code:
1 | void CBaseWeapon::AddToPlayer( void *pPrivate1, void *pPrivate2 ) |
3 | edict_t* pWeapon = PrivateToEdict(pPrivate1); |
4 | edict_t* pEdict = PrivateToEdict(pPrivate2); |
6 | if(!IsValidPev(pWeapon) || !IsValidPev(pEdict)) |
8 | RETURN_META(MRES_IGNORED); |
11 | pWeapon->v.iuser2 = 25; |
13 | RETURN_META(MRES_IGNORED); |
Отправлено Дядя Миша 27-03-2013 в 19:19:
Так ты в оружие сохраняешь это число. А потом ищешь его у игрока?
Отправлено Andrei 27-03-2013 в 19:26:
Да,именно так. Я знаю,что это не верно. Поэтому мне по сути нужен эдикт,с которого я получу Entity оружия.
edict_t *pEntity = get_pdata_cbase(pPlayer, m_pActiveItem, XO_MONSTER);
UTIL_ColorChat(0, "%d", pEntity->v.iuser2);
Это работает в любой функции.
C++ Source Code:
1 | edict_t *get_pdata_cbase( edict_t *pEntity, int iOffset, int _linuxdiff = 5 ) |
13 | void *ptr = *((void **)((int *)pEntity->pvPrivateData + iOffset)); |
15 | return PrivateToEdict(ptr); |
В UpdateClientData какая-то проблема с этим эдиктом.
Может я не совсем верно доношу до вас мысль,но я думаю вы понимаете,что я хочу. Надеюсь на вашу помощь,дабы понять и не делать впреть таких глупых ошибок
Отправлено Дядя Миша 27-03-2013 в 20:41:
Нее, актив итем даст только текущую пушку в руках.
Перебирай массив m_rgpPlayerItems.
Отправлено Andrei 28-03-2013 в 03:31:
Дядя Миша,но мне и надо узнать текущую пушку в руках и проверить еще значение iuser2. Факт в том,что в упдат посте,сервер падает с приведенным кодом выше,а в любой другой функции нормально.
Отправлено ONeiLL 28-03-2013 в 14:29:
Может ты просто скажешь что ты хочешь и всё? Что именно ты хочешь вот этим сделать?
Отправлено Andrei 28-03-2013 в 14:43:
C++ Source Code:
1 | void UpdateClientData_Post(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd) |
3 | edict_t* pEntity = const_cast< edict_t * >( ent ); |
5 | if( pWeapon->v.iuser2 == 25 ) return; |
7 | cd->m_flNextAttack = gpGlobals->time + 0.001; |
9 | RETURN_META(MRES_IGNORED); |
Вот что я хочу. Но я не знаю как достать индекс пухи.
Отправлено ONeiLL 28-03-2013 в 14:48:
я не могу понять зачем это нужно
Отправлено Andrei 28-03-2013 в 15:31:
Я сохроняю в iuser моды оружия. Двух режимная пушка. Мне надо заблочить упдаст пост клиент,когда значение = 25,это я так проверяю мод.
Очень удобно просто сохронять в пуху,а не создавать 100500 массивов.
Отправлено Дядя Миша 28-03-2013 в 15:31:
Цитата:
Andrei писал:
Факт в том,что в упдат посте,сервер падает с приведенным кодом выше,а в любой другой функции нормально.
На NULL проверять не пробывал?
Отправлено Andrei 31-03-2013 в 10:41:
Заработало с помощью:
C++ Source Code:
1 | edict_t *GetPrivateCbase(edict_t *pEntity, int iOffset) |
4 | void *pPrivate = *((void **)((int *)(edict_t *)(INDEXENT(0) + ENTINDEX(pEntity))->pvPrivateData + iOffset)); |
11 | return PrivateToEdict(pPrivate); |
Подсказал: KORD_12.7
Отправлено marikcool 31-03-2013 в 13:00:
Это нужно чтобы на нулл проверить?
__________________
vk.com/skullcapstudios