2013-09-25 2 views
2

Crysis Wars에 대한 공개 서버를 처음 수정하고 아무도 내 코드를 훔치지 않도록하기 위해 C++ 기반 DLL (가능한 Lua가 있음) 내에 최대한 많은 것을 넣고 있습니다. 이렇게하려면 DLL에 명령을 넣어야하는데 그 중 일부는 추가 변수가 필요합니다. 다음은 예입니다!메시지에서 문자열 가져 오기

금지 [플레이어 이름] [시간] [이유]

어떻게 다른 문자 길이가 모두, 변수는 PLAYERNAME 시간과 이유를 검색 가겠어요? 이유 변수에는 선택해야하는 단어가 두 개 이상일 수 있습니다 (예 : '불쾌감을주는 메시지와 부정 행위').

루아에서 이것은 간단한 'string.match'로 끝납니다; 나는 루아에서 메시지 정렬을 항상 할 수 있고 C++로 되돌려 보낼 수 있다고 생각하지만, 이것은 전체 chatcommand 시스템을 dis-organize시킬 수 있습니다.

'const char * msg'에서 변수를 추출해야하는데,이 변수는 전송 된 모든 메시지에 대해 시스템에 의해 분석됩니다. 이미 명령 메시지 ('!'로 시작하는 명령 메시지)를 분석합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

예 : 금지 콘 (5) 스팸 -이 5 분

의 선수 'Confl CT!'을 (이미 부분적인 이름을 식별 할 수있는 부분 스캔 코드가) 시작된다! ! 금지 콘 스팸 -이 영구적으로 플레이어를 금지한다 '! Confl CT'

+0

"어떻게 다시 가겠어요 trieving 변수 playername, 시간 및 이유 "나는 그것을 얻지 못합니다. 다른 단어로 다시 물어보십시오. –

+0

chat :: match 또는 이와 비슷한 방법으로 chatmessage에서 이러한 변수를 추출하는 방법은 무엇입니까? 나는 원래의 포스트를 정보로 업데이트 할 것이다. 지적 해 주셔서 감사합니다! :) – cybermonkey

+0

게임이 스크립팅을 위해 루아를 사용한다면, 누군가 당신의 코드를 훔치려 고 시도한다면 왜 신경을 쓸 것입니까? 당신이하고있는 일은 내가 볼 수있는 콘솔 명령에 대한 래퍼를 만드는 것입니다. –

답변

0

여기하는 방법은 정규 표현식, 일명 정규식을 사용하는 것입니다. C++는 정규 표현식을 포함하지 않는

#include <stdlib.h> 
#include <string> 
#include <iostream> 
#include <pme.h> 

int main() 
{ 
    std::string txt="!ban command variables"; 

    std::string re1=".*?"; // Non-greedy match on filler 
    std::string re2="((?:[a-z][a-z]+))"; // Word 1 
    std::string re3=".*?"; // Non-greedy match on filler 
    std::string re4="((?:[a-z][a-z]+))"; // Word 2 
    std::string re5=".*?"; // Non-greedy match on filler 
    std::string re6="((?:[a-z][a-z]+))"; // Word 3 

    PME re(re1+re2+re3+re4+re5+re6,"gims"); 
    int n; 
    if ((n=re.match(txt))>0) 
    { 
     std::string word1=re[1].c_str(); 
     std::string word2=re[2].c_str(); 
     std::string word3=re[3].c_str(); 
     std::cout << "("<<word1<<")"<<"("<<word2<<")"<<"("<<word3<<")"<< std::endl; 
    } 
} 

이 코드는이 라이브러리를 필요 아래와 같이 내가 그들을 smartening, 나의 오래된 질문을 통해가는 때, 나는 빨리, 빠른 정규식 조리법을 요리하는 txt2re을 사용 기본적으로 기능 :