Помощь с добавлением правила в код olympiad_operator | Это возможно?

Spacex

Последний из атеистов
Пользователь
Сообщения
27
Розыгрыши
0
Репутация
0
Реакции
2
Баллы
825
Это мой текущий код для olympiad_operator.

Хочу добавить правило, чтобы персонаж мог быть вызван только если он жив и у него в инвентаре менее 80 предметов.

Это возможно сделать напрямую в ИИ? Кто-нибудь может мне помочь?


Код:
class 1 olympiad_operator_basic : citizen
{
handler:
  EventHandler TALKED( talker )
  {
    if( talker.nobless_type == @NOBLESS_ACTIVE )
    {
      myself::ShowPage( talker, "olympiad_operator001.htm" );
    }
    else
    {
      myself::ShowPage( talker, "olympiad_operator002.htm" );
    }
  }

  EventHandler MENU_SELECTED( talker, ask, reply, fhtml0, i0, s0, s1 )
  {
    if( ask == -50 )
    {
      if( talker.nobless_type == @NOBLESS_ACTIVE )
      {
        myself::ShowPage( talker, "olympiad_operator001.htm" );
      }
      else
      {
        myself::ShowPage( talker, "olympiad_operator002.htm" );
      }
    }
    else if( ask == -51 )
    {
      myself::ShowPage( talker, "olympiad_operator010.htm" );
    }
    else if( ask == -52 )
    {
      switch( reply )
      {
        case 0:
        {
          myself::ShowPage( talker, "olympiad_operator001.htm" );
          break;
        }
        case 1:
        {
          if( gg::GetDateTime( 0, @DTF_HOUR ) >= 23 &&
              gg::GetDateTime( 0, @DTF_MIN ) >= 50 )
          {
            myself::ShowPage( talker, "olympiad_operator010k.htm" );
          }
          else
          {
            myself::ShowPage( talker, "olympiad_operator010a.htm" );
          }
          break;
        }
        case 2:
        {
          if( gg::GetDateTime( 0, @DTF_HOUR ) >= 23 &&
              gg::GetDateTime( 0, @DTF_MIN ) >= 50 )
          {
            myself::ShowPage( talker, "olympiad_operator010k.htm" );
          }
          else
          {
            myself::ShowPage( talker, "olympiad_operator010b.htm" );
          }
          break;
        }
        case 3:
        {
          myself::FHTML_SetFileName( fhtml0, "olympiad_operator010f.htm" );
          i0 = myself::GetOlympiadWaitingCount();
          if( i0 < 100 )
          {
            myself::FHTML_SetStr( fhtml0, "WaitingCount",
                                  myself::MakeFString( 1000504, "100", "", "", "", "" ) );
          }
          else
          {
            myself::FHTML_SetStr( fhtml0, "WaitingCount",
                                  myself::MakeFString( 1000505, "100", "", "", "", "" ) );
          }
          i0 = myself::GetClassFreeOlympiadWaitingCount();
          if( i0 < 100 )
          {
            myself::FHTML_SetStr( fhtml0, "WaitingCount",
                                  myself::MakeFString( 1000504, "100", "", "", "", "" ) );
          }
          else
          {
            myself::FHTML_SetStr( fhtml0, "WaitingCount",
                                  myself::MakeFString( 1000505, "100", "", "", "", "" ) );
          }
          myself::ShowFHTML( talker, fhtml0 );
          break;
        }
        case 4:
        {
          myself::ShowPage( talker, "olympiad_operator010g.htm" );
          break;
        }
        case 5:
        {
          myself::FHTML_SetFileName( fhtml0, "olympiad_operator010h.htm" );
          myself::FHTML_SetInt( fhtml0, "WaitingCount",
                                myself::GetOlympiadPoint( talker ) );
          myself::ShowFHTML( talker, fhtml0 );
        }
      }
    }
    else if( ask == -53 )
    {
      if( reply == 0 )
      {
        myself::ShowPage( talker, "olympiad_operator001.htm" );
      }
      else if( reply == 1 )
      {
        if( myself::IsMainClass( talker ) == 1 )
        {
          if( myself::IsInCategory( @fourth_class_group, talker.occupation ) )
          {
            if( myself::GetOlympiadPoint( talker ) > 0 )
            {
              myself::AddClassFreeOlympiad( talker );
            }
            else
            {
              myself::ShowPage( talker, "olympiad_operator010i.htm" );
            }
          }
          else
          {
            myself::ShowPage( talker, "olympiad_operator010j.htm" );
          }
        }
        else
        {
          myself::ShowPage( talker, "olympiad_operator010c.htm" );
        }
      }
    }
    else if( ask == -54 )
    {
      if( reply == 0 )
      {
        myself::ShowPage( talker, "olympiad_operator001.htm" );
      }
      else if( reply == 1 )
      {
        if( myself::IsMainClass( talker ) == 1 )
        {
          if( myself::OwnItemCount( talker, 999 ) >= 10 )
          {
            if( myself::OwnItemCount( talker, 9878 ) >= 1 )
            {
              if( myself::IsInCategory( @fourth_class_group, talker.occupation ) )
              {
                if( myself::GetOlympiadPoint( talker ) > 0 )
                {
                  myself::AddOlympiad( talker );
                }
                myself::DeleteItem1( talker, 999, 10 );
              }
              else
              {
                myself::ShowPage( talker, "olympiad_operator010j.htm" );
              }
            }
          }
        }
        else
        {
          myself::ShowPage( talker, "olympiad_operator010c.htm" );
        }
      }
    }
    else if( ask == -55 )
    {
      myself::ShowPage( talker, "olympiad_operator030.htm" );
    }
    else if( ask == -56 )
    {
    }
    else if( ask == -57 )
    {
    }
    else if( ask == -58 )
    {
      myself::RemoveOlympiad( talker );
    }
    else if( ask == -59 )
    {
      myself::FHTML_SetFileName( fhtml0, "olympiad_operator020.htm" );
      for( i0 = 1; i0 <= 22; i0 = i0 + 1 )
      {
        s0 = "";
        s1 = "";
        myself::FHTML_SetInt( fhtml0, "FI" + i0, i0 );
        if( myself::GetStatusForOlympiadField( i0 ) == 0 )
        {
          myself::FHTML_SetStr( fhtml0, "Status" + i0, "&$906;" );
        }
        else
        {
          s0 = "&$829;" + "&nbsp;&nbsp;&nbsp;" + myself::GetPlayer1ForOlympiadField( i0 ) + "&nbsp; : &nbsp;" + myself::GetPlayer2ForOlympiadField( i0 );
          myself::FHTML_SetStr( fhtml0, "Status" + i0, s0 );
        }
      }
      myself::ShowFHTML( talker, fhtml0 );
    }
    else if( ask == -60 )
    {
      if( reply == 0 )
      {
        if( talker.nobless_type == @NOBLESS_ACTIVE )
        {
          myself::ShowPage( talker, "olympiad_operator001.htm" );
        }
        else
        {
          myself::ShowPage( talker, "olympiad_operator002.htm" );
        }
      }
    }
    else if( ask == -61 )
    {
      myself::ShowPage( talker, "olympiad_operator020.htm" );
    }
    else if( ask == -70 )
    {
      if( reply == 0 )
      {
        myself::ShowPage( talker, "olympiad_operator001.htm" );
      }
      else if( reply == 1 )
      {
        if( myself::GetPreviousOlympiadPoint( talker ) == 0 )
        {
          myself::ShowPage( talker, "olympiad_operator031a.htm" );
        }
        else if( myself::GetPreviousOlympiadPoint( talker ) < 40 )
        {
          if( talker.hero_type == @HERO_WAITING ||
              talker.hero_type == @HERO_ACTIVE )
          {
            myself::ShowPage( talker, "olympiad_operator031.htm" );
          }
          else
          {
            myself::ShowPage( talker, "olympiad_operator031a.htm" );
          }
        }
        else
        {
          myself::ShowPage( talker, "olympiad_operator031.htm" );
        }
      }
      else if( reply == 513 )
      {
        myself::ShowMultisell( reply, talker );
      }
    }
    else if( ask == -71 )
    {
      if( reply == 0 )
      {
        myself::ShowPage( talker, "olympiad_operator030.htm" );
      }
      else if( reply == 1 )
      {
        myself::DeletePreviousOlympiadPoint( talker,
                                             myself::GetPreviousOlympiadPoint( talker ) );
      }
    }
    else if( ask == -80 )
    {
    }
    else if( ask == -110 )
    {
      myself::FHTML_SetFileName( fhtml0, "olympiad_operator_rank_class.htm" );
      for( i0 = 1; i0 <= 15; i0 = i0 + 1 )
      {
        if( myself::GetRankByOlympiadRankOrder( reply, i0 ) == 0 )
        {
          break;
        }
        myself::FHTML_SetInt( fhtml0, "Rank" + i0,
                              myself::GetRankByOlympiadRankOrder( reply, i0 ) );
        myself::FHTML_SetStr( fhtml0, "Name" + i0,
                              myself::GetNameByOlympiadRankOrder( reply, i0 ) );
      }
      myself::ShowFHTML( talker, fhtml0 );
    }
    else if( ask == -130 )
    {
      myself::ObserveOlympiad( talker, reply );
    }
  }

