Steam things

This commit is contained in:
Anuken
2019-08-21 21:20:44 -04:00
parent 74e3dc2d7d
commit 3294f800be
2 changed files with 163 additions and 60 deletions

View File

@@ -1,22 +1,34 @@
package io.anuke.mindustry.desktop.steam; package io.anuke.mindustry.desktop.steam;
import com.codedisaster.steamworks.*; import com.codedisaster.steamworks.*;
import com.codedisaster.steamworks.SteamFriends.*;
import com.codedisaster.steamworks.SteamMatchmaking.*; import com.codedisaster.steamworks.SteamMatchmaking.*;
import com.codedisaster.steamworks.SteamNetworking.*; 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.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.*; import java.nio.*;
public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakingCallback{ import static io.anuke.mindustry.Vars.ui;
private SteamNetworking snet;
private SteamMatchmaking smat;
private ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 128); public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakingCallback, ClientProvider{
//maps steam ID -> valid net connection final SteamNetworking snet = new SteamNetworking(this);
private IntMap<SteamConnection> connections = new IntMap<>(); 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(){ public SteamClientImpl(){
//snet = new SteamNetworking(this); //snet = new SteamNetworking(this);
@@ -40,6 +52,93 @@ public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakin
}){{ }){{
setDaemon(true); setDaemon(true);
}}.start();*/ }}.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<Host> callback, Runnable done){
}
@Override
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<Exception> failed){
}
@Override
public void dispose(){
disconnect();
} }
@Override @Override
@@ -59,12 +158,20 @@ public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakin
@Override @Override
public void onLobbyInvite(SteamID steamIDUser, SteamID steamIDLobby, long gameID){ 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 @Override
public void onLobbyEnter(SteamID steamIDLobby, int chatPermissions, boolean blocked, ChatRoomEnterResponse response){ 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 @Override
@@ -99,54 +206,6 @@ public class SteamClientImpl implements SteamNetworkingCallback, SteamMatchmakin
@Override @Override
public void onLobbyCreated(SteamResult result, SteamID steamIDLobby){ 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 @Override

View File

@@ -6,8 +6,11 @@ import com.codedisaster.steamworks.SteamNetworking.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.collection.*; import io.anuke.arc.collection.*;
import io.anuke.arc.util.*; 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.Net.*;
import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.*;
import io.anuke.mindustry.net.Packets.*;
import java.io.*; import java.io.*;
import java.nio.*; import java.nio.*;
@@ -17,6 +20,7 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback,
private final PacketSerializer serializer = new PacketSerializer(); private final PacketSerializer serializer = new PacketSerializer();
private final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(1024 * 4); 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 SteamNetworking snet = new SteamNetworking(this);
private final SteamMatchmaking smat = new SteamMatchmaking(this); private final SteamMatchmaking smat = new SteamMatchmaking(this);
private final SteamFriendsImpl friends = new SteamFriendsImpl(); private final SteamFriendsImpl friends = new SteamFriendsImpl();
@@ -29,6 +33,35 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback,
public SteamServerImpl(ServerProvider server){ public SteamServerImpl(ServerProvider server){
this.server = 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 //server overrides
@@ -43,13 +76,14 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback,
public void close(){ public void close(){
server.close(); server.close();
if(currentLobby != null){ if(currentLobby != null){
//TODO kick everyone who is in this lobby?
smat.leaveLobby(currentLobby); smat.leaveLobby(currentLobby);
currentLobby = null;
for(SteamConnection con : steamConnections.values()){ for(SteamConnection con : steamConnections.values()){
con.close(); con.close();
} }
currentLobby = null;
} }
steamConnections.clear();
} }
@Override @Override
@@ -120,6 +154,7 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback,
Log.info("Lobby {1} created? {0}", result, steamIDLobby.getAccountID()); Log.info("Lobby {1} created? {0}", result, steamIDLobby.getAccountID());
if(result == SteamResult.OK){ if(result == SteamResult.OK){
currentLobby = steamIDLobby; currentLobby = steamIDLobby;
friends.friends.activateGameOverlayInviteDialog(currentLobby);
} }
} }
@@ -132,7 +167,16 @@ public class SteamServerImpl implements ServerProvider, SteamNetworkingCallback,
@Override @Override
public void onP2PSessionConnectFail(SteamID steamIDRemote, P2PSessionError sessionError){ 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 @Override