Help with string.match (SOLVED)


i tryed string.match(s,"\(.*?)\]") for [/collection2/go] but it returns nil
i need /collection2/go



You should not use string manipulation on hash and URL objects as that doesn’t work in release builds.

1 Like


Ok, but i use the monarch and when: menu->game and after game->menu->game, url of game changes and i can’t use object factory for spawn, couse i don’t know new adress



If you have an object with id game in your scene it should always be reachable with the the URL /game from inside the collection itself.

If game is instead created by a factory then you should be able to capture the ID returned by create().

1 Like


Yes, this is good, but i need have access to factory :rofl::rofl::rofl:. And factory adress changes by monarch and i am don’t have new adress, what i need to do?

1 Like


Do you want to send messages to a script that is in you game collection?

One way to do this is by storing the urls with something like this

local url = require "utils.url" -- Path to the gist

-- game.script | The script in the collection you want to send a message to
function init(self)
  url.GAME = msg.url()

function on_message(self, message_id, message)
  if message_id == hash("something_happend") then
    -- do something

-- other.script | In any script you want to send a message from
function init(self), "something_happend")

1 Like


You need to explain in detail what it is you wish to do. I assume the following:

  • You are using Monarch to load screens. You are using Collection Proxies to load the screens.
  • In a loaded screen (ie collection) you have a game object containing a factory.
  • You want to use the factory to spawn a game object
  • You do not know how to address the factory in your call to factory.create()

Is this correct?



Yes, shure, and the adress that i pass to factory.create changes in ever i change a screen( and i don’t know how to bring new adress



No. If you are loading the screen using a collection proxy the URL will always be the same. If you have a collection with id foo containing a game object boo and a factory with id zoo then the URL to the factory will always be foo://boo#zoo.

If you are using a collection factory to create the screen then the URL will change every time.



after called it. The adress of game changes.

and after it i can’t use my adresses. ;((
game changes collection2 -> collection5



Can you please share the project? Either here or with me (






I took a look at the project and you are in fact using collection factories for the screens and not collection proxies:


If you change from collection factory to collection proxy and change from screen_factory.script to screen_proxy.script you will always get the same URL to your screens.

Another thing to note is that you are using the absolute URL when posting the messages in question:

GAMESCREEN = "main:/collection2/go#gameMain", "stopGame")

There is no need for this. The script that is posting the message (game.gui_script) is on the same game object as the receiver (gameMain.script). It is enough to change GAMESCREEN to:

GAMESCREEN = "go#gameMain", "stopGame")

You can even write:

GAMESCREEN = "#gameMain", "stopGame")


wow, your my hero

1 Like


and one more moment. You said that i need more local functions. but i have problem with it. timer.delay can’t call local functions, it want’s only global.



Sure it can. You must make sure the function is declared before you pass it to the timer callback or invoke it from within your timer callback.

1 Like


thank you