2017-12-25 21 views
0

私は現在、Steamworks APIを使用してマルチプレイヤーゲームを作成しています。 私は最近、いくつかの問題に遭遇しました。つまり、あるクライアントから別のクライアントにパケットを送信できないようです。 APIは正しく初期化されていますが、利用可能なパケットを検索すると、返されるパケットサイズは常に0になります。 これはSteamworksが1つのスチームアカウントしか持っていないためです問題を引き起こすクライアント。1つのSteamアカウントでSteamworks P2Pアプリケーションをテストするにはどうすればよいですか?

私の質問は次のようなものです:異なるSteam IDを使用しなければならないアプリケーションのテストはどうでしょうか? パケットが送信されない理由を知りたい場合は、私にも知らせてください。 すべてのネットワーキングコードは、NetworkManagerというクラスに含まれています。ここでは簡単には使用しないコールバックメソッドを破棄しています(起動時にconnectToLobby()が呼び出され、フレームごとにpollPackets ):

public class NetworkManager implements SteamMatchmakingCallback, SteamNetworkingCallback, SteamUserCallback, SteamUtilsCallback, SteamAPIWarningMessageHook { 

private static final String LOBBY_MATCHING_KEY = "[key:sandbox-lobby]"; 
private static final String LOBBY_MATCHING_VALUE = "[true]"; 

private static final int DEFAULT_CHANNEL = 1; 

private SteamMatchmaking matchmaking; 
private SteamNetworking networking; 
private SteamUser user; 
private SteamUtils utils; 

private Gson serializer; 

private SteamID host; 

private World world; 

public NetworkManager(World world) { 

    this.world = world; 

    matchmaking = new SteamMatchmaking(this); 
    networking = new SteamNetworking(this, API.Client); 
    user = new SteamUser(this); 
    utils = new SteamUtils(this); 

    serializer = new Gson(); 

    utils.setWarningMessageHook(this); 
} 

@Override 
public void onSteamShutdown() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onWarningMessage(int severity, String message) { 

    System.out.println(message); 

} 

public void connectToLobby() { 

    System.out.println(user.getSteamID().getAccountID()); 

    matchmaking.addRequestLobbyListStringFilter(LOBBY_MATCHING_KEY, LOBBY_MATCHING_VALUE, LobbyComparison.Equal); 
    matchmaking.requestLobbyList(); 

} 

public void pollPackets() { 

    int packetSize; 
    while ((packetSize = networking.isP2PPacketAvailable(DEFAULT_CHANNEL)) > 0) { 

     System.out.println("Packet was received!"); 

     // A packet is available, so get it's contents 
     ByteBuffer buffer = ByteBuffer.allocateDirect(packetSize); 
     try { 
      while (networking.readP2PPacket(host, buffer, DEFAULT_CHANNEL) > 0) { 
      } 
     } catch (SteamException e) { 
      e.printStackTrace(); 
     } 

     byte[] bytes = new byte[buffer.position()]; 
     buffer.get(bytes); 

     String json = new String(bytes); 

     buffer = null; 
     bytes = null; 

     Packet packet = serializer.fromJson(json, Packet.class); 

     world.onPacketReceive(packet); 

    } 

} 

public void sendPacket(SteamID destination, Packet packet) { 

    byte[] bytes = serializer.toJson(packet).getBytes(); 
    ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length); 
    buffer.clear(); 
    buffer.put(bytes); 
    buffer.flip(); 

    try { 
     System.out.println(buffer.position()); 
     System.out.println(buffer.limit()); 
     if (networking.sendP2PPacket(destination, buffer, P2PSend.UnreliableNoDelay, DEFAULT_CHANNEL)) { 
      System.err.println("Failed to send packet!"); 
     } else { 
      System.out.println("Sent packet to " + destination.getAccountID() + " from " + user.getSteamID().getAccountID()); 
     } 
    } catch (SteamException e) { 
     e.printStackTrace(); 
    } 

    bytes = null; 
    buffer = null; 

} 

@Override 
public void onLobbyMatchList(int lobbiesMatching) { 

    if (lobbiesMatching == 0) { 

     // No open lobbies found, so create one 
     matchmaking.createLobby(LobbyType.Public, 2); 

    } else { 

     // Open lobby found, so join it 

     SteamID firstLobby = matchmaking.getLobbyByIndex(0); 
     matchmaking.joinLobby(firstLobby); 

    } 

} 

@Override 
public void onLobbyCreated(SteamResult result, SteamID steamIDLobby) { 

    if (result == SteamResult.OK) { 

     matchmaking.setLobbyJoinable(steamIDLobby, false); 

     if (!matchmaking.setLobbyData(steamIDLobby, LOBBY_MATCHING_KEY, LOBBY_MATCHING_VALUE)) { 
      System.err.println("Failed to set lobby matching data!"); 
      return; 
     } 

     matchmaking.setLobbyJoinable(steamIDLobby, true); 
     host = null; 

     System.out.println("Lobby creation successful!"); 

    } else { 
     System.err.println("Lobby creation failed: " + result); 
    } 

} 

@Override 
public void onLobbyEnter(SteamID steamIDLobby, int chatPermissions, boolean blocked, ChatRoomEnterResponse response) { 

    host = steamIDLobby; 
    System.out.println("Lobby join response: " + response); 

    sendPacket(steamIDLobby, new JoinPacket()); 
} 

@Override 
public void onP2PSessionRequest(SteamID steamIDRemote) { 

    System.out.println("Session request"); 

    // Accept any user that tries to send you messages 
    networking.acceptP2PSessionWithUser(steamIDRemote); 

} 

@Override 
public void onP2PSessionConnectFail(SteamID steamIDRemote, P2PSessionError sessionError) { 

    System.err.println("Session connect failed!"); 
    System.err.println(sessionError); 

} 

} 

パケットクラス:

public class Packet { 

public static final int PACKET_LOGIN = 0x0001; 

private final int type; 

protected final Map<String, String> data; 

public Packet(int type) { 

    this.type = type; 

    data = new HashMap<String, String>(); 
} 

public int getType() { 
    return type; 
} 

} 

私は非常にパケットが受信されなかった理由を任意のヒントをいただければと思いますか、どのように私は2つの異なる蒸気IDを使用して2つのクライアントを実行します。

答えて

0

私はこの理由のために2番目のSteamアカウントを作成しました。 Steamworksバックエンドに開発者としてのアカウントを追加し、ベータ版キーを使用してゲームをアクティブ化しました。

少なくとも私が知る限り、両方の側で独自のSteamクライアントを実行する必要があるため、テストするのはまだ苦労します。私はちょうど2台のマシン(1台のPC、1台のMacBook)を使用していましたが、すべてのコードの変更を同期するように常に思い出さなければなりませんでした。

関連する問題