[hanlp]이동이나 특정 행동을 많이 요청할 때 버벅거림을 없애려면?
	
		 탈퇴
		
		2,271
		0
		0
		2004-01-20 05:00:38
		탈퇴
		
		2,271
		0
		0
		2004-01-20 05:00:38
	 
	
		
	
	
	
	
	
 
	
		8Comments
	
			
							
				
					
						MaGuN
						2004.01.20(화) 오후 03:33:28
					
					
				 
				  사실 공개적인 게임에서 1번 방식을 선택한다면 한 사람이 수백개의 명령을 실행하는 동안
다른 사람은 렉이 걸리거나 명령자체가 실행이 되지 않을수가 있습니다.
수십명또는 수백명의 사용자들이 접속해서 게임을 하는데.. 한 사람드로 인해서 많은 사람들이
불편해 질 수가 있습니다.
원래 LP머드의 특성중의 하나는 머드 엔진 자체에 일정한 evaluaction cost를 두고.. 있습니다.
이것은 한 하트비트에 실행할수 있는 cost를 제한 하는것으로..
게임의 운영진 레벨을 가진 사람이 <명령> 명령체크 라고 치면 명령이 얼마나 많은 evalu cost를
쓰는이 알수 있으며, 이런 evalu cost를 제한함으로 인해서 수 많은 명령의 입력과 처리를 위해서
머드 엔진에서 걸리는 과부하와 렉을 줄일수 있도록 한 것입니다.
되도록이면 두번째 방법을 선택하는것이 좋을듯 합니다.
							
					 
				
							
				
					
						MaGuN
						2004.01.20(화) 오후 03:44:56
					
					
				 
				  두번째 방법 처럼 어느정도의 명령만 수행하고 이후의 것은 무시 되도록 하려면
1. user.c의 heart_beat() 함수에 set_temp("입력제한",20); 을 넣습니다.
2. user.c의 cmd_hook() 함수의 루틴중 앞에 부분에서  this_object()의
    query_temp("입력제한") 을 검색해서 만약 수치가 1보다 작다면 return 0;
    을 시킵니다.
    그리고 cmd_hook()함수에서 return foo; 의 바로 윗줄 들에서
    set_temp("입력제한",query_temp("입력제한")-1);
    과 같은 형식으로 넣어 주면 됩니다.
    이외에도 여러가지 방법이 있겠습니다만...
    어떤 방법이 코딩하기에 편리한지, 또는 머드를 관리하기에 편리한지를 따져보고
    코딩을 하시면 될것 같습니다. ^^
       
							
					 
				
							
				
					
						탈퇴
						2004.01.20(화) 오후 09:44:29(220.88.xxx.xx)
					
					
				 
				  여기도 먼저 답변에 대해 감사드리며, 꾸버벅~~ 아울러 ^^;; 에러에 대한 고찰을 ㅠㅠ;;
요거는 에러는 안 나는데 먹히지가 않네요..
nomask static int cmd_hook(string cmd) {
 string file, verb;
 object env;
 int foo, tmp;
 verb = query_verb();
 env = environment();
 if ( this_object()->query_temp("입력제한") < 1 ) return 0;
 if (env && env->valid_exit(verb)) {
  if( tmp < 0 ) return 0;
  return go_exit(verb, env);
 }
 file = (string)CMD_D->find_cmd(verb, explode(query("경로"), ":"));
 set_temp("입력제한",query_temp("입력제한")-1);
 if (file && file != "") {
  if( tmp < 0 ) return 0;
  foo = (int)call_other(file, "cmd", cmd);
  if( !foo ) foo = (int)call_other(file, "cmd_" + verb, cmd);
  return foo;
 }
 foo = (int)EMOTE_D->parse(verb, cmd);
 if (foo) {
  return foo;
 }
 return 0;
}
void heart_beat() {
 int age;
 delete_temp("지난잡담");
 continue_attack();
 unblock_attack();
 heal_up();
 age = query("나이");
 if (!query_temp("last_age_set")) set_temp("last_age_set", time());
 age += (time() - query_temp("last_age_set"));
 set_temp("last_age_set", time());
 ob_data["나이"] = age;
 set_temp("입력제한",20);
}
어디가 잘못된 걸까요;; 어쩌다 한 번씩 명령이 안 먹히고 '^^;' <--이게 뜰 때도 있긴 한데.. 100개 정도 명령을 입력하면 뚝뚝 끊기면서 원래처럼 됩니당;;
							
					 
				
							
				
					
						탈퇴
						2004.01.20(화) 오후 09:47:19(220.88.xxx.xx)
					
					
				 
				  cmd_hook 함수부분을 아래와 같이 바꾸니(입력제한을 return foo; 바로 윗줄로!) 제한 이후의 명령을 무시하기는 하는데 또 다시 뚝뚝 끊기면서 실행이 됩니다. (제한이 20갠데, 50개의 명령을 입력했다면 20개의 명령이 실행되고 몇 개 무시하고 또 나머지는 명령이 실행이 됩니다.)
