Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Substitutes "@playerid" to Player Name
- //
- // (c) 2020 Qoo. All rights reserved.
- //
- // 이건 선택 사항
- // 안써도 됨
- new g_player_name[MAX_PLAYERS][MAX_PLAYER_NAME];
- public OnPlayerText(playerid, text[])
- {
- new message[145];
- format(message, sizeof(message), "%s: ", g_player_name[playerid]);
- // 시작 위치는 "본인 닉네임: " 부분을 건너 뛴 부분부터
- SubstituteIDToName(text, message, strlen(message) - 1);
- // ...
- // Ex)
- // SendClientMessageToAll(message, 0xFFFFFFFF);
- return 1;
- }
- public OnPlayerConnect(playerid)
- {
- GetPlayerName(playerid, g_player_name[playerid], sizeof(g_player_name[]));
- return 1;
- }
- // @playerid 형식의 문자열을 해당 player의 닉네임으로 치환
- // 다중 치환을 지원함
- //
- // src[] 원본 텍스트
- // dst[] 최종 결과물을 저장할 문자열
- // dst_start 결과물을 저장할 문자열에 쓰기 시작하는 위치
- // 만약 처음부터 바로 결과물을 저장할 것이라면 0을 주면 됨.
- // 잘 모르겠다면, 호출 전 `strlen(결과물을 저장할 문자열) - 1`
- // size 결과물을 저장할 문자열의 배열 길이
- stock SubstituteIDToName(const src[], dst[], dst_start, size = sizeof(dst))
- {
- const MAX_NUMBER_SIZE = 11;
- new src_pos = 0;
- new dst_pos = dst_start;
- new cur_char = '\0';
- new tmp;
- new target[MAX_PLAYER_NAME];
- new targetid;
- while (size > dst_pos && '\0' != src[src_pos])
- {
- cur_char = src[src_pos];
- if ('@' == cur_char)
- {
- ++src_pos;
- if ('\0' == src[src_pos])
- {
- --src_pos;
- goto skip;
- }
- tmp = GetNumerics(src[src_pos], target, size);
- if (0 == tmp)
- {
- --src_pos;
- goto skip;
- }
- if (MAX_NUMBER_SIZE < tmp)
- tmp = MAX_NUMBER_SIZE;
- targetid = strval(target);
- if (!IsPlayerConnected(playerid))
- {
- --src_pos;
- goto skip;
- }
- src_pos += tmp;
- // 이 반복문을 제거하고 GetPlayerName으로 바꾸려면,
- //
- // GetPlayerName(targetid, target, sizeof(target));
- // for (tmp = 0; '\0' != target[tmp]; ++tmp)
- // {
- // if (dst_pos >= size)
- // goto skip;
- //
- // dst[dst_pos++] = target[tmp];
- // }
- //
- // 이렇게 하면 될 듯
- for (tmp = 0; '\0' != g_player_name[targetid][tmp]; ++tmp)
- {
- if (dst_pos >= size)
- goto skip;
- dst[dst_pos++] = g_player_name[targetid][tmp];
- }
- continue;
- }
- skip:
- if (size <= dst_pos)
- break;
- dst[dst_pos++] = src[src_pos++];
- }
- if (size > dst_pos)
- dst[dst_pos] = '\0';
- }
- stock GetNumerics(const src[], dst[], size = sizeof(dst))
- {
- new i = 0;
- for (; i < size; ++i)
- {
- if (!IsNum(src[i]))
- {
- dst[i] = '\0';
- break;
- }
- dst[i] = src[i];
- }
- return i;
- }
- stock IsNum(c)
- {
- return (c >= '0' && c <= '9');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement