Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
Tags

Bulletproof Outlaws

18
Posts
5
Topics
8
Followers
2
Following
A member registered Apr 21, 2016 · View creator page →

Creator of

Recent community posts

I'll run you through it, it's super easy to do it manually and just worked for me (thanks gnysek & yellow!):

  1. Open https://gist.github.com/gnysek/23e3b3c1d082fe7ffe0c6b734617599f in a browser window
  2. Open \scripts\GMLiveAPI\GMLiveAPI.gml from your project's directory in a text editor
  3. Grab line 12 from the patch (except for the + sign at the start) and replace line 23 in in the gml file with it
  4. Grab line 21 from the patch (except for the + sign at the start) and replace line 60 in the gml file with it
  5. Grab lines 30 and 31 from the patch (except for the + sign at the start) and replace lines 67 and 68 with them respectively

Save it and you're done! Good luck!

(1 edit)

Haven't installed GMLive in a while but needed to install it today and in GMS2 Beta (IDE v2022.200.0.0475 and Runtime v2022.200.0.452) it looks like some update by YoYo may have broken some stuff lol

Reproduction steps:

1) Start a new project

2) Tools->Import Local Package

3) Drop obj_gmlive in a room

4) Compile and witness these in the Output window:

Function missing: steam_activate_overlay
Function missing: steam_is_overlay_enabled
Function missing: steam_is_overlay_activated
Function missing: steam_get_persona_name
Function missing: steam_initialised
Function missing: steam_is_cloud_enabled_for_app
Function missing: steam_is_cloud_enabled_for_account
Function missing: steam_file_persisted
Function missing: steam_get_quota_total
Function missing: steam_get_quota_free
Function missing: steam_file_write
Function missing: steam_file_write_file
Function missing: steam_file_read
Function missing: steam_file_delete
Function missing: steam_file_exists
Function missing: steam_file_size
Function missing: steam_file_share
Function missing: steam_is_screenshot_requested
Function missing: steam_send_screenshot
Function missing: steam_is_user_logged_on
Function missing: steam_get_user_steam_id
Function missing: steam_user_owns_dlc
Function missing: steam_user_installed_dlc
Function missing: steam_set_achievement
Function missing: steam_get_achievement
Function missing: steam_clear_achievement
Function missing: steam_set_stat_int
Function missing: steam_set_stat_float
Function missing: steam_set_stat_avg_rate
Function missing: steam_get_stat_int
Function missing: steam_get_stat_float
Function missing: steam_get_stat_avg_rate
Function missing: steam_reset_all_stats
Function missing: steam_reset_all_stats_achievements
Function missing: steam_stats_ready
Function missing: steam_create_leaderboard
Function missing: steam_upload_score
Function missing: steam_upload_score_ext
Function missing: steam_download_scores_around_user
Function missing: steam_download_scores
Function missing: steam_download_friends_scores
Function missing: steam_upload_score_buffer
Function missing: steam_upload_score_buffer_ext
Function missing: steam_current_game_language
Function missing: steam_available_languages
Function missing: steam_activate_overlay_browser
Function missing: steam_activate_overlay_user
Function missing: steam_activate_overlay_store
Function missing: steam_get_user_persona_name
Function missing: steam_get_app_id
Function missing: steam_get_user_account_id
Function missing: steam_ugc_download
Function missing: steam_ugc_create_item
Function missing: steam_ugc_start_item_update
Function missing: steam_ugc_set_item_title
Function missing: steam_ugc_set_item_description
Function missing: steam_ugc_set_item_visibility
Function missing: steam_ugc_set_item_tags
Function missing: steam_ugc_set_item_content
Function missing: steam_ugc_set_item_preview
Function missing: steam_ugc_submit_item_update
Function missing: steam_ugc_get_item_update_progress
Function missing: steam_ugc_subscribe_item
Function missing: steam_ugc_unsubscribe_item
Function missing: steam_ugc_num_subscribed_items
Function missing: steam_ugc_get_subscribed_items
Function missing: steam_ugc_get_item_install_info
Function missing: steam_ugc_get_item_update_info
Function missing: steam_ugc_request_item_details
Function missing: steam_ugc_create_query_user
Function missing: steam_ugc_create_query_user_ex
Function missing: steam_ugc_create_query_all
Function missing: steam_ugc_create_query_all_ex
Function missing: steam_ugc_query_set_cloud_filename_filter
Function missing: steam_ugc_query_set_match_any_tag
Function missing: steam_ugc_query_set_search_text
Function missing: steam_ugc_query_set_ranked_by_trend_days
Function missing: steam_ugc_query_add_required_tag
Function missing: steam_ugc_query_add_excluded_tag
Function missing: steam_ugc_query_set_return_long_description
Function missing: steam_ugc_query_set_return_total_only
Function missing: steam_ugc_query_set_allow_cached_response
Function missing: steam_ugc_send_query

