SteamworksPy icon indicating copy to clipboard operation
SteamworksPy copied to clipboard

SetStat always fails

Open dilpil opened this issue 4 years ago • 11 comments

SetStatInt fails every time, returning false and printing no other info. Is there any way to debug whats going on?

My code is:

from steamworks import STEAMWORKS()
sw = STEAMWORKS()
sw.initialize()
sw.RequestCurrentStats()
sw.SetStat('wins', 1)

I've also tried calling

sw.run_callbacks()

which produces the following error each time:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-18-b1942092c4aa> in <module>
----> 1 sw.run_callbacks()

C:\PythonRL\steamworks\__init__.py in run_callbacks(self)
    191             raise SteamNotLoadedException('STEAMWORKS not yet loaded')
    192
--> 193         self.RunCallbacks()
    194         return True
    195

AttributeError: 'STEAMWORKS' object has no attribute 'RunCallbacks'

I feel like I must be doing something fundamentally incorrect here, but I have no idea what it might be.

dilpil avatar Apr 20 '20 11:04 dilpil

Hey there. Hmm, I wonder if the stats issue has to do with the restructuring of the module. I assume you have "wins" set up in your Steamworks back-end. You should be able to run SetStats outside of the Steam client still.

Is it possible to try a simple test like you have using the legacy branch? I can attempt a test of the newer module system this week.

As for the callbacks issue, it seems a little odd it would raise the exception yet still try to run callbacks. Also I don't see the actual RunCallbacks function anywhere... so that needs fixed.

Thanks for bringing this all up and let me know if you can do the legacy branch test; and if so what happens!

Gramps avatar Apr 20 '20 16:04 Gramps

Hmm so with the legacy branch I get an error on calling Steam.initialize():

On Mon, Apr 20, 2020 at 12:37 PM GP Garcia [email protected] wrote:

Hey there. Hmm, I wonder if the stats issue has to do with the restructuring of the module. I assume you have "wins" set up in your Steamworks back-end. You should be able to run SetStats outside of the Steam client still.

Is it possible to try a simple test like you have using the legacy branch? I can attempt a test of the newer module system this week.

As for the callbacks issue, it seems a little odd it would raise the exception yet still try to run callbacks. Also I don't see the actual RunCallbacks function anywhere... so that needs fixed.

Thanks for bringing this all up and let me know if you can do the legacy branch test; and if so what happens!

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Gramps/SteamworksPy/issues/38#issuecomment-616670441, or unsubscribe https://github.com/notifications/unsubscribe-auth/AANRKFCRZTJVNIJPVEGFMYDRNR24NANCNFSM4MMLMZSQ .

dilpil avatar Apr 23 '20 12:04 dilpil

Ah dammit I hit the wrong set of keys ignore this until I finish this very long email

On Thu, Apr 23, 2020 at 8:28 AM Dylan White [email protected] wrote:

Hmm so with the legacy branch I get an error on calling Steam.initialize():

On Mon, Apr 20, 2020 at 12:37 PM GP Garcia [email protected] wrote:

Hey there. Hmm, I wonder if the stats issue has to do with the restructuring of the module. I assume you have "wins" set up in your Steamworks back-end. You should be able to run SetStats outside of the Steam client still.

Is it possible to try a simple test like you have using the legacy branch? I can attempt a test of the newer module system this week.

As for the callbacks issue, it seems a little odd it would raise the exception yet still try to run callbacks. Also I don't see the actual RunCallbacks function anywhere... so that needs fixed.

Thanks for bringing this all up and let me know if you can do the legacy branch test; and if so what happens!

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Gramps/SteamworksPy/issues/38#issuecomment-616670441, or unsubscribe https://github.com/notifications/unsubscribe-auth/AANRKFCRZTJVNIJPVEGFMYDRNR24NANCNFSM4MMLMZSQ .

dilpil avatar Apr 23 '20 12:04 dilpil

With the legacy branch I get:

