ThreadBoard ArchivesSite FeaturesActiveworlds SupportHistoric Archives |
2 questions. (Sdk)
2 questions. // Sdkx@x.com (xelag)Nov 10, 1998, 12:40pm
I use vb6.0 and have managed to login 3 bots at a time, roughly
following the greeter bot script (no greetings i'm afraid). I have 2 questions at the moment. Can anyone help explaining these matter?. 1. Whether i log in 1 or more bots, they disappear from the world (Beta GZ) after some time, about a minute. Their instance number is still valid (selectable) but they are gone. The only way to get them back on stage is to select one of the bots with rc = aw_instance_set(<instance number>) and start from aw_enter(.World,0) to aw_state_changed() all over again. Strangely enough, this method sometimes gets all three bots back, even if I only explicitely select one of them and bring it back. The sequence i follow to create the bots is this one: rc = aw_create("auth.activeworlds.com", 5670, Inst) rc = aw_int_set(AW_LOGIN_OWNER, .LoginOwner) rc = aw_string_set(AW_LOGIN_PRIVILEGE_PASSWORD, .PrivilegePassword) rc = aw_string_set(AW_LOGIN_APPLICATION, ApplicationName) rc = aw_string_set(AW_LOGIN_NAME, .Caption) rc = aw_login() rc = aw_enter(.World, 0) rc = aw_int_set(AW_MY_X, .we) rc = aw_int_set(AW_MY_Z, .ns) rc = aw_int_set(AW_MY_Y, .Altitude) rc = aw_int_set(AW_MY_YAW, .Rotation) rc = aw_int_set(AW_MY_TYPE, .Avatar) rc = aw_int_set(AW_MY_GESTURE, .Gesture) rc = aw_state_change() Call aw_say("Hi, I'm " & .Caption & ", a VB6.0 freak...") 2. I cant seem toget char* aw_string (AW_ATTRIBUTE a) working in VB6. The code I use Public Declare Function aw_string Lib "aw.dll" (ByVal awAttribute As AW_ATTRIBUTE) As String is useless, although a similar syntax for aw_int() works ok. I think it is because this is the only function retuning a string. Is there any workaround? <wishfull thinking> Maybe having a function with no return value that accepts a fixed length string as parameter, as in Kernel's GetPrivateProfileString. TIA. XelaG, agrigny at xs4all.nl canopusNov 10, 1998, 3:02pm
When I read your previous message, I noticed you were having some of the
same problems I faced when converting the AWAPI from C to Object Pascal for Delphi programmers. (Like the C use of 0 to mean nil.) I had never actually tried to field multiple bot instances, so I wondered if that part of the Delphi AWAPI would actually work, since it gave aw_create a third parameter that is a Pointer to an untyped Pointer, and you said that in VB, a simple variable parameter worked better. (Also that aw_instance_set should be passed an untyped value.) I don't know if it is relevant, but I did roughly the same program as the one you describe (based on the multibot SDK document), and the three bot avatars appeared, said their speeches, and then hung around until I finally pressed the Stop button to aw_destroy each of them. Believe me, I don't know why the C version of aw_create insists upon being passed the address of an untyped Pointer, but at least it works. (In Pascal, you can't pass a nil into a parameter coded as var {=ByRef} or const, so I had to declare the parameter as a Pointer to an untyped Pointer.) [View Quote] > I use vb6.0 and have managed to login 3 bots at a time, roughly > following the greeter bot script (no greetings i'm afraid). I have 2 > questions at the moment. Can anyone help explaining these matter?. > > 1. > Whether i log in 1 or more bots, they disappear from the world (Beta > GZ) after some time, about a minute. Their instance number is still > valid (selectable) but they are gone. The only way to get them back on > stage is to select one of the bots with > rc = aw_instance_set(<instance number>) > and start from aw_enter(.World,0) to aw_state_changed() all over > again. > Strangely enough, this method sometimes gets all three bots back, even > if I only explicitely select one of them and bring it back. > > The sequence i follow to create the bots is this one: > > rc = aw_create("auth.activeworlds.com", 5670, Inst) > rc = aw_int_set(AW_LOGIN_OWNER, .LoginOwner) > rc = aw_string_set(AW_LOGIN_PRIVILEGE_PASSWORD, .PrivilegePassword) > rc = aw_string_set(AW_LOGIN_APPLICATION, ApplicationName) > rc = aw_string_set(AW_LOGIN_NAME, .Caption) > rc = aw_login() > > rc = aw_enter(.World, 0) > rc = aw_int_set(AW_MY_X, .we) > rc = aw_int_set(AW_MY_Z, .ns) > rc = aw_int_set(AW_MY_Y, .Altitude) > rc = aw_int_set(AW_MY_YAW, .Rotation) > rc = aw_int_set(AW_MY_TYPE, .Avatar) > rc = aw_int_set(AW_MY_GESTURE, .Gesture) > rc = aw_state_change() > Call aw_say("Hi, I'm " & .Caption & ", a VB6.0 freak...") > > 2. > I cant seem toget char* aw_string (AW_ATTRIBUTE a) working in VB6. The > code I use > Public Declare Function aw_string Lib "aw.dll" (ByVal awAttribute As > AW_ATTRIBUTE) As String > is useless, although a similar syntax for aw_int() works ok. I think > it is because this is the only function retuning a string. Is there > any workaround? <wishfull thinking> Maybe having a function with no > return value that accepts a fixed length string as parameter, as in > Kernel's GetPrivateProfileString. > > TIA. XelaG, agrigny at xs4all.nl walter knupeNov 10, 1998, 3:05pm
Xelag,
XelaG schrieb in Nachricht <36484701.31444845 at news.activeworlds.com>... > I use vb6.0 and have managed to login 3 bots at a time, roughly >following the greeter bot script (no greetings i'm afraid). I have 2 >questions at the moment. Can anyone help explaining these matter?. > >1. >Whether i log in 1 or more bots, they disappear from the world (Beta >GZ) after some time, about a minute. Their instance number is still >valid (selectable) but they are gone. I found my bots to dissappear if i don't call aw_wait anymore.... It happens in my C++ programm when i am debugging it and keeping it on hold on a breakpoint. so make sure you have some kind of mainloop that calls aw_init().... i do this using a WM_TIMER and calling aw_wait(10); in there, about once a second. >2. >I cant seem toget char* aw_string (AW_ATTRIBUTE a) working in VB6. The >code I use >Public Declare Function aw_string Lib "aw.dll" (ByVal awAttribute As >AW_ATTRIBUTE) As String >is useless, although a similar syntax for aw_int() works ok. I think >it is because this is the only function retuning a string. Is there >any workaround? <wishfull thinking> Maybe having a function with no >return value that accepts a fixed length string as parameter, as in >Kernel's GetPrivateProfileString. i have no clue there since I am not into VB. but char * is a common expressions for API functions as well i think. For example, lstrcpy is a WIN32 function (exported from kernel32.dll) and it returns a string pointer like that. So see if you can find a declaration for that one and use it to create your proper aw_string prototype. Walter canopusNov 10, 1998, 5:46pm
In earlier versions of VB, you could get round VB's preference for VB
strings by providing a fixed-length string that was long enough to hold whatever was returned by a C DLL function (Dim ReceiverString As String * 255, or ReceiverString = String(255,0)). VB would convert VB string parameters to C strings if you declared them ByVal, but that only worked for passing strings TO a C DLL, not for getting them FROM a C DLL. It was up to you to find the ASCII Zero that C uses to mark the end of a returned string. Don't know if this is still true. Walter Knupe's idea about aw_wait is worth trying, as some callback events seem to depend on it. But the Delphi version of the multibot program worked without any mention of aw_wait (it just had a "repeat...until Stop" loop). [View Quote] > I use vb6.0 and have managed to login 3 bots at a time, roughly > following the greeter bot script (no greetings i'm afraid). I have 2 > questions at the moment. Can anyone help explaining these matter?. > > 1. > Whether i log in 1 or more bots, they disappear from the world (Beta > GZ) after some time, about a minute. Their instance number is still > valid (selectable) but they are gone. The only way to get them back on > stage is to select one of the bots with > rc = aw_instance_set(<instance number>) > and start from aw_enter(.World,0) to aw_state_changed() all over > again. > Strangely enough, this method sometimes gets all three bots back, even > if I only explicitely select one of them and bring it back. > > The sequence i follow to create the bots is this one: > > rc = aw_create("auth.activeworlds.com", 5670, Inst) > rc = aw_int_set(AW_LOGIN_OWNER, .LoginOwner) > rc = aw_string_set(AW_LOGIN_PRIVILEGE_PASSWORD, .PrivilegePassword) > rc = aw_string_set(AW_LOGIN_APPLICATION, ApplicationName) > rc = aw_string_set(AW_LOGIN_NAME, .Caption) > rc = aw_login() > > rc = aw_enter(.World, 0) > rc = aw_int_set(AW_MY_X, .we) > rc = aw_int_set(AW_MY_Z, .ns) > rc = aw_int_set(AW_MY_Y, .Altitude) > rc = aw_int_set(AW_MY_YAW, .Rotation) > rc = aw_int_set(AW_MY_TYPE, .Avatar) > rc = aw_int_set(AW_MY_GESTURE, .Gesture) > rc = aw_state_change() > Call aw_say("Hi, I'm " & .Caption & ", a VB6.0 freak...") > > 2. > I cant seem toget char* aw_string (AW_ATTRIBUTE a) working in VB6. The > code I use > Public Declare Function aw_string Lib "aw.dll" (ByVal awAttribute As > AW_ATTRIBUTE) As String > is useless, although a similar syntax for aw_int() works ok. I think > it is because this is the only function retuning a string. Is there > any workaround? <wishfull thinking> Maybe having a function with no > return value that accepts a fixed length string as parameter, as in > Kernel's GetPrivateProfileString. > > TIA. XelaG, agrigny at xs4all.nl roland vilettNov 10, 1998, 10:01pm
Are you calling aw_wait() at all? You must call aw_wait() in order to
receive any events. Also, aw_wait() periodically sends heartbeats to the servers so they know your bot is still alive. I assume the reason your bots are vanishing is that you are not calling aw_wait(), so after about a minute the world server gives up on your bots and disconnects them. After setting up your bots, your program should spend the majority of its time in a loop calling aw_wait(), as demonstrated in the sample programs. -Roland [View Quote] canopusNov 10, 1998, 10:41pm
Yep, after about two and a half minutes of SDK inactivity, the server did
finally erase my three bots. (Watching them go through calisthenic routines one after the other was worth the wait.) What if I don't use aw_wait and instead give bot commands? Will the server erase them anyway? And how long is "-1" milliseconds (in one of the examples)? [View Quote] > Are you calling aw_wait() at all? You must call aw_wait() in order to > receive any events. Also, aw_wait() periodically sends heartbeats to the > servers so they know your bot is still alive. I assume the reason your bots > are vanishing is that you are not calling aw_wait(), so after about a minute > the world server gives up on your bots and disconnects them. > > After setting up your bots, your program should spend the majority of its > time in a loop calling aw_wait(), as demonstrated in the sample programs. > > -Roland > [View Quote] x@x.com (xelag)Nov 11, 1998, 1:20am
No, I wasn't calling aw_wait. I don't use a loop as such, the windows
form just sits and waits for events to pour on it. I wrongly assumed that since i cant get events from the server using VB6 anyway, aw_wait() was unnecessary. Facter (Walter) first put me on the right track: use a timer object instead of a loop, set the Timer.Interval to 1 second, and let the timer call aw_wait(10) i.e. for 10 milliseconds every minute. Thanks for your explanation about how aw_wait() works. On Tue, 10 Nov 1998 16:01:23 -0800, "Roland Vilett" <roland at lmi.net> [View Quote] >Are you calling aw_wait() at all? You must call aw_wait() in order to >receive any events. Also, aw_wait() periodically sends heartbeats to the >servers so they know your bot is still alive. I assume the reason your bots >are vanishing is that you are not calling aw_wait(), so after about a minute >the world server gives up on your bots and disconnects them. > >After setting up your bots, your program should spend the majority of its >time in a loop calling aw_wait(), as demonstrated in the sample programs. > >-Roland > [View Quote] x@x.com (xelag)Nov 11, 1998, 1:33am
On Tue, 10 Nov 1998 14:46:04 -0500, Canopus <aek2 at ix.netcom.com>
[View Quote] I sort of tried that trick today, i'll try it later again more systematically. It didn't work. Wat VB does fine is using a string of a sufficient length as an argument to an api, for instance, GetPrivateProfileString uses that method. Searching for ascii zero is unnecessary, VB shortens the string to the right VB-length, so you can't use a constant which has fixed length. What i don't yet know is if this also works for a returned string. I've noticed awapi has AW_MAX_ATTRIBUTE_LENGTH = 255& which i declared Public Const. That didn't work. I'll retry later. >In earlier versions of VB, you could get round VB's preference for VB >strings by providing a fixed-length string that was long enough to hold >whatever was returned by a C DLL function (Dim ReceiverString As String * >255, or ReceiverString = String(255,0)). VB would convert VB string >parameters to C strings if you declared them ByVal, but that only worked >for passing strings TO a C DLL, not for getting them FROM a C DLL. It was >up to you to find the ASCII Zero that C uses to mark the end of a returned >string. Don't know if this is still true. > >Walter Knupe's idea about aw_wait is worth trying, as some callback events >seem to depend on it. But the Delphi version of the multibot program >worked without any mention of aw_wait (it just had a "repeat...until Stop" >loop). See my thread to Roland about this. Thanks for your answer. > [View Quote] x@x.com (xelag)Nov 11, 1998, 1:52am
Facter, thanks for your posting and the online help this afternoon.
Its stable now with 2 SDK bots, the 3rd one crashes the syten. (and I had my 2 other Hambots there at the same time, I thought the limit was 3). Got the forward/ back/ sidewards/ up/ down and turning around movements ready, sorted out the trigonometry this evening. Next: climbing at an angle, random-walking and figure-skating! I can also have him say through keyboard input, I'm working on the teleport option now and trimming the GUI. Pity he can't interact. On Tue, 10 Nov 1998 18:05:55 +0100, "Walter Knupe" <wak at faber.ping.de> [View Quote] >Xelag, > >XelaG schrieb in Nachricht <36484701.31444845 at news.activeworlds.com>... > >I found my bots to dissappear if i don't call aw_wait anymore.... > >It happens in my C++ programm when i am debugging it and keeping it on hold >on a breakpoint. > >so make sure you have some kind of mainloop that calls aw_init().... i do >this using a WM_TIMER and calling aw_wait(10); in there, about once a >second. > > > >i have no clue there since I am not into VB. but char * is a common >expressions for API functions as well i think. >For example, lstrcpy is a WIN32 function (exported from kernel32.dll) and it >returns a string pointer like that. So see if you can find a declaration for >that one and use it to create your proper aw_string prototype. > >Walter > > roland vilettNov 11, 1998, 3:08am
If you are using callbacks for all your methods (i.e. asynchronous mode)
then your app must call aw_wait() periodically or the heartbeats won't get sent and your bots will get disconnected, but in this case of course you must call aw_wait() anyway or your callbacks won't get called either. In synchronous mode, any of the methods that can have a callback installed (e.g. aw_query(), aw_object_add(), etc.) will do an implicit aw_wait() and thus heartbeats will get sent. However most of the common API methods don't have callbacks and thus will not call aw_wait() when you call them. It's only dawning on me now that this wasn't made clear in the SDK docs. I'll remedy that oversight as soon as possible... Calling aw_wait() with any negative time value means "wait infinitely". In other words, aw_wait (-1); is equivalent to for (;;) aw_wait (1000); -Roland [View Quote] facterNov 11, 1998, 3:49am
> No, I wasn't calling aw_wait. I don't use a loop as such, the windows
> form just sits and waits for events to pour on it. I wrongly assumed > that since i cant get events from the server using VB6 anyway, > aw_wait() was unnecessary. Facter (Walter) first put me on the right Me and Walt are different people Xela =)) Fac. x@x.com (xelag)Nov 11, 1998, 10:14am
Canopus, i made a mistake in my previous posting: windows does require
an ascii zero check,as you said, doesn't conveniently clip the string. It's just that I use a constantly a routine that masks that fact...! ;o) x@x.com (xelag)Nov 11, 1998, 10:21am
Sorry for the confusion, both Walter and Facter, I haven't slept for
48 hours because of my deafbot. Walter (I forgot your aw- nickname), you and your bot [Daniel] were very helpful to me yesterday, many thanks. On Wed, 11 Nov 1998 13:49:40 +0800, facter <facterinvurt at hotmail.com> [View Quote] > > > >Me and Walt are different people Xela =)) > >Fac. P.S. he is called [Daniel] your bot, Walter, or am I again mistaken? P.P.S. and thanks to you, Fac, for your help a few days ago (or am I again confused?). I'm going to bed! x@x.com (xelag)Nov 11, 1998, 10:25am
Thank you for your posting. I only hope we'll soon be able to use all
the aw.dll features in Visual Basic... XelaG. walter knupeNov 12, 1998, 3:17pm
I am glad to help, but its Faber, not Facter...
Why to people confuse my nick all the time ? *grin* Walter aka Faber on AW XelaG schrieb in Nachricht <364b06f8.29019427 at news.activeworlds.com>... >Facter, thanks for your posting and the online help this afternoon. >Its stable now with 2 SDK bots, the 3rd one crashes the syten. (and I >had my 2 other Hambots there at the same time, I thought the limit was >3). Got the forward/ back/ sidewards/ up/ down and turning around >movements ready, sorted out the trigonometry this evening. Next: >climbing at an angle, random-walking and figure-skating! I can also >have him say through keyboard input, I'm working on the teleport >option now and trimming the GUI. Pity he can't interact. walter knupeNov 12, 1998, 3:22pm
XelaG schrieb in Nachricht <364a7fb3.663103 at news.activeworlds.com>...
>Sorry for the confusion, both Walter and Facter, I haven't slept for >48 hours because of my deafbot. Walter (I forgot your aw- nickname), >you and your bot [Daniel] were very helpful to me yesterday, many >thanks. My nick name is Faber, (to add to the confusion :) ) > >On Wed, 11 Nov 1998 13:49:40 +0800, facter <facterinvurt at hotmail.com> [View Quote] in fact(er) *grin* > >P.S. he is called [Daniel] your bot, Walter, or am I again mistaken? Yes, the first instance my bot is allways called [Daniel] in honor of R. Daniel Oliwav, the famous Robot of Isaac Asimovs Robot Stories. Walter aka Faber |