5) And then a crash during compile (note that the "Function missing" list above is different from the crashing function here:

___________________________________________
############################################################################################
ERROR in
action number 1
of Create Event
for object <undefined>:
Variable <unknown_object>.ugc_match_ControllerBindings(100558, -2147483648) not set before reading it.
 at gml_Script_live_preinit_init_consts (line 68) -        l_gmlConstValues=[undefined,pointer_invalid,pointer_null,path_action_stop,path_action_restart,path_action_continue,path_action_reverse,pi,NaN,infinity,GM_build_date,GM_version,GM_runtime_version,timezone_local,timezone_utc,gamespeed_fps,gamespeed_microse
############################################################################################
gml_Script_live_preinit_init_consts (line 68)
gml_Script_live_preinit_api (line 375) -               live_preinit_init_consts();
gml_GlobalScript_GMLive (line 2069) -        live_preinit_api();

6) If I add a line like this based on another post I saw:

#macro ugc_match_ControllerBindings undefined

...then that error clears, but it just goes to the next ugc_match_* function, and then through all the other ugc_* ones. So I made macros for ALL the ugc_* functions incase it's just related to that, and then I got this crash:

___________________________________________
############################################################################################
ERROR in
action number 1
of Create Event
for object <undefined>:
Variable <unknown_object>.lb_disp_time_ms(100558, -2147483648) not set before reading it.
 at gml_Script_live_preinit_init_consts (line 68) -        l_gmlConstValues=[undefined,pointer_invalid,pointer_null,path_action_stop,path_action_restart,path_action_continue,path_action_reverse,pi,NaN,infinity,GM_build_date,GM_version,GM_runtime_version,timezone_local,timezone_utc,gamespeed_fps,gamespeed_microse
############################################################################################
gml_Script_live_preinit_init_consts (line 68)
gml_Script_live_preinit_api (line 375) -               live_preinit_init_consts();
gml_GlobalScript_GMLive (line 2069) -        live_preinit_api();

...and gave up trying to fix it myself lol

Any thoughts?

Woah it's Game Soup!  Hey check your E-Mail I just sent you guys something lol

Also I had this bug too just now, but replacing that line fixed it!

(2 edits)

I tried doing a Local Import into a new project and none of the Include files (the server .exe etc) appear.  I unzipped the .yymps file and they aren't in there either.  When I imported, it said it's been packaged with an earlier version of GMS, so maybe they changed something in how they're packaged?

I notice in my project's .yyp file the IncludedFiles section has a typo of "atafiles" instead of "datafiles":

  "IncludedFiles": [
    {"CopyToMask":-1,"filePath":"atafiles/GMLive","resourceVersion":"1.0","name":"gcmt-dll.dll","resourceType":"GMIncludedFile",},
    {"CopyToMask":-1,"filePath":"atafiles/GMLive","resourceVersion":"1.0","name":"gmlive-server.n","resourceType":"GMIncludedFile",},
    {"CopyToMask":-1,"filePath":"atafiles/GMLive","resourceVersion":"1.0","name":"neko.dll","resourceType":"GMIncludedFile",},
    {"CopyToMask":-1,"filePath":"atafiles/GMLive","resourceVersion":"1.0","name":"gmlive.html","resourceType":"GMIncludedFile",},
    {"CopyToMask":-1,"filePath":"atafiles/GMLive","resourceVersion":"1.0","name":"regexp.ndll","resourceType":"GMIncludedFile",},
    {"CopyToMask":-1,"filePath":"atafiles/GMLive","resourceVersion":"1.0","name":"std.ndll","resourceType":"GMIncludedFile",},
    {"CopyToMask":-1,"filePath":"atafiles/GMLive","resourceVersion":"1.0","name":"gmlive-server.exe","resourceType":"GMIncludedFile",},
  ],

Just wondering if that's some kind of problem just happening on my end, the new GMS vers have given me difficulty with updating extensions lol

(edit): I put the .exe etc from another project that uses GMLive in the /datafiles/GMLive/ dir and fixed the .yyp to properly spell "datafiles" and it all works, but it's probably something to look into!

Haven't run into any side effects yet. It just keeps the live_init from running, but I guess it could go where you spawn the GMLive object even, to make sure it isn't in the game at all.  To switch configs quickly just use the drop-down at the top-right of GM where it has the crosshairs icon. It's faster than adding/removing anything.

(2 edits)

I made a Release config and put these as macros:

//GMLIVE
#macro         live_enabled 1
#macro Release:live_enabled 0

And in obj_gmlive's Create Event I tweaked it like so:

if (live_enabled) {
    live_init(NULL, "http://localhost:5100", "");
}

So when I choose the Release config I don't get the "HttpError:HttpSendRequest: A connection with the server could not be established" message so it seems like it's turned GMLive off

(2 edits)

I notice in the console log that it's spitting out multiple reload messages at once.  I made a brand new project with literally just GMLive imported into it (so the only object is one instance of obj_gmlive placed inside Room1) and when you run it the console Output says:

**********************************.
Entering main loop.
**********************************.
[live][7/28/2020 10:09:06 AM] Ready!
[live][7/28/2020 10:09:07 AM] Reloaded obj_gmlive:Draw_0.
[live][7/28/2020 10:09:07 AM] Reloaded obj_gmlive:Draw_0.
[live][7/28/2020 10:09:07 AM] Reloaded obj_gmlive:Draw_0.
[live][7/28/2020 10:09:07 AM] Reloaded obj_gmlive:Draw_0.

It prints that message from 2-4 times generally.  Interestingly the gmlive-server.exe shows:

ready! 4 live files, 0 globalvars, 1 macro, 0 scripts, 0 enums. Took 76ms (and says 1 client)

And if I just end the program and literally re-run it without changing or doing anything, it goes:

**********************************.
Entering main loop.
**********************************.
[live][7/28/2020 10:09:06 AM] Ready!
[live][7/28/2020 10:09:07 AM] Reloaded obj_gmlive:Draw_0.
[live][7/28/2020 10:09:07 AM] Reloaded obj_gmlive:Draw_0.
ready! *2* live files, 0 globalvars, 1 macro, 0 scripts, 0 enums. Took 56ms (and says 1 client)

So the number of "live files" seems to be random each time it's run. This is a completely empty project so it should be easy to reproduce!

(2 edits)

Ctrl+S is intended as the update button

I wonder if I'm doing Ctrl+S too frequently or something?  I tried just typing "//" and then adding more slashes and pressing CTRL+S randomly and eventually it crashed again.  I'm not doing it any more than I've ever done while using GMLive before GMS2.3 (every 10-30 seconds depending on what I'm coding) but it definitely doesn't crash when I manually reload it (saving a bunch of times but not triggering GM to reload when I do)

but I can look into adding an option that auto-disables the "live" version of function after it errors (so that you would edit it to not error and save to reload).

That would be cool!  The downside to CTRL+S is that you often don't catch errors until they happen, and when they happen with GMLive during a Draw or Step event, the Output window spits a million errors (especially with struct stuff, I've seen some massive like 20 line warnings GMLive dumps in there every step) and then it's like a mad scramble to find the mistyped variable name or forgotten closing bracket or commenting out whatever you just wrote etc to get GMLive to chill so you can calmly look at what caused that madness lol