nomask static int cmd_hook(string cmd) {
 string file, verb;
 object env;
 int foo, tmp;
 verb = query_verb();
 env = environment();
 if ( this_object()->query_temp("입력제한") < 1 ) return 0;
 if (env && env->valid_exit(verb)) {
  if( tmp < 0 ) return 0;
  return go_exit(verb, env);
 }
 file = (string)CMD_D->find_cmd(verb, explode(query("경로"), ":"));
 if (file && file != "") {
  if( tmp < 0 ) return 0;
  foo = (int)call_other(file, "cmd", cmd);
  if( !foo ) foo = (int)call_other(file, "cmd_" + verb, cmd);
  set_temp("입력제한",query_temp("입력제한")-1);
  return foo;
 }
 foo = (int)EMOTE_D->parse(verb, cmd);
 if (foo) {
  set_temp("입력제한",query_temp("입력제한")-1);
  return foo;
 }
 return 0;
}
							
					 
				
							
				
					
						MaGuN
						2004.01.20(화) 오후 10:05:53
					
					
				 
				  nomask static int cmd_hook(string cmd) {
 string file, verb;
 object env;
 int foo, tmp;
 verb = query_verb();
 env = environment();
  tmp = queyr_temp("입력제한");
  // 입력제한이 1보다 작다면 더 이상의 명령을 수행하지 않는다.
 if ( tmp < 1 ) {
    return 0;
  }
 if (env && env->valid_exit(verb)) {
   set_temp("입력제한",tmp-1);
  return go_exit(verb, env);
 }
 file = (string)CMD_D->find_cmd(verb, explode(query("경로"), ":"));
 if (file && file != "") {
  foo = (int)call_other(file, "cmd", cmd);
  if( !foo ) foo = (int)call_other(file, "cmd_" + verb, cmd);
    if( foo ) {
      set_temp("입력제한",tmp-1);
    return foo;
    }
 }
 foo = (int)EMOTE_D->parse(verb, cmd);
 if (foo) {
    set_temp("입력제한",tmp-1);
  return foo;
 }
 return 0;
}
							
					 
				
							
				
					
						MaGuN
						2004.01.20(화) 오후 10:07:40
					
					
				 
				  void heart_beat() {
 int age;
 delete_temp("지난잡담");
  set_temp("입력제한",20);
 continue_attack();
 unblock_attack();
 heal_up();
 age = query("나이");
 if (!query_temp("last_age_set")) set_temp("last_age_set", time());
 age += (time() - query_temp("last_age_set"));
 set_temp("last_age_set", time());
 ob_data["나이"] = age;
}
							
					 
				
							
				
					
						MaGuN
						2004.01.20(화) 오후 10:08:34
					
					
				 
				  위 두가지 함수를 넣고 나서.. 머드를 리부팅 시키거나..
-R /std/user  갱신 이라고 입력하고..
재 접속하면 적용이 됩니다.
							
					 
				
							
				
					
						탈퇴
						2004.01.21(수) 오전 04:02:49(220.88.xxx.xx)
					
					
				 
				  음.. 이 소스를 적용시켜보았습니다만.. 왜 자꾸 뚝뚝 끊기면서 실행이 될까요.. Hanlp가 뚝뚝 끊기면서까지 실행을 모두 하려고만 하는데.. ㅠㅠ;;아.. 소스까지 주셨는데 잘 못 써먹는 거 같네요..;