Вторник, 15.10.2024, 02:38
 
Приветствую Вас Guest | RSS
Главная страница | Маразм крепчает - Форум | Регистрация | Вход
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Маразм крепчает
Dark_AlexДата: Суббота, 11.02.2012, 16:01 | Сообщение # 1
Combat medic
Группа: Проверенные
Сообщений: 36
Репутация: 16
Статус: Offline
Приветствую народ Египта biggrin
Сегодня снова тот знаменательный день, когда мой "маразм крепчает" happy
Капался я в коде, и искал что-либо что может задавать нашему игроку новую позицию(координаты) в пространстве(по русски- телепорт).
И так что я нашел более или менее значимое:
Номер 1 это Baseentity
Code
static void TeleportEntity( CBaseEntity *pSourceEntity, TeleportListEntry_t &entry, const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity )
{
  CBaseEntity *pTeleport = entry.pEntity;
  Vector prevOrigin = entry.prevAbsOrigin;
  QAngle prevAngles = entry.prevAbsAngles;

  int nSolidFlags = pTeleport->GetSolidFlags();
  pTeleport->AddSolidFlags( FSOLID_NOT_SOLID );

  // I'm teleporting myself
  if ( pSourceEntity == pTeleport )
  {
   if ( newAngles )
   {
    pTeleport->SetLocalAngles( *newAngles );
    if ( pTeleport->IsPlayer() )
    {
     CBasePlayer *pPlayer = (CBasePlayer *)pTeleport;
     pPlayer->SnapEyeAngles( *newAngles );
    }
   }

   if ( newVelocity )
   {
    pTeleport->SetAbsVelocity( *newVelocity );
    pTeleport->SetBaseVelocity( vec3_origin );
   }

   if ( newPosition )
   {
    pTeleport->AddEffects( EF_NOINTERP );
    UTIL_SetOrigin( pTeleport, *newPosition );
   }
  }
  else
  {
   // My parent is teleporting, just update my position & physics
   pTeleport->CalcAbsolutePosition();


Номер 2 Это кусок из c_baseplayer
Code
    // Server says don't interpolate this frame, so set previous info to new info.
  if ( IsEffectActive(EF_NOINTERP) ||  
   Teleported() )
  {
   ResetLatched();
  }

  // Add in lighting effects
  CreateLightEffects();
}


Номер 3. Это мне тоже показалось интересным (player_lagcompensation)
Code
static void RestorePlayerTo( CBasePlayer *pPlayer, const Vector &vWantedPos )
{
  // Try to move to the wanted position from our current position.
  trace_t tr;
  VPROF_BUDGET( "RestorePlayerTo", "CLagCompensationManager" );
  UTIL_TraceEntity( pPlayer, vWantedPos, vWantedPos, MASK_PLAYERSOLID, pPlayer, COLLISION_GROUP_PLAYER_MOVEMENT, &tr );
  if ( tr.startsolid || tr.allsolid )
  {
   if ( sv_unlag_debug.GetBool() )
   {
    DevMsg( "RestorePlayerTo() could not restore player position for client \"%s\" ( %.1f %.1f %.1f )\n",
      pPlayer->GetPlayerName(), vWantedPos.x, vWantedPos.y, vWantedPos.z );
   }

   UTIL_TraceEntity( pPlayer, pPlayer->GetLocalOrigin(), vWantedPos, MASK_PLAYERSOLID, pPlayer, COLLISION_GROUP_PLAYER_MOVEMENT, &tr );
   if ( tr.startsolid || tr.allsolid )
   {
    // In this case, the guy got stuck back wherever we lag compensated him to. Nasty.

    if ( sv_unlag_debug.GetBool() )
     DevMsg( " restore failed entirely\n" );
   }
   else
   {
    // We can get to a valid place, but not all the way back to where we were.
    Vector vPos;
    VectorLerp( pPlayer->GetLocalOrigin(), vWantedPos, tr.fraction * g_flFractionScale, vPos );
    UTIL_SetOrigin( pPlayer, vPos, true );

    if ( sv_unlag_debug.GetBool() )
     DevMsg( " restore got most of the way\n" );
   }
  }
  else
  {
   // Cool, the player can go back to whence he came.
   UTIL_SetOrigin( pPlayer, tr.endpos, true );
  }
}


В общем смысл в том, что нужно придумать функцию(например в каком-нибудь weapon'e или в самом gamemovement) Что бы при нажатии горячей клавиши нас кидало в нужную точку.
А чтобы высчитывать координаты для телепорта, я капаюсь в лазерном указателе RPG. Думаю там можно найти ответ.
Фух.Вроде всё. Кто в силах - помагайте smile
 
HitmenДата: Вторник, 14.02.2012, 15:08 | Сообщение # 2
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
Пушку-телепортатор из OF делать задумал, злодей? happy

Туториалы по программированию, мои и слегка изменённые чужие. :)

Sp@ce Project Blog
Sp@ce Project Web-Site

I'm in spaaace!
Я в контакте
Я в Facebook'е

 
Dark_AlexДата: Вторник, 14.02.2012, 20:45 | Сообщение # 3
Combat medic
Группа: Проверенные
Сообщений: 36
Репутация: 16
Статус: Offline
Hitmen, нее,это будет не ствол по сути. Объясню в общем если интересно
 
HellMapperДата: Пятница, 17.02.2012, 21:45 | Сообщение # 4
Scout
Группа: Проверенные
Сообщений: 588
Репутация: 27
Статус: Offline
А чем консольная команда не устраивает?
Code
setpos 0 0 0


Я живу в будущем City 15







Если Вы можете, играя в "Counter-Strike: Sourсe", посадить хедшот ножом через стену в попу своему противнику, который находится на другом конце карты, на другом сервере, и который играет в "Team Fortress 2" и находится под действием убер-заряда, то знайте, что в плане читерства вы достигли совершенства. ©IPa
 
Dark_AlexДата: Суббота, 18.02.2012, 15:08 | Сообщение # 5
Combat medic
Группа: Проверенные
Сообщений: 36
Репутация: 16
Статус: Offline
HellMapper, а как я буду задавать координаты в setPos в зависимости от ого куда направлен взгляд игрока?

Добавлено (18.02.2012, 14:59)
---------------------------------------------
Хотя. Предполагаю как. Изложи свою мысль по подробнее, в коде походу будет типо как

Code
CBasePlayer *pPlayer = player;
  if ( !pPlayer )
    return; //Always validate a pointer
   
//Подготовка векторов и трассов
trace_t tr;
Vector vecAbsStart, vecAbsEnd, vecDir;
   
//Получаем углы
AngleVectors( pPlayer->EyeAngles(), &vecDir );
   
//Начало/Конец
vecAbsStart = pPlayer->EyePosition();
vecAbsEnd = vecAbsStart + (vecDir * MAX_TRACE_LENGTH);
   
//Делаем трассировку
UTIL_TraceLine( vecAbsStart, vecAbsEnd, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
   
//Do something with the end results
if ( tr.m_pEnt )
{
     if ( tr.m_pEnt )
     {
   SetPosition( &tr, true );
     }

Добавлено (18.02.2012, 15:08)
---------------------------------------------
В общем проблема такая. Не могу нормально кинуть трассу. Так что на примере выше, не может конвертировать значения в координаты игрока.

 
HellMapperДата: Суббота, 18.02.2012, 15:21 | Сообщение # 6
Scout
Группа: Проверенные
Сообщений: 588
Репутация: 27
Статус: Offline
Setpos к тому, что его код можно вычленить из сипипи файла и присобачить к тому месту, где ты будешь проводить trace_line в своем оружии и его значения подставлять в Setpos функцию.

Я живу в будущем City 15







Если Вы можете, играя в "Counter-Strike: Sourсe", посадить хедшот ножом через стену в попу своему противнику, который находится на другом конце карты, на другом сервере, и который играет в "Team Fortress 2" и находится под действием убер-заряда, то знайте, что в плане читерства вы достигли совершенства. ©IPa
 
HitmenДата: Суббота, 18.02.2012, 20:27 | Сообщение # 7
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
Dark_Alex, Никто не отменял возможности рассчёта точки в которую смотрит игрок smile Как уже отметил HellMapper, это делается трейсером или же CTRL+F в руки и Setpos ищи по всему решению. Скорее всего далеко не залез.

Туториалы по программированию, мои и слегка изменённые чужие. :)

Sp@ce Project Blog
Sp@ce Project Web-Site

I'm in spaaace!
Я в контакте
Я в Facebook'е

 
StriderДата: Воскресенье, 19.02.2012, 04:36 | Сообщение # 8
Spy
Группа: Проверенные
Сообщений: 1465
Репутация: 51
Статус: Offline
Вы что, правда слепые? :3
Он трассу кинуть не может, а не телепортировать. Сетпоз по координатам же.
 
HitmenДата: Воскресенье, 19.02.2012, 14:39 | Сообщение # 9
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
Strider, and? В чём беда? Рассчитать положение конечной точки в мире, на момент выполнения команды и всё.

Туториалы по программированию, мои и слегка изменённые чужие. :)

Sp@ce Project Blog
Sp@ce Project Web-Site

I'm in spaaace!
Я в контакте
Я в Facebook'е

 
Dark_AlexДата: Пятница, 17.08.2012, 05:50 | Сообщение # 10
Combat medic
Группа: Проверенные
Сообщений: 36
Репутация: 16
Статус: Offline
Готово. Отлично работает. Закрывайте тему cool
 
  • Страница 1 из 1
  • 1
Поиск:

Помощь в разработке форума: HOMiE7