|
On 12/12/05, John Klimek <jklimek@gmail.com> wrote: > Ok, I understand that I have to store this function in the Lua > registry, but how would I do this from my C/Delphi function? Can you > give me a code example? See the attachment. I've created a simple app (with C++) that allows to register some hypothetic event handler and later calls to registered function. > Also, lets say I have the following code: > > -- Funcion to be executed later > function SayHello() > myNewNpc:SayRoom("Hello everybody!"); > end > > -- Create a new NPC and store it in "myNewNpc" > myNewNpc := NPCManager.New("Bob"); > > -- Create a timer to run the SayHello function in 10 seconds > local eventId = mud:onTimer(10, SayHello); > > -- end of lua script > > > What would the code look like (in C/Delphi) for the onTimer function? > Also, if I store my function SayHello in the Lua registry and execute > it later, won't it lose the value of myNewNpc and then throw an error? > Would I have to modify my function to something like this: No, you don't have to. A global variable are always visible and persistent - once you have declared it - it there until you remove it, even if the script body finished running. Actually lua-based ini files parsers - work line this - some variable are declared in script and host app exectues the script body, and read the global variables afterwards. Note the 'a' gloval variable in attached example. > function SayHello() > myNewNpc = NPCManager.GetNPC("Bob"); > myNewNpc:SayRoom("Hello everybody!"); > end Here you actually modify (or create) _global_ variable "myNewNpc". If you wanted to create local variable, you should have written: function SayHello() local myNewNpc = NPCManager.GetNPC("Bob"); myNewNpc:SayRoom("Hello everybody!"); end > On 12/11/05, Pavel Antokolsky aka Zigmar <zigmar@gmail.com> wrote: > > On 12/10/05, John Klimek <jklimek@gmail.com> wrote: > > > > > Zigmar, can you explain what you mean when you say "register a > > > function itself, not its name"? > > Functions are first-class objects in lua, and therefore function can > > get another function as parameter, functions can be stored in > > variables, etc. So what I mean, as the function that registers event, > > can receive not the name of the function (which therefor must be > > global) but a function object itself. It allows you to pass local > > function, function stored in some tables or even anonymous function > > (as I wrote in example) > > > > > For example, in your lua code you have: > > > mud.onTimer(10, function() npc:say("Hello") end ) > > > > > > It looks like mud is a table filled with cfunctions. Am I right? > > Yep. It probably some library filled with function that gives you a > > connectivity to your host application (mud server). For example > > queries about different statuses, registering/removing events, > > spawning monsters, etc. > > > > > Furthermore it looks like you are calling this cfuntion (wherever > > > mud.onTimer is mapped) and passing it a lua function parameter. Am I > > > right on this as well? > > Exactly. onTimer is a function that registers user event and calls > > it with specific interval. > > > > > If so, how would you declare the cfunction > > > onTimer that would handle this input? > > Just like any other cfunction - you just handle the parameters on > > stack in appropriate way. The tricky thing is that you can non pop and > > store function object in C-app as you can do with strings. The > > function has to be stored inside lua state itself. To do this, you can > > use "registry". > > > > > Delphi examples are preferred > > > but C/C++ will work too =) > > Here is an excelent explanation, along with code examples > > http://www.lua.org/pil/27.3.html > > > > BTW, I thought that it might be a good idea, that event registration > > function will return some kind of event id (integral or whatever), so > > it can be used later to remove that event notification. > > > > For example: > > > > local eventId = mud.onTimer(10, someFunc); > > .... > > mud.removeEvent(eventId); -- or maybe "removeTimerEvent"? > > --from now on someFunc will not be called anymore > > > > > > Also there should be some functionality to allow to reset all event > > notifications. > > > > > > > Thanks!! > > You are welcome :) > > > > > On 12/9/05, Pavel Antokolsky aka Zigmar <zigmar@gmail.com> wrote: > > > > Just an idea - I think it will be much more convinient and flexible to > > > > register a function itself, not its name. Then, you can write > > > > something like: > > > > > > > > -- Every ten seconds > > > > mud.onTimer(10, function() npc:say("Hello") end ) > > > > > > > > This system can be also extended to handle different events. For example: > > > > mud:onRoomEnter("main", function(who,where) npc:say("Hello, " .. > > who.name) end ) > > > > it can be, for example, extended to handle rooms with masks > > > > mud:onRoomEnter("dungeon_*", > > > > function(who, where) > > > > if where:name != "dungen_saferoom" then > > > > local monster = mud:spawn("monster",where) > > > > monter:attack(who) > > > > end > > > > end > > > > ) > > > > > > > > And so on... I can't even think of all possibilites with such system :) -- Best regards, Zigmar
Attachment:
lua_event_test.cpp
Description: Binary data
Attachment:
event_test.lua
Description: Binary data