<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://wiki.playcity.kr/index.php?action=history&amp;feed=atom&amp;title=ProtocolLib</id>
	<title>ProtocolLib - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.playcity.kr/index.php?action=history&amp;feed=atom&amp;title=ProtocolLib"/>
	<link rel="alternate" type="text/html" href="https://wiki.playcity.kr/index.php?title=ProtocolLib&amp;action=history"/>
	<updated>2026-07-20T16:45:32Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.playcity.kr/index.php?title=ProtocolLib&amp;diff=90223&amp;oldid=prev</id>
		<title>Tdb: 문자열 찾아 바꾸기 - &quot;분류:마인크래프트&quot; 문자열을 &quot;분류:마인크래프트/플러그인&quot; 문자열로</title>
		<link rel="alternate" type="text/html" href="https://wiki.playcity.kr/index.php?title=ProtocolLib&amp;diff=90223&amp;oldid=prev"/>
		<updated>2025-07-22T17:10:00Z</updated>

		<summary type="html">&lt;p&gt;문자열 찾아 바꾸기 - &amp;quot;&lt;a href=&quot;/index.php/%EB%B6%84%EB%A5%98:%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8&quot; title=&quot;분류:마인크래프트&quot;&gt;분류:마인크래프트&lt;/a&gt;&amp;quot; 문자열을 &amp;quot;&lt;a href=&quot;/index.php/%EB%B6%84%EB%A5%98:%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8/%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8&quot; title=&quot;분류:마인크래프트/플러그인&quot;&gt;분류:마인크래프트/플러그인&lt;/a&gt;&amp;quot; 문자열로&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 7월 23일 (수) 02:10 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l229&quot;&gt;229번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;229번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;references/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;references/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[분류:마인크래프트]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[분류:마인크래프트&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/플러그인&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Tdb</name></author>
	</entry>
	<entry>
		<id>https://wiki.playcity.kr/index.php?title=ProtocolLib&amp;diff=90186&amp;oldid=prev</id>
		<title>Tdb: 새 문서: &#039;&#039;&#039;ProtocolLib&#039;&#039;&#039;은 마인크래프트 서버와 클라이언트 간의 패킷 통신을 제어할 수 있게 해주는 핵심 라이브러리 플러그인이다. 다른 플러그인들이 패킷을 가로채거나 수정할 수 있도록 API를 제공하며, 많은 고급 플러그인들의 필수 의존성이다.  == 개념 == ProtocolLib는 마인크래프트의 네트워크 프로토콜 레이어에서 작동한다. 서버와 클라이언트 간에 주고받는 모든...</title>
		<link rel="alternate" type="text/html" href="https://wiki.playcity.kr/index.php?title=ProtocolLib&amp;diff=90186&amp;oldid=prev"/>
		<updated>2025-07-22T14:58:34Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &amp;#039;&amp;#039;&amp;#039;ProtocolLib&amp;#039;&amp;#039;&amp;#039;은 &lt;a href=&quot;/index.php/%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8&quot; title=&quot;마인크래프트&quot;&gt;마인크래프트&lt;/a&gt; 서버와 클라이언트 간의 패킷 통신을 제어할 수 있게 해주는 핵심 라이브러리 플러그인이다. 다른 플러그인들이 패킷을 가로채거나 수정할 수 있도록 API를 제공하며, 많은 고급 플러그인들의 필수 의존성이다.  == 개념 == ProtocolLib는 마인크래프트의 네트워크 프로토콜 레이어에서 작동한다. 서버와 클라이언트 간에 주고받는 모든...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;ProtocolLib&amp;#039;&amp;#039;&amp;#039;은 [[마인크래프트]] 서버와 클라이언트 간의 패킷 통신을 제어할 수 있게 해주는 핵심 라이브러리 플러그인이다. 다른 플러그인들이 패킷을 가로채거나 수정할 수 있도록 API를 제공하며, 많은 고급 플러그인들의 필수 의존성이다.&lt;br /&gt;
&lt;br /&gt;
== 개념 ==&lt;br /&gt;
ProtocolLib는 마인크래프트의 네트워크 프로토콜 레이어에서 작동한다. 서버와 클라이언트 간에 주고받는 모든 데이터(패킷)를 모니터링하고 수정할 수 있어, 바닐라 마인크래프트의 한계를 뛰어넘는 기능 구현이 가능하다.&lt;br /&gt;
&lt;br /&gt;
== 주요 기능 ==&lt;br /&gt;
=== 패킷 제어 ===&lt;br /&gt;
* 패킷 가로채기 (Intercept)&lt;br /&gt;
* 패킷 수정 (Modify)&lt;br /&gt;
* 패킷 취소 (Cancel)&lt;br /&gt;
* 커스텀 패킷 전송&lt;br /&gt;
&lt;br /&gt;
=== 호환성 시스템 ===&lt;br /&gt;
* 버전 간 호환성 레이어 제공&lt;br /&gt;
* 자동 패킷 ID 매핑&lt;br /&gt;
* NMS(Net.Minecraft.Server) 코드 추상화&lt;br /&gt;
* 다중 프로토콜 버전 지원&lt;br /&gt;
&lt;br /&gt;
=== 성능 최적화 ===&lt;br /&gt;
* 비동기 패킷 처리&lt;br /&gt;
* 효율적인 리플렉션 캐싱&lt;br /&gt;
* 메모리 풀링 시스템&lt;br /&gt;
&lt;br /&gt;
== 명령어 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 명령어 !! 설명 !! 권한&lt;br /&gt;
|-&lt;br /&gt;
| /protocol version || ProtocolLib 버전 확인 || protocol.admin&lt;br /&gt;
|-&lt;br /&gt;
| /protocol timings || 패킷 처리 성능 측정 || protocol.admin&lt;br /&gt;
|-&lt;br /&gt;
| /protocol listeners || 등록된 패킷 리스너 목록 || protocol.admin&lt;br /&gt;
|-&lt;br /&gt;
| /protocol dump &amp;lt;플레이어&amp;gt; || 플레이어의 패킷 덤프 || protocol.admin&lt;br /&gt;
|-&lt;br /&gt;
| /packet monitor &amp;lt;패킷타입&amp;gt; || 특정 패킷 모니터링 || protocol.admin&lt;br /&gt;
|-&lt;br /&gt;
| /packet send &amp;lt;플레이어&amp;gt; &amp;lt;패킷&amp;gt; || 테스트 패킷 전송 || protocol.admin&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 설정 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# config.yml 주요 설정&lt;br /&gt;
global:&lt;br /&gt;
  # 디버그 모드&lt;br /&gt;
  debug: false&lt;br /&gt;
  &lt;br /&gt;
  # 상세 오류 로깅&lt;br /&gt;
  detailed_error: false&lt;br /&gt;
  &lt;br /&gt;
  # 자동 업데이트&lt;br /&gt;
  auto_updater: true&lt;br /&gt;
  auto_download: false&lt;br /&gt;
  &lt;br /&gt;
  # 메트릭스 수집&lt;br /&gt;
  metrics: true&lt;br /&gt;
  &lt;br /&gt;
  # 백그라운드 컴파일러&lt;br /&gt;
  background_compiler: true&lt;br /&gt;
  &lt;br /&gt;
  # 패킷 로깅&lt;br /&gt;
  log_packet_count: false&lt;br /&gt;
  &lt;br /&gt;
  # 히스토리 크기&lt;br /&gt;
  history_size: 10&lt;br /&gt;
&lt;br /&gt;
# 성능 설정&lt;br /&gt;
performance:&lt;br /&gt;
  # 비동기 처리&lt;br /&gt;
  async_manager_threads: 1&lt;br /&gt;
  &lt;br /&gt;
  # 패킷 큐 크기&lt;br /&gt;
  packet_queue_size: 1024&lt;br /&gt;
  &lt;br /&gt;
  # 타임아웃 설정&lt;br /&gt;
  timeout_ms: 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 의존 플러그인 예시 ==&lt;br /&gt;
ProtocolLib를 필요로 하는 주요 플러그인들:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;LibsDisguises&amp;#039;&amp;#039;&amp;#039;: 고급 변장 시스템&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Citizens&amp;#039;&amp;#039;&amp;#039;: NPC 생성 및 관리&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PacketListenerAPI&amp;#039;&amp;#039;&amp;#039;: 패킷 이벤트 처리&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;NoCheatPlus&amp;#039;&amp;#039;&amp;#039;: 안티치트 시스템&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;HolographicDisplays&amp;#039;&amp;#039;&amp;#039;: 홀로그램 표시&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PlayerParticles&amp;#039;&amp;#039;&amp;#039;: 플레이어 파티클 효과&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TabList&amp;#039;&amp;#039;&amp;#039;: 탭 리스트 커스터마이징&lt;br /&gt;
&lt;br /&gt;
== 개발자를 위한 API ==&lt;br /&gt;
=== 패킷 리스너 등록 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// 패킷 리스너 예제&lt;br /&gt;
ProtocolManager manager = ProtocolLibrary.getProtocolManager();&lt;br /&gt;
&lt;br /&gt;
manager.addPacketListener(new PacketAdapter(plugin, &lt;br /&gt;
    ListenerPriority.NORMAL, &lt;br /&gt;
    PacketType.Play.Client.CHAT) {&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPacketReceiving(PacketEvent event) {&lt;br /&gt;
        if (event.getPacketType() == PacketType.Play.Client.CHAT) {&lt;br /&gt;
            String message = event.getPacket().getStrings().read(0);&lt;br /&gt;
            // 채팅 메시지 처리&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 커스텀 패킷 전송 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// 타이틀 패킷 전송 예제&lt;br /&gt;
PacketContainer packet = manager.createPacket(PacketType.Play.Server.TITLE);&lt;br /&gt;
packet.getTitleActions().write(0, TitleAction.TITLE);&lt;br /&gt;
packet.getChatComponents().write(0, &lt;br /&gt;
    WrappedChatComponent.fromText(&amp;quot;Welcome!&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
manager.sendServerPacket(player, packet);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 패킷 타입 ==&lt;br /&gt;
=== 주요 패킷 카테고리 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 서버 → 클라이언트&lt;br /&gt;
Play.Server:&lt;br /&gt;
  - ENTITY_METADATA: 엔티티 메타데이터&lt;br /&gt;
  - PLAYER_INFO: 플레이어 정보&lt;br /&gt;
  - WORLD_PARTICLES: 파티클 효과&lt;br /&gt;
  - BLOCK_CHANGE: 블록 변경&lt;br /&gt;
  - CHAT: 채팅 메시지&lt;br /&gt;
&lt;br /&gt;
# 클라이언트 → 서버  &lt;br /&gt;
Play.Client:&lt;br /&gt;
  - USE_ENTITY: 엔티티 상호작용&lt;br /&gt;
  - BLOCK_DIG: 블록 파괴&lt;br /&gt;
  - BLOCK_PLACE: 블록 설치&lt;br /&gt;
  - HELD_ITEM_SLOT: 핫바 슬롯 변경&lt;br /&gt;
  - POSITION: 플레이어 위치&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 고급 기능 ==&lt;br /&gt;
=== 패킷 필터링 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// 조건부 패킷 필터링&lt;br /&gt;
manager.addPacketListener(new PacketAdapter(plugin,&lt;br /&gt;
    ListenerPriority.HIGH,&lt;br /&gt;
    PacketType.Play.Server.ENTITY_VELOCITY) {&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPacketSending(PacketEvent event) {&lt;br /&gt;
        Player player = event.getPlayer();&lt;br /&gt;
        &lt;br /&gt;
        // 특정 조건에서 패킷 취소&lt;br /&gt;
        if (player.hasPermission(&amp;quot;antikb.bypass&amp;quot;)) {&lt;br /&gt;
            event.setCancelled(true);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비동기 패킷 처리 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// 비동기 리스너&lt;br /&gt;
AsyncListenerHandler handler = new AsyncListenerHandler(plugin) {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPacketReceiving(AsyncMarker async, PacketEvent event) {&lt;br /&gt;
        // 무거운 작업 수행&lt;br /&gt;
        async.incrementProcessingDelay();&lt;br /&gt;
        &lt;br /&gt;
        // 작업 완료 후&lt;br /&gt;
        async.decrementProcessingDelay();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
manager.getAsynchronousManager().registerAsyncHandler(handler);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 성능 모니터링 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 패킷 통계 확인&lt;br /&gt;
/protocol timings&lt;br /&gt;
&lt;br /&gt;
# 출력 예시:&lt;br /&gt;
Packet Statistics:&lt;br /&gt;
- ENTITY_METADATA: 15,234 packets/s&lt;br /&gt;
- POSITION: 8,521 packets/s&lt;br /&gt;
- BLOCK_CHANGE: 3,102 packets/s&lt;br /&gt;
&lt;br /&gt;
Listener Performance:&lt;br /&gt;
- MyPlugin: 0.5ms avg&lt;br /&gt;
- AnotherPlugin: 1.2ms avg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 문제 해결 ==&lt;br /&gt;
=== 일반적인 오류 ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ClassNotFoundException&amp;#039;&amp;#039;&amp;#039;: ProtocolLib 버전과 서버 버전 불일치&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;패킷 오류&amp;#039;&amp;#039;&amp;#039;: 잘못된 패킷 구조나 타입 사용&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;메모리 누수&amp;#039;&amp;#039;&amp;#039;: 리스너 미해제로 인한 문제&lt;br /&gt;
&lt;br /&gt;
=== 디버깅 방법 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 디버그 모드 활성화&lt;br /&gt;
debug: true&lt;br /&gt;
&lt;br /&gt;
# 특정 패킷 추적&lt;br /&gt;
/packet monitor ENTITY_METADATA&lt;br /&gt;
&lt;br /&gt;
# 패킷 덤프&lt;br /&gt;
/protocol dump PlayerName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 보안 고려사항 ==&lt;br /&gt;
* 패킷 조작은 서버 보안에 영향을 줄 수 있음&lt;br /&gt;
* 신뢰할 수 있는 플러그인만 사용 권장&lt;br /&gt;
* 정기적인 업데이트 필수&lt;br /&gt;
* 의심스러운 패킷 패턴 모니터링&lt;br /&gt;
&lt;br /&gt;
== 버전 호환성 ==&lt;br /&gt;
* [[마인크래프트]] 1.8 - 1.21 지원&lt;br /&gt;
* 각 마인크래프트 버전별 전용 ProtocolLib 버전 존재&lt;br /&gt;
* 하위 호환성 유지를 위한 레거시 API 제공&lt;br /&gt;
&lt;br /&gt;
== 개발 팁 ==&lt;br /&gt;
* 패킷 리스너는 최소한으로 유지&lt;br /&gt;
* 무거운 작업은 비동기로 처리&lt;br /&gt;
* 불필요한 패킷 생성 자제&lt;br /&gt;
* 리스너 등록 해제 확실히 수행&amp;lt;ref&amp;gt;메모리 누수 방지를 위해 플러그인 비활성화 시 반드시 해제&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:마인크래프트]]&lt;/div&gt;</summary>
		<author><name>Tdb</name></author>
	</entry>
</feed>