  EventHandler DELETE_PREVIOUS_OLYMPIAD_POINT_RETURNED( talker, ask, reply, i0, i1 )
  {
    i1 = 0;
    if( reply != 0 )
    {
      if( talker.hero_type == @HERO_WAITING ||
          talker.hero_type == @HERO_ACTIVE )
      {
        i1 = 100;
      }
      if( ask > 2000 )
      {
        i0 = ( 2000 + i1 ) * 1000;
      }
      else if( ask < 40 )
      {
        i0 = i1 * 1000;
      }
      else
      {
        i0 = ( ask + i1 ) * 1000;
      }
      myself::AddLogEx( 1, talker, ask, i0 );
      myself::GiveItem1( talker, 6651, i0 );
    }
  }
}
 

Добрый день, да, ищите аск который выводит на регистрацию, и вставляете условие перед регистрацией
C++:
#Если игрок жив и инвентарь забит менее 80:
if( talker.alive && myself::GetInventoryInfo( talker, 0 ) >= myself::GetInventoryInfo( talker, 1 ) * 0.800000 )
 
Добрый день, да, ищите аск который выводит на регистрацию, и вставляете условие перед регистрацией
C++:
#Если игрок жив и инвентарь забит менее 80:
if( talker.alive && myself::GetInventoryInfo( talker, 0 ) >= myself::GetInventoryInfo( talker, 1 ) * 0.800000 )
А если он забил инвентарь или умер уже после того, как обратился в аск\репли? Тут нужна непосредственная проверка перед отправкой на стадион, но т.к. формирует арены и телепортирует именно движок - значит через АИ никак.