It feels kind of like working on the public version of a website where you forget a bracket and 500 users suddenly fill your inbox with complaints that the site is broken, VS being able to press a Publish button when you've fully reviewed the code you just wrote and want to publish it to see the result

P.S. I have nothing but love for GMLive's error descriptions btw, they're super informative and have helped me nail down mistakes quickly!  It's just when they're flying up my Output window because an entire stack of them are being spit out every frame that it's like "Ahhh!! Stop!! I gotta find the array that's out of bounds to fix it but now I gotta scroll up an Output window that's constantly filling up with errors like a 90s hacker movie!" lol

(1 edit)

Here's a project, there's barely anything in it and I'm not doing anything crazy code-wise and it's updating every 0.2s which is what I've used on huge projects with tons of stuff going on in pre-GMS2.3

<snip>

But if you run this with a GMLive server running and just kind of fiddle around with the code in the obj_main Draw event and the scr_gui functions...like making changes to a few different functions and the Draw event at once, or just commenting stuff out or un-commenting it back in, adding/removing random draw_texts or draw_rectangles or just typing in general sometimes, and hitting CTRL+S as you go (with properly written code that doesn't give errors, like it's not a big dump of errors causing it), the program seems to hang and crash within a few minutes .

Oddly it's not even right when you press Save or GMLive does something necessarily, like you can just be in the middle of typing and it crashes the game.  The IDE stays alive, just the Runner.exe crashes.  When it freezes up (game screen becomes translucent white), it shows the top and then the bottom error:


