테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
game-server/data/handlers/admincommands/Debug.java
package admincommands;

import java.awt.Color;
import java.lang.reflect.Field;
import java.nio.channels.SelectionKey;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import com.aionemu.commons.network.NioServer;
import com.aionemu.gameserver.GameServer;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.network.aion.AionConnection;
import com.aionemu.gameserver.services.player.PlayerService;
import com.aionemu.gameserver.utils.ChatUtil;
import com.aionemu.gameserver.utils.chathandlers.AdminCommand;

/**
 * @author Neon
 */
public class Debug extends AdminCommand {

	public Debug() {
		super("debug", "Helps fixing runtime problems.");

		// @formatter:off
		setSyntaxInfo(
			"<connections> - Displays all connected game clients.",
			"<connectedPlayers> - Displays information about connected players.",
			"<dcBuggedPlayers> - Disconnects and attempts to save bugged players."
		);
		// @formatter:on
	}

	@Override
	public void execute(Player admin, String... params) {
		if (params.length == 0) {
			sendInfo(admin);
			return;
		}

		if ("connections".equalsIgnoreCase(params[0])) {
			List<AionConnection> connections = findAionConnections(admin);
			if (connections != null) {
				sendInfo(admin, "Online clients:\n\t" + connections.stream().map(AionConnection::toString).collect(Collectors.joining("\n\t")));
			}
		} else if ("connectedPlayers".equalsIgnoreCase(params[0])) {
			List<Player> connectedPlayers = findConnectedPlayers(admin);
			if (connectedPlayers != null) {
				String message = "Connected players (" + connectedPlayers.size() + "):";
				for (Player player : connectedPlayers) {
					String details = "position: " + player.getPosition().toCoordString() + ", spawned: " + player.isSpawned();
					if (!player.isInWorld()) {
						details += ", " + ChatUtil.color("not in world", Color.RED);
					}
					message += "\n\t" + player.getName() + " [" + details + "]";
				}
				sendInfo(admin, message);
			}
		} else if ("dcBuggedPlayers".equalsIgnoreCase(params[0])) {
			List<Player> buggedPlayers = findConnectedPlayers(admin).stream().filter(p -> !p.isInWorld()).collect(Collectors.toList());
			if (buggedPlayers != null) {
				if (buggedPlayers.isEmpty()) {
					sendInfo(admin, "No bugged players found.");
				} else {
					for (Player player : buggedPlayers) {
						player.getController().cancelAllTasks(); // ensure to cancel item update task etc
						player.getCommonData().setOnline(false);
						PlayerService.storePlayer(player);
						player.getClientConnection().setActivePlayer(null);
						player.getClientConnection().close();
						player.setClientConnection(null);
					}
					sendInfo(admin, "Saved most data and disconnected the following players:\n" + buggedPlayers);
				}
			}
		}
	}

	private List<Player> findConnectedPlayers(Player admin) {
		List<AionConnection> connections = findAionConnections(admin);
		if (connections != null) {
			return connections.stream().map(AionConnection::getActivePlayer).filter(Objects::nonNull)
				.sorted(Comparator.comparing(Player::getName)).collect(Collectors.toList());
		}
		return null;
	}

	private List<AionConnection> findAionConnections(Player admin) {
		try {
			Field nioServerField = GameServer.class.getDeclaredField("nioServer");
			boolean oldAccessible = nioServerField.isAccessible();
			nioServerField.setAccessible(true);
			NioServer nioServer = (NioServer) nioServerField.get(null);
			nioServerField.setAccessible(oldAccessible);
			java.util.Set<SelectionKey> keys = nioServer.getReadWriteDispatcher().selector().keys();
			return keys.stream().map(SelectionKey::attachment).filter(o -> o instanceof AionConnection).map(o -> (AionConnection) o)
				.collect(Collectors.toList());
		} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
			sendInfo(admin, e.toString());
			return null;
		}
	}

}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 100,792
2 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 58,079
3 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,771
4 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 36,923
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 35,011
6 no_profile 보거스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,969
7 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,470
8 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 29,077
9 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
10 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 17,020
알림 0