OSError Traceback (most recent call last) in ----> 1 steamworks.Steam.Init()

C:\PythonRL\steamworks.py in Init() 93 print("ERROR: Steam is not running") 94 # Boot up the Steam API ---> 95 InitializeResult = Steam.cdll.SteamInit() 96 if InitializeResult == 1: 97 print("INFO: Steamworks initialized!")

OSError: exception: access violation reading 0x0000000000000000

But before I go down that rabbit hole, going back to the non legacy version-

Other calls seem to work. I can check my user id, app id, and steam player level for instance.

Looking at the documentation for stats I found this:

*You must always call this first to get the initial status of stats and achievements.Only after the resulting callback comes back can you start calling the rest of the stats and achievement functions for the current user. *

Does this mean my inability to call run_callbacks is what prevents me from getting and setting stats?

Better yet- is there working example code somewhere of stats and achievements? I suspect I've gotten something wrong, though I'm not sure what.

-Dylan

On Thu, Apr 23, 2020 at 8:29 AM Dylan White [email protected] wrote:

Ah dammit I hit the wrong set of keys ignore this until I finish this very long email

On Thu, Apr 23, 2020 at 8:28 AM Dylan White [email protected] wrote:

Hmm so with the legacy branch I get an error on calling Steam.initialize():

On Mon, Apr 20, 2020 at 12:37 PM GP Garcia [email protected] wrote:

Hey there. Hmm, I wonder if the stats issue has to do with the restructuring of the module. I assume you have "wins" set up in your Steamworks back-end. You should be able to run SetStats outside of the Steam client still.

Is it possible to try a simple test like you have using the legacy branch? I can attempt a test of the newer module system this week.

As for the callbacks issue, it seems a little odd it would raise the exception yet still try to run callbacks. Also I don't see the actual RunCallbacks function anywhere... so that needs fixed.

Thanks for bringing this all up and let me know if you can do the legacy branch test; and if so what happens!

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Gramps/SteamworksPy/issues/38#issuecomment-616670441, or unsubscribe https://github.com/notifications/unsubscribe-auth/AANRKFCRZTJVNIJPVEGFMYDRNR24NANCNFSM4MMLMZSQ .

dilpil avatar Apr 23 '20 12:04 dilpil

As for legacy, it would require the older version of SteamworksPy.dll, I think. Which may or may not be the cause of that issue.

As far as examples, I pulled up my seven year old Python game to check and here are some relevant code chunks:

# Boot up Steam stuff
Steam.Init()
STEAM_NAME = SteamFriends.GetPlayerName()
STEAM_FRIENDS = SteamFriends.GetFriendCount()
SteamUserStats.RequestCurrentStats()

My first Python game project did not use callbacks and I was able to use stats and achievements fine. Making the call to RequestCurrentStats doesn't really need a callback; the callback just let's you know the call was successful or not, though it is generally a good idea to wait for a response before doing anything after that.

Here is setting stats and achievements, StoreStats is required for Steam to recognize either has happened:

SteamUserStats.SetStat('saboteurs', pc.BEEN_SABOTEUR)
SteamUserStats.SetAchievement(boot.ACHIEVE_NAME)

# Save statistics to Steam
SteamUserStats.StoreStats()

Here is getting stats and achievements:

pc.ASPIRIN_TOTAL = SteamUserStats.GetStatInt('immune_pills_all')

if SteamUserStats.GetAchievement('ACHIEVEMENT_1'):
		pc.ACHIEVEMENTS[1] = 'y'

Hopefully that helps.

Right now I am going through and updating SteamworksPy to 2.1, which is a rather large update including a lot of new stuff. Callbacks is one of them. As I don't make games in Python anymore, testing might be a bit tricky, though I wager I can still use my exist Steam games with Python in test.

Gramps avatar Apr 23 '20 20:04 Gramps

Ooooo ok heres whats going on. I turned on the ipc logging in the steam call and saw that the output was this:

00004226 python.exe:327684 > IClientUserStats::SetStat( 0, "w", 1, ) = 0,

Which was weird, because I was calling SetStat("wins", 1), not SetStat("w", 1)

So I changed the steamworks backend to have a stat called "w" instead of wins and tried setting "w" to 1 instead.

That worked!

So I think the string being passed into SetStat is being truncated to 1 character somehow.

-Dylan

On Thu, Apr 23, 2020 at 4:20 PM GP Garcia [email protected] wrote:

As for legacy, it would require the older version of SteamworksPy.dll, I think. Which may or may not be the cause of that issue.

As far as examples, I pulled up my seven year old Python game to check and here are some relevant code chunks:

Boot up Steam stuff

Steam.Init() STEAM_NAME = SteamFriends.GetPlayerName() STEAM_FRIENDS = SteamFriends.GetFriendCount() SteamUserStats.RequestCurrentStats()

My first Python game project did not use callbacks and I was able to use stats and achievements fine. Making the call to RequestCurrentStats doesn't really need a callback; the callback just let's you know the call was successful or not, though it is generally a good idea to wait for a response before doing anything after that.

Here is setting stats and achievements, StoreStats is required for Steam to recognize either has happened:

SteamUserStats.SetStat('saboteurs', pc.BEEN_SABOTEUR) SteamUserStats.SetAchievement(boot.ACHIEVE_NAME)

Save statistics to Steam

SteamUserStats.StoreStats()

Here is getting stats and achievements:

pc.ASPIRIN_TOTAL = SteamUserStats.GetStatInt('immune_pills_all')

if SteamUserStats.GetAchievement('ACHIEVEMENT_1'): pc.ACHIEVEMENTS[1] = 'y'

Hopefully that helps.

Right now I am going through and updating SteamworksPy to 2.1, which is a rather large update including a lot of new stuff. Callbacks is one of them. As I don't make games in Python anymore, testing might be a bit tricky, though I wager I can still use my exist Steam games with Python in test.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Gramps/SteamworksPy/issues/38#issuecomment-618644522, or unsubscribe https://github.com/notifications/unsubscribe-auth/AANRKFBWF4KOU4ZGOU3C4XTROCPJTANCNFSM4MMLMZSQ .

dilpil avatar Apr 28 '20 12:04 dilpil

Hmm, that is definitely a truncation issue. I know in C++ that'll happen if you use the wrong quotes; ' instead of " will not allow multiple characters.

Since we have a direct cause, that'll make it easy to solve and I'll make sure it is in the update I'm working on. Thanks for the info!

Gramps avatar Apr 28 '20 16:04 Gramps

I figured out what was going on- Python 3 auto encodes strings as unicode. Ctypes deals in ascii.

The following works fine:

` from steamworks import STEAMWORKS()

sw = STEAMWORKS()

sw.initialize()

sw.RequestCurrentStats()

sw.SetStat('wins'.encode('ascii'), 1)

`

dilpil avatar Jun 16 '20 14:06 dilpil

Huh, somewhat convenient it does that but not with Ctypes! That's really good to know and will help fix a few other things that don't quite work correctly. Good find!

Gramps avatar Jun 16 '20 16:06 Gramps

This also occurs with GetStat - would it be possible to have both GetStat functions and the SetStat function always encode the name variable as ascii?

def SetStat(self, name: str, value: object) -> bool:
        """Set a statistic
        :param name: str
        :param value: float, int
        :return:
        """
        if isinstance(value, float):
            return self.steam.SetStatFloat(name.encode('ascii'), value)

        elif isinstance(value, int):
            return self.steam.SetStatInt(name.encode('ascii'), value)

        else:
            raise UnsupportedSteamStatValue("SetStat value can be only int or float")

sudasana avatar Aug 30 '20 07:08 sudasana

Definitely. If one is changed then it's partner should be changed too.

Gramps avatar Aug 30 '20 16:08 Gramps