Добро пожаловать на форум, Гость, это ваша панель
  • Страница 1 из 1
  • 1
помогите с меню
aelrond
Дата: Вторник, 11.10.2016, 21:37 | Сообщение # 1
офлайн

  • Сообщения: 29
  • Награды: 0
  • Замечания:
 
Всем привет! Smaster, можешь подсказать, как переделать старое меню в новое в данном случае?
речь идёт о меню прокачки скилов.

Вот оригинальный код:

Код
public MENU_SelectSkill( idUser )
{
   if(p_data[idUser][P_RACE] == 0)return;

   new iSkillsUsed = SM_TotalSkillPointsUsed(idUser);
   
   if (iSkillsUsed >= p_data[idUser][P_LEVEL])return;
   
   new szSkillName[64];
   new iSkillCounter = 0, iSkillID = 0, iSkillLevel;

   iSkillID = SM_GetSkillByPos(idUser, iSkillCounter);

   while (iSkillID != -1)
   {
      iSkillLevel = SM_GetSkillLevel(idUser, iSkillID, 4);
      LANG_GetSkillName( iSkillID , idUser, szSkillName, 63, 1 );

      if (SM_GetSkillType( iSkillID ) == SKILL_TYPE_TRAINABLE )
      {
         if (iSkillLevel < MAX_SKILL_LEVEL)
         {
            if (p_data[idUser][P_LEVEL] <= 2 * iSkillLevel )pos += formatex( szMsg[pos], charsmax(szMsg)-pos, "\d");
            else iKeys |= (1<<iSkillCounter);
            pos += formatex( szMsg[pos], charsmax(szMsg)-pos, "^n%d. %s %L %d\w", iSkillCounter+1, szSkillName, LANG_PLAYER, "WORD_LEVEL", iSkillLevel + 1 );
            
            new str[10]; num_to_str(iSkillCounter+1,str,10);
            formatex(szMenuMulti,255, "\w%s %L %d", szSkillName, LANG_PLAYER, "WORD_LEVEL", iSkillLevel + 1); 
            menu_additem(menu,szMenuMulti,str);
         }
      }
      else if ( SM_GetSkillType( iSkillID ) == SKILL_TYPE_ULTIMATE)
      {
         if ( iSkillLevel < MAX_ULTIMATE_LEVEL )
         {
            if ( p_data[idUser][P_LEVEL] <= 5 )pos += formatex( szMsg[pos], charsmax(szMsg)-pos, "\d" );
            else iKeys |= (1<<iSkillCounter);
            pos += formatex( szMsg[pos], charsmax(szMsg)-pos, "^n%d. %L: %s\w", iSkillCounter+1, LANG_PLAYER, "WORD_ULTIMATE", szSkillName );
         }
      }
      iSkillCounter++;
      iSkillID = SM_GetSkillByPos( idUser, iSkillCounter );
   }
   pos += formatex( szMsg[pos], charsmax(szMsg)-pos, "^n^n\d0. %L", LANG_PLAYER, "WORD_CANCEL" );
   show_menu( idUser, iKeys, szMsg, -1 );
   return;
}

public _MENU_SelectSkill( idUser, iKey )
{

   if (iKey == 9 )return PLUGIN_HANDLED;
   new iSkillID = SM_GetSkillByPos( idUser, iKey );
   SM_SetSkill( idUser, iSkillID );
   new iSkillsUsed = SM_TotalSkillPointsUsed( idUser );
   if ( iSkillsUsed < p_data[idUser][P_LEVEL] )MENU_SelectSkill( idUser );
   else WC3_ShowBar( idUser );
   return PLUGIN_HANDLED;
}


а вот мой код. суть в том, что если зайти на сервер, первый раз выбрать расу, то это меню появляется без ошибок (стартовый уровень 10 из 31)
Но если сбросить скилы или получить новый уровень - меню появляется с ошибкой и роняет сервер, даже если прописан debug.

Код
public MENU_SelectSkill(idUser)
{
   if (p_data[idUser][P_RACE] > 0)
   {
      new iSkillsUsed = SM_TotalSkillPointsUsed(idUser);
      if (iSkillsUsed < p_data[idUser][P_LEVEL])
      {
         new szMenuMulti[256];
         formatex(szMenuMulti,255,"%L",idUser, "MENU_SELECT_SKILL");
         new menu = menu_create(szMenuMulti,"HANDLER_SELECT_SKILL");
         
         new szSkillName[64];
         new iSkillCounter = 0, iSkillID = 0, iSkillLevel;
         iSkillID = SM_GetSkillByPos( idUser, iSkillCounter );

         while (iSkillID != -1)
         {
            iSkillLevel = SM_GetSkillLevel(idUser, iSkillID,4);
            LANG_GetSkillName( iSkillID , idUser, szSkillName, 63, 1);
            
            // Add the trainable skills to the menu
            if (SM_GetSkillType(iSkillID) == SKILL_TYPE_TRAINABLE)
            {
               if (iSkillLevel < MAX_SKILL_LEVEL)
               {
                  new str[10]; num_to_str(iSkillCounter+1,str,10);
                  formatex(szMenuMulti,255, "\w%s %L %d", szSkillName, LANG_PLAYER, "WORD_LEVEL", iSkillLevel + 1); 
                  menu_additem(menu,szMenuMulti,str);
               }
            }
            
            else if (SM_GetSkillType( iSkillID ) == SKILL_TYPE_ULTIMATE)
            {
               if(iSkillLevel < MAX_ULTIMATE_LEVEL)
               {
                  new str[10]; num_to_str(iSkillCounter+1,str,10);
                  
                  formatex(szMenuMulti,255, "%L: %s", LANG_PLAYER, "WORD_ULTIMATE", szSkillName); 
                  menu_additem(menu,szMenuMulti,str);         
               }
            }

            iSkillCounter++;
            iSkillID = SM_GetSkillByPos(idUser, iSkillCounter);
         }
         menu_setprop(menu,MPROP_PERPAGE,0);
         menu_display(idUser,menu,0);
         return;
      }
   }
}

public HANDLER_SELECT_SKILL(idUser,menu,item)
{
   new s_Data[6], s_Name[64], i_Access, i_Callback;
   menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback);
   new i_Key = str_to_num(s_Data);
   
   new iSkillID = SM_GetSkillByPos(idUser, i_Key-1);
   
   SM_SetSkill(idUser, iSkillID);
   new iSkillsUsed = SM_TotalSkillPointsUsed( idUser );
   if(iSkillsUsed < p_data[idUser][P_LEVEL])MENU_SelectSkill( idUser );
   else WC3_ShowBar(idUser);
   return PLUGIN_HANDLED;
}
 
siminenkoigor
Дата: Среда, 25.10.2023, 09:34 | Сообщение # 2
офлайн

  • Сообщения: 5
  • Награды: 0
  • Замечания:
 
как переделать старое меню в новое в данном случае?
 
  • Страница 1 из 1
  • 1
Поиск: