디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[정보] [lua]이벤트 추적기 콘솔커맨드 버전

ㅇㅇ(121.137) 2020.08.28 20:35:13
조회 243 추천 2 댓글 2
														

시나리오/모드 제작시 도움이 될만한 커맨드를 만들어왔다.


viewimage.php?id=2bbcd332eac031a9&no=24b0d769e1d32ca73fec86fa11d02831f774ca47ac4dd7dcba669417d0f2c459010ebeb30b50d6c833f85a11b1a296336ec70e1d5f148d192fee4054baf56c0bd87d558d


사용방법은,

밑에 ■ 사이에 있는거 복사해서 그냥 채팅창에 붙여넣고 엔터치면 된다.

블랙리스트 내용만 필요에 따라 수정하면 된다. 의미없이 화면을 뒤덮는 이벤트를 블랙리스트에 넣으면 된다.

메모장에 하나 넣어두고 써.

on_player_changed_position은 타일에서 타일로 이동하거나, 같은 surface내에서 teleport를 쓸 때 발동하더라.

플레이어 이동은 발동조건이랑 내용은 단순한데 불편해서 블랙리스트.

on_entity_damaged도 여기저기서 피해가 발생하고 있을땐 블랙리스트에 넣을만함.

on_selected_entity_changed도 거슬릴때 있더라


세이브가 안되는 무표기 전역변수를 사용하니까 멀티에서는 쓰지말고.

멀티에서 쓰려면 아예 시나리오 파일의 control.lua에 등록해야함.

무표기 전역변수를 쓰고, 이벤트 등록을 커맨드로 변경한건 save가 안되기 때문에,

추적기를 끄는 방법은 단순하게 맵을 저장했다가 다시 불러오는거다.


멀티에서도 쓸 수 있는건 아예 모드로 만들까 생각중임. 그런 모드가 이미 있는지 우선 찾아봐야겠지만.

-------------------------------------


script.on_event 에 사용하는 이벤트만 추적하기 때문에, on_init, on_load, on_configuration_changed, on_nth_tick 같은건 블랙리스트에 없어도 추적을 안한다. 앞에 세개는 게임하는중엔 발동도 안함.

시나리오에서 걸어둔 이벤트 필터를 그대로 살려두기 때문에, 필터가 걸린 이벤트는 조건이 안맞으면 발동을 안할 수 있음. 왜냐면 필터를 풀면 시나리오가 고장날 수도 있어서...

https://lua-api.factorio.com/latest/Event-Filters.html

혹시 추적기를 걸었는데 이벤트가 발생해야하는데 안하는거 같다 그러면 시나리오 안에서 필터를 걸어둔거임. 그럴땐 소스코드 뒤져서 어떤 필터가 걸려있는지 찾아야함.

아니면 필터가 제대로 걸려있는지 테스트하는 목적으로 써도 되고.


모드로 만들면, 현재 돌리고 있는 시나리오, 바닐라의 base 모드 및 기타 모드들의 이벤트 등록은 독립적이라서, 이벤트 필터 관계없이 모니터링 할 수 있을거 같아.

반대로 모드에서 건 필터는 채팅창의 커맨드에서 쓰는거(이벤트가 시나리오 레벨에서 등록됨)랑 관계가 없으니 제작한 모드에서 건 필터가 걸려있는지 확인하는 용도로는 쓸 수 없다.


-------------------------------------


화이트리스트 버전도 필요할까...? 싶은건 좀 그닥인건,

그냥 스크립트 안에다 만들어둔 이벤트 처리 함수에다가 확인용도로 game.print(뭐시기) 한줄 넣으면 되잖아?

밑에 코드 좀만 수정하면 화이트리스트 버전으로 바꿀 수 있을거임. 지우는 용도인 del 함수 고치면 되지.


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


/silent-command
local blacklist = {
'on_tick',
'on_chunk_generated',
'on_player_changed_position',
}
local copy = function(t) local r = {} for k, v in pairs(t) do r[k] = v end return r end
local del = function(t,d) for _, k in pairs(d) do t[k] = nil end return t end
local null_to_name = function(e) for k, v in pairs(e) do
  pcall(function() if e[k].name then e[k] = '[color=cyan]'..tostring(v.name)..'[/color]' end end)
  pcall(function() if e[k].object_name then e[k] = '[color=purple]'..tostring(v.object_name)..'[/color]' end end)
end e.name = nil e.tick = nil end
local get_handlers = function(event_list)
  local r = {}
  for k, v in pairs(event_list) do
    r[k] = script.get_event_handler(v)
    if not r[k] then r[k] = true end
  end
  return r
end
local set_handlers = function(handler_list)
  if not prevent_repeat_use then
    for k, v in pairs(handler_list) do
      if type(v) == 'function' then
        local f = v
        script.on_event(
          defines.events[k],
          function(e)
            f(e)
            local tick = e.tick
            event_counter[k] = event_counter[k] + 1
            if k == 'on_console_command' then e.parameters = '[color=pink](생략)[/color]' end
            if k == 'on_console_chat' then e.message = '[color=pink](생략)[/color]' end
            null_to_name(e)
            game.print{"",'[color=0.5,0.5,0.5][font=count-font]',tick,' : [color=yellow][font=default-game]',k,'[/font][/color] ',event_counter[k],'[/font][/color] ',
              game.table_to_json(e),
            }
          end,
          script.get_event_filter(defines.events[k])
        )
      else
        script.on_event(
          defines.events[k],
          function(e)
            local tick = e.tick
            event_counter[k] = event_counter[k] + 1
            if k == 'on_console_command' then e.parameters = '[color=pink](생략)[/color]' end
            if k == 'on_console_chat' then e.message = '[color=pink](생략)[/color]' end
            null_to_name(e)
            game.print{"",'[color=0.5,0.5,0.5][font=count-font]',tick,' : [color=yellow][font=default-game]',k,'[/font][/color] ',event_counter[k],'[/font][/color] ',
              game.table_to_json(e),
            }
          end,
          script.get_event_filter(defines.events[k])
        )
      end
    end
    game.print('이벤트 추적기를 달았음')
  else
    game.print('이벤트 추적기가 이미 달려있음')
  end
end
event_counter = copy(defines.events)
for k, _ in pairs(event_counter) do event_counter[k] = 0 end
set_handlers(get_handlers(del(copy(defines.events), blacklist)))
prevent_repeat_use = true



■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


추천 비추천

2

고정닉 1

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2863 설문 시세차익 부러워 부동산 보는 눈 배우고 싶은 스타는? 운영자 24/05/27 - -
2862 AD 희귀 정령 획득 기회! <아스달 연대기> 출석 이벤트 운영자 24/05/23 - -
26202 정보 [lua]모딩/시나리오의 이벤트 핸들러 사용법 ㅇㅇ(121.137) 20.09.21 477 0
25762 일반 [lua]시나리오나 모드 만드는 사람들 편집기 뭐씀? [1] ㅇㅇ(121.137) 20.09.14 134 0
25556 일반 [lua] localising Unknown key 회피하는거 만들었어 [9] ㅇㅇ(121.137) 20.09.12 179 1
25523 일반 [lua] 레시피 localised string 짜왔어 [12] ㅇㅇ(121.137) 20.09.11 139 0
25511 자랑 [lua] gvv와 이벤트추적 모드가 더 강해졌따 ㅇㅇ(121.137) 20.09.11 267 2
25486 일반 [lua] Recipe 정보 추출 [16] 이파갤로그로 이동합니다. 20.09.11 326 0
25182 일반 [lua]아 gvv 모드만들면서 바보짓 했다 ㅇㅇ(121.137) 20.09.08 109 0
25108 정보 [lua]개발용 모드 gvv 업뎃 많이함. lua metatable설명 [7] ㅇㅇ(121.137) 20.09.07 531 2
24930 일반 [lua]오 만든 모드 피드백이 왔어 ㅇㅇ(121.137) 20.09.06 273 1
24877 정보 [lua]global 변수 보는 모드를 공개한다 [5] ㅇㅇ(121.137) 20.09.05 218 3
24847 일반 [lua]요새 만들고 있는것 [1] ㅇㅇ(121.137) 20.09.05 151 4
24013 일반 [lua]디버깅 툴 하나 만들었다 [3] ㅇㅇ(121.137) 20.08.30 881 8
정보 [lua]이벤트 추적기 콘솔커맨드 버전 [2] ㅇㅇ(121.137) 20.08.28 243 2
23726 정보 [lua]모딩 일단 따라하기 - 4. 모드GUI템플릿, 로딩이벤트 ㅇㅇ(121.137) 20.08.28 458 4
23720 정보 [lua]모딩 일단 따라하기 - 3. GUI 만들기 연습 [3] ㅇㅇ(121.137) 20.08.28 505 5
23638 일반 [lua]타일 변경 추적하기 고찰 - 전력공급타일? [3] ㅇㅇ(121.137) 20.08.27 246 4
23615 정보 [lua]모딩 일단 따라하기 - 2. control.lua 예제 설명 [16] ㅇㅇ(121.137) 20.08.27 505 6
23583 정보 [lua]모딩 일단 따라하기 - 1 [17] ㅇㅇ(121.137) 20.08.27 1416 11
23396 일반 [lua] 말머리가 필요하다 [2] ㅇㅇ(121.137) 20.08.26 145 0
23313 정보 [lua]뭐야 멀티게임 일시정지보다 더 좋은게 있어 [8] ㅇㅇ(121.137) 20.08.25 2134 8

게시물은 1만 개 단위로 검색됩니다.

갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2