HLFX.Ru Forum
Показать все 23 сообщений этой темы на одной странице

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)
2
{
3
  edict_t* pEntity = const_cast< edict_t * >( ent );
4
 
5
  UTIL_ColorChat(0, " %d ", pEntity );
6
 
7
  cd->m_flNextAttack = gpGlobals->time + 0.001;
8
 
9
  RETURN_META(MRES_IGNORED);
10
}


Отправлено XaeroX 27-03-2013 в 03:51:

Цитата:
Andrei писал:
const struct edict_s *ent

А это что?

__________________

xaerox on Vivino


Отправлено pRoxxx 27-03-2013 в 09:28:

Цитата:
XaeroX писал:
А это что?

Судя по этому
C++ Source Code:
UTIL_ColorChat(0, " %d ", pEntity );


Ему надо не Эдикт, а айди.


Отправлено XaeroX 27-03-2013 в 10:16:

pRoxxx
Он же написал, что ему нужен эдикт.
Когда понадобится айди - он так и напишет. Чего мы гадать будем?

__________________

xaerox on Vivino


Отправлено 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.

__________________

xaerox on Vivino


Отправлено 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)
2
{
3
  edict_t* pEntity = const_cast< edict_t * >( ent );
4
 
5
  UTIL_ColorChat(0, "%d", pEntity->v.iuser2);
6
 
7
  cd->m_flNextAttack = gpGlobals->time + 0.001;
8
 
9
  RETURN_META(MRES_IGNORED);
10
}


Отправлено Дядя Миша 27-03-2013 в 18:38:

А покажи место, где ты пишешь в него ID.


Отправлено Andrei 27-03-2013 в 19:14:

Когда получаю оружие:

C++ Source Code:
1
void CBaseWeapon::AddToPlayer( void *pPrivate1, void *pPrivate2 )
2
{
3
  edict_t* pWeapon = PrivateToEdict(pPrivate1);
4
  edict_t* pEdict = PrivateToEdict(pPrivate2);
5
 
6
  if(!IsValidPev(pWeapon) || !IsValidPev(pEdict))
7
  {
8
    RETURN_META(MRES_IGNORED);
9
  }
10
 
11
  pWeapon->v.iuser2 = 25;
12
 
13
  RETURN_META(MRES_IGNORED);
14
}


Отправлено Дядя Миша 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 )
2
{
3
 
4
#ifdef __linux__
5
  iOffset += _linuxdiff;
6
#endif
7
 
8
  if (iOffset <0)
9
  {
10
    return 0;
11
  }
12
 
13
  void *ptr = *((void **)((int *)pEntity->pvPrivateData + iOffset));
14
 
15
  return PrivateToEdict(ptr);
16
 
17
}



В 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)
2
{
3
  edict_t* pEntity = const_cast< edict_t * >( ent );
4
 
5
  if( pWeapon->v.iuser2 == 25 ) return;
6
 
7
  cd->m_flNextAttack = gpGlobals->time + 0.001;
8
 
9
  RETURN_META(MRES_IGNORED);
10
}


Вот что я хочу. Но я не знаю как достать индекс пухи.


Отправлено 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)
2
{
3
 
4
  void *pPrivate = *((void **)((int *)(edict_t *)(INDEXENT(0) + ENTINDEX(pEntity))->pvPrivateData + iOffset));
5
 
6
  if (!pPrivate)
7
  {
8
    return NULL;
9
  }
10
 
11
  return PrivateToEdict(pPrivate);
12
}


Подсказал: KORD_12.7


Отправлено marikcool 31-03-2013 в 13:00:

Это нужно чтобы на нулл проверить?

__________________
vk.com/skullcapstudios


Временная зона GMT. Текущее время 04:24.
Показать все 23 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024