GMLive's server doesn't show any information, like it has no idea anything went wrong, and GM's Output window just says:

X://windows/Runner.exe exited with non-zero status (-1073741819)
FAILED: Run Program Complete. For the details of why this build failed, please review the whole log above and also see your Compile Errors window.

...with no detailed explanation or errors shown anywhere.

I'm assuming it's some kind of memory thing, but there doesn't seem to be any consistency of when it happens.   But if I turn GMLive off there's no crashing, or if I bump the live_init time up to like 10s, there's no crashing (I haven't had a single crash with my edit where I manually tell it when to update).

I have no idea if you'll be able to reproduce the bug or not...I can record my screen if that helps lol This has never been a problem before 2.3 and I've put GMLive through the grinder with way more complicated & memory intensive games than this little example file without crashing!

(1 edit)

So psyched to see GMLive working on GMS2.3!  It's not flawless yet but I spent a few days compiling every time I wanted to test something and remembered how painful it was lol Good luck on updating everything!

One thing I've found is putting calls inside static functions blows things up pretty quickly.  When it was just one call per script file I was able to update every 200ms with no problems, but you get like a Button constructor going and then throw some live updates with various arg counts in some onMouseEnter, onMouseClick, draw, doAction etc functions and it crashes the entire app immediately lol

If I drop the update frequency down to like 10+ seconds it stays stable, but then you never knowing when exactly the bus is gonna arrive and you have unpredictable wait times to see the update.

So I tweaked this part:

