Steam things
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user