lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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?

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:

function SayHello()
  myNewNpc = NPCManager.GetNPC("Bob");
  myNewNpc:SayRoom("Hello everybody!");
end

Thanks again!


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
>