if (live_request_time != undefined && l_now > live_request_time) {
    live_request_time = undefined;

...and set live_init to undefined in the Create event, then an "if F2's pressed, live_request_time = 200" and now it only updates when I alt-tab to my game and press F2 and get an immediate update.  No more crash worries.

Also no worries about saving as I code and accidentally throwing a million errors into my Output log & scrambling to comment what I wrote out and re-save to stop the madness lol

This would be great as a built-in feature!  Maybe a toggle for auto or manual updating because there are times where you're doing tiny GUI polish adjustments and don't want to have to press a button to update...


Also a tip for GMS2.3 users: With the automatic code-folding you can throw brackets anywhere you want and fold them up, so I just have this in a Snippet:

A - GMLive_args:live_name = "|constructor|:function"; {$    var _i = 0, _Args = array_create(argument_count);$    repeat(argument_count) {_Args[_i] = argument[_i]; _i++;}$    if (live_call_ext(_Args)) {return live_result;}$}
G - GMLive:if (live_call()) {return live_result;}

...which spits out:

live_name = "constructor:function"; {
    var _i = 0, _Args = array_create(argument_count);
    repeat(argument_count) {_Args[_i] = argument[_i]; _i++;}
    if (live_call_ext(_Args)) {return live_result;}
}

...which gives you a folding icon to the left and when you fold it you'll see the "live_name =" part before the bracket so you remember there's GMLive code there but the block doesn't look visually obnoxious lol

Man I'd legitimately have to consider not upgrading to 2.3 without GMLive...the amount of compile time it's saved me and how fast & easy it makes coding would be so hard to pass up even though all the new 2.3 features look incredible.  Deciding between the two would keep me up at night lol

Cool no worries! Just wasn't sure if it got lost in the shuffle with the new shader features etc :)

Just saw the latest update went up!  Have you had a chance to look into this "macro within a macro" bug yet?  https://itch.io/post/1003402  Thanks :)

(1 edit)

Did you have any success figuring this out?  I get the exact same error.  I tried copying all the DLL files from the older version but it still doesn't work.  So it's either in gmlive-server.exe or gmlive-server.n but I have no idea what to do with them.  Running Win 7 64-bit here, GMS2 is all up to date and the older version of GMLive works no problem

EDIT: ok nevermind, this fixed it: https://itch.io/post/1096119 if you have this problem just download that neko.zip file and copy the DLLs to your gmlive directory and it works!  :)

(2 edits)

Macros within macros (even basic ones that don't violate the limitations section in the documentation) and macros that use enums are hopefully being fixed as covered here: https://itch.io/post/1003402 (no pressure Vadim I know this stuff is a pain lol)


But in the meantime I just wanted to share the workaround I'm using for anyone else who's having troubles using GMLive till it's fixed:

1) If you're getting the "Runtime error: macro:KEY_LEFT[L1,c17] `100002` (obj_player) does not have a variable `KEYS`" type errors when you call a macro, just copy the macros used by that particular Event/Script, from wherever you define your macros, and paste them at the top of the Event/Script so you have the same macros defined in two places

2) You won't be able to compile with macros defined in two places, so comment out the macros where you just pasted them and compile

3) Once your game is running and GMLive has loaded, un-comment the pasted duplicate macro definitions at the top of that Event/Script

4) Rejoice and celebrate as you watch your code now work!  You shouldn't need to copy the enum definitions, just the macros, but you'll have to copy whatever macros each macro uses so like:

if (live_call()) {return live_result;}
#macro GAME_CENTER    GAME_X + (GAME_WIDTH / 2)
show_message(GAME_CENTER);//<-- this'll give an error

This would need GAME_X and GAME_WIDTH's macros too like:

if (live_call()) {return live_result;}
#macro GAME_X         0
#macro GAME_WIDTH     1920
#macro GAME_CENTER    GAME_X + (GAME_WIDTH / 2)
show_message(GAME_CENTER);//<-- now this will work

I like to throw the whole thing in a region I can collapse for cleanliness while I work, like the top of my Event will be:

#region gmlive
if (live_call()) {return live_result;}
//#macro GAME_X         0
//#macro GAME_WIDTH     1920
//#macro GAME_CENTER    GAME_X + (GAME_WIDTH / 2)
//#macro KEY_LEFT       KEYS[keys.left]
#endregion
show_message(GAME_CENTER);//<-- this'll give errors when you first run it but
                          //then you un-comment the macro lines and it'll work

Or for Scripts:

