Advertisement
zzz2009

@playerid to Player Name

Oct 15th, 2020
2,840
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 2.82 KB | None | 0 0
  1. //
  2. // Substitutes "@playerid" to Player Name
  3. //
  4. // (c) 2020 Qoo. All rights reserved.
  5. //
  6.  
  7. // 이건 선택 사항
  8. // 안써도 됨
  9. new g_player_name[MAX_PLAYERS][MAX_PLAYER_NAME];
  10.  
  11. public OnPlayerText(playerid, text[])
  12. {
  13.     new message[145];
  14.  
  15.     format(message, sizeof(message), "%s: ", g_player_name[playerid]);
  16.     // 시작 위치는 "본인 닉네임: " 부분을 건너 뛴 부분부터
  17.     SubstituteIDToName(text, message, strlen(message) - 1);
  18.  
  19.     // ...
  20.  
  21.     // Ex)
  22.     // SendClientMessageToAll(message, 0xFFFFFFFF);
  23.     return 1;
  24. }
  25.  
  26. public OnPlayerConnect(playerid)
  27. {
  28.     GetPlayerName(playerid, g_player_name[playerid], sizeof(g_player_name[]));
  29.     return 1;
  30. }
  31.  
  32. // @playerid 형식의 문자열을 해당 player의 닉네임으로 치환
  33. // 다중 치환을 지원함
  34. //
  35. // src[]        원본 텍스트
  36. // dst[]        최종 결과물을 저장할 문자열
  37. // dst_start    결과물을 저장할 문자열에 쓰기 시작하는 위치
  38. //              만약 처음부터 바로 결과물을 저장할 것이라면 0을 주면 됨.
  39. //              잘 모르겠다면, 호출 전 `strlen(결과물을 저장할 문자열) - 1`
  40. // size         결과물을 저장할 문자열의 배열 길이
  41. stock SubstituteIDToName(const src[], dst[], dst_start, size = sizeof(dst))
  42. {
  43.     const MAX_NUMBER_SIZE = 11;
  44.     new src_pos = 0;
  45.     new dst_pos = dst_start;
  46.     new cur_char = '\0';
  47.     new tmp;
  48.     new target[MAX_PLAYER_NAME];
  49.     new targetid;
  50.  
  51.     while (size > dst_pos && '\0' != src[src_pos])
  52.     {
  53.         cur_char = src[src_pos];
  54.  
  55.         if ('@' == cur_char)
  56.         {
  57.             ++src_pos;
  58.             if ('\0' == src[src_pos])
  59.             {
  60.                 --src_pos;
  61.                 goto skip;
  62.             }
  63.            
  64.             tmp = GetNumerics(src[src_pos], target, size);
  65.             if (0 == tmp)
  66.             {
  67.                 --src_pos;
  68.                 goto skip;
  69.             }
  70.  
  71.             if (MAX_NUMBER_SIZE < tmp)
  72.                 tmp = MAX_NUMBER_SIZE;
  73.            
  74.             targetid = strval(target);
  75.             if (!IsPlayerConnected(playerid))
  76.             {
  77.                 --src_pos;
  78.                 goto skip;
  79.             }
  80.  
  81.             src_pos += tmp;
  82.  
  83.             // 이 반복문을 제거하고 GetPlayerName으로 바꾸려면,
  84.             //
  85.             // GetPlayerName(targetid, target, sizeof(target));
  86.             // for (tmp = 0; '\0' != target[tmp]; ++tmp)
  87.             // {
  88.             //  if (dst_pos >= size)
  89.             //      goto skip;
  90.             // 
  91.             //  dst[dst_pos++] = target[tmp];
  92.             // }
  93.             //
  94.             // 이렇게 하면 될 듯
  95.             for (tmp = 0; '\0' != g_player_name[targetid][tmp]; ++tmp)
  96.             {
  97.                 if (dst_pos >= size)
  98.                     goto skip;
  99.                
  100.                 dst[dst_pos++] = g_player_name[targetid][tmp];
  101.             }
  102.            
  103.             continue;
  104.         }
  105.  
  106. skip:
  107.         if (size <= dst_pos)
  108.             break;
  109.        
  110.         dst[dst_pos++] = src[src_pos++];
  111.     }
  112.  
  113.     if (size > dst_pos)
  114.         dst[dst_pos] = '\0';
  115. }
  116.  
  117. stock GetNumerics(const src[], dst[], size = sizeof(dst))
  118. {
  119.     new i = 0;
  120.    
  121.     for (; i < size; ++i)
  122.     {
  123.         if (!IsNum(src[i]))
  124.         {
  125.             dst[i] = '\0';
  126.             break;
  127.         }
  128.        
  129.         dst[i] = src[i];
  130.     }
  131.  
  132.     return i;
  133. }
  134.  
  135. stock IsNum(c)
  136. {
  137.     return (c >= '0' && c <= '9');
  138. }
  139.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement