Announcement

Collapse
No announcement yet.

UWorks (Steamworks C++/BP)

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    #31
    Originally posted by Bioblaze View Post
    <3 I love that you can google <3 Thank you. Open up the Actual SDK and start integrating it let me know how much that documentation helps
    As far as i understand you were unable to use the SDK with the docs right? I am sorry to hear that. Feel free to pm me and i can help

    Comment


      #32
      Originally posted by Azarus View Post
      As far as i understand you were unable to use the SDK with the docs right? I am sorry to hear that. Feel free to pm me and i can help
      Just curious didnt you say you started a year ago? Lulz Guess it wasnt all that Great. Lulz

      Comment


        #33
        I have been fighting with OnlineSubsystemSteam since three months. The main problem (for me at least) is that if you want to create a Steam lobby or Steam server you MUST create OnlineSession, because all the Steam integration is strictly connected with OnlineSubsystem. I see the idea behind this solution, but it is extremally unflexible. For example - you can create a Steam lobby, but to get its SteamID you must do tricky conversions like:

        FNamedOnlineSession* Session = SessionsPtr->GetNamedSession(GameSessionName);
        const FUniqueNetId* UniqueNetIdPtr = &(Session->SessionInfo->GetSessionId());
        uint64 SteamLobbyID = *((uint64*)UniqueNetIdPtr->GetBytes());


        When you want to list players that are sitting in a particular lobby there is no other way like using plain Steamworks SDK:

        int32 NumLobbyMembers = SteamMatchmaking()->GetNumLobbyMembers(SteamLobbyID);

        for (int32 i = 0; i < NumLobbyMembers; ++i)
        {
        CSteamID SteamIDLobbyMember = SteamMatchmaking()->GetLobbyMemberByIndex(SteamLobbyID, i);
        const char* Name = SteamFriends()->GetFriendPersonaName(SteamIDLobbyMember);
        }


        SteamMatchmaking() and SteamFriends() are interfaces from Steamworks SDK and you have no option to grab this data from OSS.

        I can point many other examples like this, because I have finnaly got the dedicated Steam server working (of course based on heavy use of plain Steamworks SDK). The idea of creating my own Steam plugin was always in my head, but I still do believe that EPIC finally improve the OSS (call me stupid)...

        But getting to the point - UWorks arrived and I have some questions:

        - The game that our studio is creating requires the standard OnlineSubsystem (NULL) to perform all the multiplayer tasks. We want to use Steam as a server browser, lobby functionality, etc. Now, let's assume that using UWorks I can create a Steam lobby, dedicated server and other Steam stuff WITHOUT creatnig OSS sessions at all. In that way how I can get the players that are in the lobby and send them to the server which should communicate with clients using Sessions from OSS (NULL)? Do you have any methods that connect these two worlds?
        Last edited by shinyclaw; 04-13-2017, 08:03 AM.

        Comment


          #34
          I'll invest more time into replying to the thread and creating new videos and/or demos once I finish the docs and example project. Until then, my apologies guys!

          Originally posted by franktech View Post
          I agree, this is an incredibly valuable / powerful plug-in, maybe the most important available to date.
          Before though, I had 2 valid concerns backed up with links regarding ongoing-support and app-config...
          So not sure why that was so hard to understand, but anyway I had a useful side discussion with Vlad.
          Maybe just regular language barrier issues. But anyway, I'm going to post here an extract of my reply, which I consider of public interest:

          Originally posted by My own reply to franktech's PM
          About the docs, I simply thought I made it clear in the OP that we will provide basic docs for how to use the plugin and how it's structured, along with demos and documentation for the said demos. However, also as mentioned in the OP, we won't be providing documentation for every single function/method in the plugin, as the documentation is already written on https://partner.steamgames.com/ and it would be absurd to copy-paste it and present it as our own. We are not designing Steam, we are merely exposing it. As we add more demos, we will write docs for those newly added demos, of that you can be sure. A similar thing goes for testing: we tested most of the stuff, but not all. We literally can't test 600 functions, mostly because of the time it would require and the fact that some require an AppID different than 480 to actually be used (otherwise they either fail or simply don't do anything; not our fault, it's just how Steamworks works). We've currently delayed sending the files by a few days to do some more QA.
          Originally posted by BrUnO XaVIeR View Post
          Me likez organization of well organized code and post
          Thanks!

          Originally posted by Azarus View Post
          Err.. Consider me being lazy and focusing on other important stuff

          The sdk is very well documented. Also there are many resources that you can use, and examples in the sdk, so you can get started on it easily. I did work with the sdk before and made various servers side apps, trading services and so on.
          For ue4 thought i only had to wait a few months, and it keept going like that for a year.
          With all due respect, objectively speaking, it's irrelevant who, what and why happened. We should focus on the present. And in the present, if you want to use the Steamworks SDK in C++, you have to break your UE4 workflow. Everything needs to be converted back and forth, especially "char *" "const char *" or the Steamworks struct holding multiple strings as "char *" with a separate length index. There's a reason TArray, FString and other stuff exists. Types aside, using async methods (call results / interface results) can be extremely painful and boring, especially those belonging to ISteamMatchmakingServers. Types and async calls aside, callbacks need to be located in their own objects and are not easily bindable (in UWorks, you just bind your function on a delegate; the objects and declarations are already there). Types, call results and callbacks aside, you will probably want to use inventories, cloud stuff and such and then you'd find functions which need to be called 2-3 times to fill various variables before filling the one you actually need. In UWorks we do that for you, without sacrificing any flexibility (if a variable has a usage, we expose it; if it doesn't, we bury it in the background; good examples are the GetFriendAvatar() functions, which return raw pixel data; our wrappers return UTexture2D* because that's the only thing you care about in UE4).

          All that stuff aside, warning hooks require separate implementation, same for initialization/shutdown and running callbacks. All this stuff needs to be easy enough to perform out-of-the-box, but at the same time flexible enough (i.e. people want to use different ports or flags for SteamGameServer_Init()). Again, we take care of that. It's going to be much clearer in a future video which I have planned.

          From a C++ coder's point of view, I can understand why it's your opinion that it's easy to integrate. Maybe you had past experiences which make Steamworks integration look easy (I wouldn't know). Or maybe you just used so many C++ workflows, style guides and "best practices" that it's become easy for you to understand anything. But think of it from the perspective of someone dedicated to UE4's workflow and style guide. Integrating Steamworks would be, objectively, a nightmare, even if only in C++. I'm not going to continue this discussion, as I'd find it useless and still have plenty of work to do on the docs and example project. I hope you'll find I'm right once this plugin is released. If you won't be happy about it, you'll always be able to refund.

          Originally posted by shinyclaw View Post
          But getting to the point - UWorks arrived and I have some questions:

          - The game that our studio is creating requires the standard OnlineSubsystem (NULL) to perform all the multiplayer tasks. We want to use Steam as a server browser, lobby functionality, etc. Now, let's assume that using UWorks I can create a Steam lobby, dedicated server and other Steam stuff WITHOUT creatnig OSS sessions at all. In that way how I can get the players that are in the lobby and send them to the server which should communicate with clients using Sessions from OSS (NULL)? Do you have any methods that connect these two worlds?
          [...I've shortened the quote, I hope you don't mind...]

          We expose all the methods of ISteamMatchmaking and ISteamMatchmakingServers, without exceptions, therefore there's probably a solution for anything you may ever be aiming for.

          The UE4 implementation for servers and lobbies is sort of upside down (they're using lobbies as servers, which is not the workflow required by Steam). I wouldn't reommend anyone to use the OSS implementation as guidelines, regardless of their goals. I'd recommend everyone forgets about it and read the Steamworks documentation on their own. Simply put, there's no custom framework to create a link between OSS and UWorks for various reasons (primarily because we don't agree with the OSS implementation, but also because of the 7, nearly 8, versions gap). We will never support a link between those two. We will, instead, add an OnlineSubsystemUWorks module soon, which will combine the UE4 framework and Steamworks/UWorks properly. Once this OSU is done, you would be able to use the AdvancedSessions plugin from [MENTION=4285]mordentral[/MENTION] to further simplify your life.

          Here's what I think would be the answer to your question:



          [1] Ditch OSS. Only keep it if you really really want cross-subsystem compatibility (i.e. your game is intended for PSN/Steam/FB at the same time; unlikely, but possible).

          [2] You split your UE4 <Server> into 2 servers: <Master Server> and <Gameplay Server>. Your <Master Server> application should use ISteamGameServer to register itself as a server. Use this <master server> to run code which directs your clients to the actual servers on which the gameplay occurs, or the <Gameplay Server>, you'd only register the master on Steamworks.

          [3] Your <client> application would use ISteamMatchmaking/ISteamMatchmakingServers to browser/find your <Master Server> and communicate with it, saying "I want to play", to which your <Master Server> replies "hold on, let's wait for N more players." and then "ok, 10/10 players are full in this lobby that I'm tracking (our of the 1000s I'm tracking at the same time, because I'm a boss), I'll start a server with a particular port and once it booted, I'll inform these clients they can gtfo and connect to it, while giving them the IP and Port so they can use /ExecuteConsoleCommand or whatever".

          In this way, the <Master Server> would be truly lightweight and you won't need to use permanent <Gameplay Servers> as the <Master Servers> boots them as needed (or re-uses them if they're about to be shut down, but it has information about a lobby waiting for a <Gameplay Server>). Our data types support replication so there probably are "hacky" ways of injecting lobby and player information from your client to your server, but I wouldn't recommend that. Just in case you missed this, here's the official Steamworks documentation for matchmaking: https://partner.steamgames.com/docum...on/matchmaking (you'll need to login)



          I'm not entirely sure if this is the answer you were looking for, but it's the best I could think of. If I'm missing something please let me know and I'll try to come up with something better!



          All the best to everyone,
          Vlad

          Comment


            #35
            Purely informative post here:

            The Marketplace team has responded to our submission about a week ago and requested our files. They've also asked for an example project, besides the publicly available video demo so we've been working on it since. Apart from the example project, we've also decided to make some small reorganizations and renaming here and there, which lead to the actual sending of the files being delayed a bit. The current target is this Sunday or Monday evening.

            I'll post some more information after sending the files, perhaps even make a short video showcasing the example project. Stay tuned!

            Comment


              #36
              The files have finally been sent. I've also updated the OP with new images, images which I've sent as part of the product's marketplace presentation.

              Here are 2 example projects (client + server): https://www.dropbox.com/s/dhferck6nn...jects.zip?dl=0

              This is a screenshots from within the projects:

              Click image for larger version

Name:	UWorks_Screenshot1.png
Views:	1
Size:	475.4 KB
ID:	1126995

              There will be a short video coming up soon explaining the details of the example projects.
              Attached Files
              Last edited by vlad.serbanescu11; 04-27-2017, 08:03 PM.

              Comment


                #37
                I forgot to mention in the post above: the server example project requires ports 8766, 27015 and 27016 to be open. Otherwise your server will only show on LAN.

                Comment


                  #38
                  The BPs used to make the example projects are also included in the plugin's /Content folder! You can see how any and all of the features described and shown in the picture above were made!

                  Comment


                    #39
                    This.... is... REALLY awesome, do you know how much of a royal pain in the *** it is to get dedicated servers and steam working with all of this? and this solves it as well as being a clean plugin instead of having to modify 200 engine files, compile the engine and get it all up and running only to realise you got the wrong version of a dll somewhere and it throws up random errors. Please release it soon, you have my vote and I'd buy it on day 1!

                    Comment


                      #40
                      Originally posted by Chaoss View Post
                      This.... is... REALLY awesome, do you know how much of a royal pain in the *** it is to get dedicated servers and steam working with all of this? and this solves it as well as being a clean plugin instead of having to modify 200 engine files, compile the engine and get it all up and running only to realise you got the wrong version of a dll somewhere and it throws up random errors. Please release it soon, you have my vote and I'd buy it on day 1!
                      Thanks! I believe I responded to your FB reply before I saw this reply.

                      I've set up a simple Discord server for anyone who wishes to chat directly: https://discord.gg/9xhY2gr
                      I use Discord daily and I intend for this channel to become a public support channel in time, though at the moment, it may be missing a thing or two (i.e. haven't written anything, not even rules yet).

                      Comment


                        #41
                        Originally posted by vlad.serbanescu11 View Post
                        Thanks! I believe I responded to your FB reply before I saw this reply.

                        I've set up a simple Discord server for anyone who wishes to chat directly: https://discord.gg/9xhY2gr
                        I use Discord daily and I intend for this channel to become a public support channel in time, though at the moment, it may be missing a thing or two (i.e. haven't written anything, not even rules yet).
                        Awesome I'm on the discord

                        Comment


                          #42
                          same On the Discord as well!

                          Comment


                            #43
                            It's nice to see people started joining the Discord server and had the chance to exchange a few ideas!

                            While we're waiting for Epic's reply, here's a sneak peak of the documentation (I'd like to stress this once again: it's not certain that this will be available at release, but very shortly after; that shouldn't concern anyone though, as the structure is very easy to understand and the workflow is very intuitive to grasp):

                            Click image for larger version

Name:	UWorksDocs-01.png
Views:	1
Size:	63.3 KB
ID:	1127675



                            Click image for larger version

Name:	UWorksDocs-02.png
Views:	1
Size:	44.5 KB
ID:	1127676
                            Last edited by vlad.serbanescu11; 05-06-2017, 04:34 PM.

                            Comment


                              #44
                              Another documentation update: https://www.dropbox.com/s/4kbrnk59w1...ation.pdf?dl=1

                              I've started importing my sketches and notes inside a proper Adobe Illustrator file. The "TUTORIALS" and "EXAMPLE PROJECT" categories will be the last to be added due to their complexity, by comparison.

                              Also reworking the entire product presentation and marketing scheme a bit, while waiting on Epic's reply.

                              Comment


                                #45
                                I just uploaded the plugin on Gumroad, Itch and Sellfy (but Sellfy is currently verifying my account because it's new). Here are the links:

                                https://vladserbanescu.itch.io/uworks
                                https://gumroad.com/l/Bvwlc

                                I'm still hoping to receive an approval to post it on Epic's Marketplace, but I haven't heard anything from them in a while now so all I can do is wait.

                                Comment

                                Working...
                                X