From 3294f800be4fcea541425e08d023dba3951779d2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Aug 2019 21:20:44 -0400 Subject: [PATCH] Steam things --- .../desktop/steam/SteamClientImpl.java | 175 ++++++++++++------ .../desktop/steam/SteamServerImpl.java | 48 ++++- 2 files changed, 163 insertions(+), 60 deletions(-) diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SteamClientImpl.java b/desktop/src/io/anuke/mindustry/desktop/steam/SteamClientImpl.java index 8f8a90cbd6..6a3dfd70c2 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SteamClientImpl.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SteamClientImpl.java @@ -1,22 +1,34 @@ package io.anuke.mindustry.desktop.steam; import com.codedisaster.steamworks.*; -import com.codedisaster.steamworks.SteamFriends.*; import com.codedisaster.steamworks.SteamMatchmaking.*; import com.codedisaster.steamworks.SteamNetworking.*; -import io.anuke.arc.collection.*; +import io.anuke.arc.*; +import io.anuke.arc.function.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.desktop.steam.SteamServerImpl.*; +import io.anuke.arc.util.async.*; +import io.anuke.arc.util.pooling.*; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.net.*; +import io.anuke.mindustry.net.Net.*; +import io.anuke.mindustry.net.Packets.*; +import net.jpountz.lz4.*; +import java.io.*; import java.nio.*; -public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakingCallback{ - private SteamNetworking snet; - private SteamMatchmaking smat; +import static io.anuke.mindustry.Vars.ui; - private ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 128); - //maps steam ID -> valid net connection - private IntMap connections = new IntMap<>(); +public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakingCallback, ClientProvider{ + final SteamNetworking snet = new SteamNetworking(this); + final SteamMatchmaking smat = new SteamMatchmaking(this); + + final PacketSerializer serializer = new PacketSerializer(); + final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(1024 * 4); + final ByteBuffer readBuffer = ByteBuffer.allocateDirect(1024 * 4); + final LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor(); + + SteamID currentLobby, currentServer; public SteamClientImpl(){ //snet = new SteamNetworking(this); @@ -40,6 +52,93 @@ public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakin }){{ setDaemon(true); }}.start();*/ + + //start recieving packets + Threads.daemon(() -> { + int length; + SteamID from = new SteamID(); + while(true){ + while((length = snet.isP2PPacketAvailable(0)) != 0){ + try{ + readBuffer.position(0); + snet.readP2PPacket(from, readBuffer, 0); + int fromID = from.getAccountID(); + //TODO make sure ID is host ID + Object output = serializer.read(readBuffer); + + if(fromID == currentServer.getAccountID()){ + Core.app.post(() -> Net.handleClientReceived(output)); + } + }catch(SteamException e){ + e.printStackTrace(); + } + } + + Threads.sleep(1000 / 10); + } + }); + } + + @Override + public void connect(String ip, int port, Runnable success) throws IOException{ + //no + } + + @Override + public void send(Object object, SendMode mode){ + if(currentServer == null) return; + + try{ + writeBuffer.limit(writeBuffer.capacity()); + writeBuffer.position(0); + serializer.write(writeBuffer, object); + writeBuffer.flip(); + + snet.sendP2PPacket(currentServer, writeBuffer, mode == SendMode.tcp ? P2PSend.Reliable : P2PSend.UnreliableNoDelay, 0); + }catch(Exception e){ + Net.showError(e); + } + Pools.free(object); + } + + @Override + public void updatePing(){ + + } + + @Override + public int getPing(){ + return 0; + } + + @Override + public void disconnect(){ + if(currentLobby != null){ + smat.leaveLobby(currentLobby); + snet.closeP2PSessionWithUser(currentServer); + currentServer = null; + currentLobby = null; + } + } + + @Override + public byte[] decompressSnapshot(byte[] input, int size){ + return decompressor.decompress(input, size); + } + + @Override + public void discover(Consumer callback, Runnable done){ + + } + + @Override + public void pingHost(String address, int port, Consumer valid, Consumer failed){ + + } + + @Override + public void dispose(){ + disconnect(); } @Override @@ -59,12 +158,20 @@ public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakin @Override public void onLobbyInvite(SteamID steamIDUser, SteamID steamIDLobby, long gameID){ - + ui.showConfirm("Someone has invited you to a game.", "But do you accept?", () -> { + smat.joinLobby(steamIDLobby); + }); } @Override public void onLobbyEnter(SteamID steamIDLobby, int chatPermissions, boolean blocked, ChatRoomEnterResponse response){ + currentLobby = steamIDLobby; + currentServer = smat.getLobbyOwner(steamIDLobby); + Connect con = new Connect(); + con.addressTCP = "steam:" + currentServer.getAccountID(); + + Net.handleClientReceived(con); } @Override @@ -99,54 +206,6 @@ public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakin @Override public void onLobbyCreated(SteamResult result, SteamID steamIDLobby){ - Log.info("Lobby create callback"); - Log.info("Lobby {1} created? {0}", result, steamIDLobby.getAccountID()); - if(result == SteamResult.OK){ - SteamFriends friends = new SteamFriends(new SteamFriendsCallback(){ - @Override - public void onSetPersonaNameResponse(boolean success, boolean localSuccess, SteamResult result){ - - } - - @Override - public void onPersonaStateChange(SteamID steamID, PersonaChange change){ - - } - - @Override - public void onGameOverlayActivated(boolean active){ - - } - - @Override - public void onGameLobbyJoinRequested(SteamID steamIDLobby, SteamID steamIDFriend){ - Log.info("Requested {0} to join lobby {1}", steamIDFriend.getAccountID(), steamIDLobby.getAccountID()); - } - - @Override - public void onAvatarImageLoaded(SteamID steamID, int image, int width, int height){ - - } - - @Override - public void onFriendRichPresenceUpdate(SteamID steamIDFriend, int appID){ - - } - - @Override - public void onGameRichPresenceJoinRequested(SteamID steamIDFriend, String connect){ - - } - - @Override - public void onGameServerChangeRequested(String server, String password){ - - } - }); - - //friends.activateGameOverlay(OverlayDialog.Friends); - friends.activateGameOverlayInviteDialog(steamIDLobby); - } } @Override diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SteamServerImpl.java b/desktop/src/io/anuke/mindustry/desktop/steam/SteamServerImpl.java index a9cc0f4bfd..8555573f31 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SteamServerImpl.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SteamServerImpl.java @@ -6,8 +6,11 @@ import com.codedisaster.steamworks.SteamNetworking.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.async.*; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.*; +import io.anuke.mindustry.net.Packets.*; import java.io.*; import java.nio.*; @@ -17,6 +20,7 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback, private final PacketSerializer serializer = new PacketSerializer(); private final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(1024 * 4); + private final ByteBuffer readBuffer = ByteBuffer.allocateDirect(1024 * 4); private final SteamNetworking snet = new SteamNetworking(this); private final SteamMatchmaking smat = new SteamMatchmaking(this); private final SteamFriendsImpl friends = new SteamFriendsImpl(); @@ -29,6 +33,35 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback, public SteamServerImpl(ServerProvider server){ this.server = server; + + //start recieving packets + Threads.daemon(() -> { + int length; + SteamID from = new SteamID(); + while(true){ + while((length = snet.isP2PPacketAvailable(0)) != 0){ + try{ + readBuffer.position(0); + snet.readP2PPacket(from, readBuffer, 0); + int fromID = from.getAccountID(); + Object output = serializer.read(readBuffer); + + Core.app.post(() -> { + SteamConnection con = steamConnections.get(fromID); + if(con != null){ + Net.handleServerReceived(con.id, output); + }else{ + Log.err("Unknown user with ID: {0}", fromID); + } + }); + }catch(SteamException e){ + e.printStackTrace(); + } + } + + Threads.sleep(1000 / 10); + } + }); } //server overrides @@ -43,13 +76,14 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback, public void close(){ server.close(); if(currentLobby != null){ - //TODO kick everyone who is in this lobby? smat.leaveLobby(currentLobby); - currentLobby = null; for(SteamConnection con : steamConnections.values()){ con.close(); } + currentLobby = null; } + + steamConnections.clear(); } @Override @@ -120,6 +154,7 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback, Log.info("Lobby {1} created? {0}", result, steamIDLobby.getAccountID()); if(result == SteamResult.OK){ currentLobby = steamIDLobby; + friends.friends.activateGameOverlayInviteDialog(currentLobby); } } @@ -132,7 +167,16 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback, @Override public void onP2PSessionConnectFail(SteamID steamIDRemote, P2PSessionError sessionError){ + Log.info("{0} has disconnected: {1}", steamIDRemote.getAccountID(), sessionError); + if(Net.server()){ + int id = steamIDRemote.getAccountID(); + + if(steamConnections.containsKey(id)){ + Net.handleServerReceived(id, new Disconnect()); + steamConnections.remove(id); + } + } } @Override