#region gmlive
if (argument_count) {
    var argument_arr = array_create(argument_count);
    for (var i = 0; i < argument_count; i++) {argument_arr[i] = argument[i];}
    if (live_call_ext(argument_arr)) return live_result;
} else {
    if (live_call()) {return live_result;}
}
//#macro GAME_X         0
//#macro GAME_WIDTH     1920
//#macro GAME_CENTER    GAME_X + (GAME_WIDTH / 2)
//#macro KEY_LEFT       KEYS[keys.left]
#endregion
show_message(GAME_CENTER);//<-- this'll give errors when you first run it but
                          //then you un-comment the macro lines and it'll work

It's a bit of a pain because if your game crashes or you have to run it again because you've added new events or objects etc, you'll have to comment the duplicate macro definitions out, compile, then un-comment them...but if you're sitting down for a long session of fiddling with UI button layouts or animation tweaks or whatever where you don't have to re-compile this is a pretty fast way to deal with the errors

Hope this helps anyone running into this!

Whipped up a bare-bones project file for you: http://bulletproofoutlaws.com/junk/gmlive_bug.yyz

It's just got an input handler object and a player object.  If everything is inside the player object it'll work, but obviously that's not really practical lol  I'd swear this used to work just fine and doesn't break any of the GMLive complicated macro limitations...it just seems to not be able to find the global array if it's not created inside the object trying to do something with it while using GMLive

Hope that helps narrow it down!

hmmm, could a recent GMS2 update have broken something?  I've run into something similar that I'd swear wasn't happening before.  I'm doing something like:

//obj_main (any event, even a step event)

enum keys {left}

#macro KEYS global.key_array

#macro KEY_LEFT KEYS[keys.left]

//obj_input (step event)

if (live_call()) {return live_result;}

KEYS[keys.left] = keyboard_check(vk_left);

show_debug_message(KEY_LEFT);

...and ending up with errors.  When I try to do anything involving the KEY_LEFT macro it says a variable named 'KEYS' doesn't exist, then if I change the macro to #macro KEY_LEFT global.key_array[keys.left] it instead tells me a variable named 'keys' doesn't exist, but if I make it just plain #macro KEY_LEFT global.key_array[0] then it works just fine

BUT, if I put the enum line and the #macro KEY_LEFT KEYS[key.left] line in the step event above the keyboard_check line in that step event, it suddenly works??

I'd SWEAR I used to be able to do this no problem, it's not doing anything super crazy with the macros, just trying to use another macro pointing to a global and an enum and the fact that once I put the lines in the event doing the "if (live_call())" suggests that it's definitely not a problem for GMLive since it works when I do that.


I checked with some super old versions of my game that I'm 99% sure I was editing this way just fine and now I get the "can't find a variable" thing.  GMS2 has gone through a lot of updates lately, maybe they juggled something around internally and it's messing with globals/enums/macros that's affecting GMLive?

I'll do up a test project for you when I get some downtime, but wanted to rough out this description incase it's related to the same problem as the above poster and incase it gives you an idea of something that could've happened to dig into!

P.S. on the plus side I'm the guy who's GMS2 wasn't letting him drag & drop the GMLive extension on it to install and kept needing a special version to get it to install, and the Import Local Package feature they added a few updates ago totally gets around that problem so it's nice and easy to install in new projects now :)

(2 edits)

Instructions for English/QWERTY people who want to play:

1) Press CTRL+Y to bring up the control config

2) Click the empty "Clavier" box in the 1st column to switch to keyboard controls and bring up the keyboard config

3) The first column is Up, Down, Left, Right and the second column is Shoot, Aim, and probably Select/Start or Start/Select

4) To get the Joystick working I had to click on Joystick 2 instead of Joystick 1 in the 1st column and it uses the Analog stick (the D-Pad isn't supported even on menus) and A as Shoot, B as Aim (X-Box One controller)

5) I had a ton of trouble actually playing it until I found the best way and then it became really fun: hold down the Shoot button and whenever you want to switch directions just move the analog toward the new way you want to shoot and just TAP the Aim button...this keeps you the most agile while allowing you to aim wherever you want!

Once you get the controls set up and play it the way I described (and how the developer probably intended for people to play it) it's actually really fun to play! I wanted to share these instructions just so no one misses out on trying this 'cause it's a really cool game! :)