Если речь о чём то типа адвекст, или том, на чём он основан - должны быть хоть какие то конфиги в женералсеттингс.

; Defines de Maximum Allowed Inventory Limit to Join An Olympiad Match
MAX_INVENTORY_LIMIT=80.0

Насчёт жив\мёртв предположу, что двигло и само учитывает такие кейзы, ибо трупов на олимпиаде я никогда не видел.
 
А если он забил инвентарь или умер уже после того, как обратился в аск\репли? Тут нужна непосредственная проверка перед отправкой на стадион, но т.к. формирует арены и телепортирует именно движок - значит через АИ никак.
Все верно, я ему предоставил вариант через АИ, как он просил. если более глубокие условия делать, естественно экст. Но человек просит через АИ, я так пологаю, у него нету исходника екста, либо экста вовсе.
 
  • Мне нравится
Реакции: kick
перегружают обычно же что б хп регена было меньше разве нет? как тогда дестры?
 
Да, большая проблема в том, что действительно, все действия происходят после регистрации, а проверку нужно было бы делать после регистрации и до момента вызова на Олимпиаду.Я использую стандартный вариант, без расширений.Так что, похоже, нет другого способа, кроме как поработать с исходным кодом, используя расширение, верно?
 
все верно, ищите функцию

C++:
bool User::CanRegisterAtOlympiad(User *this)
{
  return WOlympiadUser::CanRegister(this->m_pWOlympiadUser);
}

перехватываете её вызов на свою, с кодом ваших проверок.

P.S пример из классик 162
 
  • Мне нравится
Реакции: kick
Это пофикшено на С5+ ритейл сборке, но раз у вас не пофикшено, я подозреваю, что у вас С4. для С4, умеет фиксить это.
 

Похожие темы

Назад
Сверху Снизу