Page 1 of 1

Greeterbot example in C#

Posted: Fri Feb 29, 2008 12:29 am
by Edwin
This simple greeterbot says hello to everyone who comes in :)
It is written in C#, you can download it at: http://www.virtualparadise.org/download ... net_r1.zip.

Code: Select all

using System;
 
namespace testbot
{
	class MainClass
	{
		const string botname = "C# bot";
		static string username;
		static string password;
		public static void Main(string[] args)
		{
			//Create a new VP SDK instance
			VP.Instance bot = new VP.Instance();
 
			//Set events
			bot.EventAvatarAdd += event_avatar_add;
			bot.EventChat += event_chat;
 
			Console.Write("Username: ");
			username = Console.ReadLine();
			Console.Write("Password: ");
			password = Console.ReadLine();
 
			int rc = 0;
 
			//Connect to the universe server
			if((rc = bot.Connect("virtualparadise.gotdns.com", 57000)) > 0)
			{
				Console.WriteLine("Error: {0}({1})",(VP.ReasonCode)rc, rc);
				Console.ReadLine();
				return;
			}
 
			//Log in using your username and password
			if((rc = bot.Login(username, password, botname)) > 0)
			{
				Console.WriteLine("Error: {0}({1})",(VP.ReasonCode)rc, rc);
				Console.ReadLine();
				return;
			}
 
			//Enter the world
			if((rc = bot.Enter("VP-Build")) > 0)
			{
				Console.WriteLine("Error: {0}({1})",(VP.ReasonCode)rc, rc);
				Console.ReadLine();
				return;
			}
 
			//Position the avatar
			bot.X = 1;
			bot.Z = 2;
			bot.State_Change();
 
			while(true)
			{
				if((rc = bot.Wait(100)) > 0)
				{
					Console.WriteLine("Error: {0}({1})",(VP.ReasonCode)rc, rc);
					Console.ReadLine();
					return;
				}
			}
 
		}
 
		public static void event_avatar_add(VP.Instance sender, object data)
		{
			VP.AvatarData avatar = (VP.AvatarData)data;
			sender.Say("Hello "+avatar.Name);
		}
 
		public static void event_chat(VP.Instance sender, object data)
		{
			VP.ChatMessage message = (VP.ChatMessage)data;
			Console.WriteLine("{0}:\t{1}", message.User, message.Text);
		}
	}
}

Re: Greeterbot example in C#

Posted: Fri Feb 29, 2008 6:29 pm
by Xenion
Looks nice, but it would be even more cool if the vp sdk could work exactly the same as the aw_version so we can easily convert existing bots.

Re: Greeterbot example in C#

Posted: Sat Mar 01, 2008 1:11 am
by Edwin
Xenion wrote:Looks nice, but it would be even more cool if the vp sdk could work exactly the same as the aw_version so we can easily convert existing bots.
The C API is like that, the wrapper isn't. But do you really like that better? I think this fits C# and .Net much better.

Re: Greeterbot example in C#

Posted: Sat Mar 01, 2008 9:56 am
by Xenion
Edwin wrote:
Xenion wrote:Looks nice, but it would be even more cool if the vp sdk could work exactly the same as the aw_version so we can easily convert existing bots.
The C API is like that, the wrapper isn't. But do you really like that better? I think this fits C# and .Net much better.
For .NET it's oké, there are not many bots for .NET now, so we'ell just get used to the new wrapper. But for C (or a VB Wrapper if possible), it would be handy to just be able to replace AW_ by VP_

Re: Greeterbot example in C#

Posted: Sat Mar 01, 2008 10:59 am
by Edwin
Xenion wrote:
Edwin wrote:
Xenion wrote:Looks nice, but it would be even more cool if the vp sdk could work exactly the same as the aw_version so we can easily convert existing bots.
The C API is like that, the wrapper isn't. But do you really like that better? I think this fits C# and .Net much better.
For .NET it's oké, there are not many bots for .NET now, so we'ell just get used to the new wrapper. But for C (or a VB Wrapper if possible), it would be handy to just be able to replace AW_ by VP_
Yes, it would be handy. But with that you also copy what I think is a major weakness of the AW sdk. That weakness is that AW uses a global instance. This means you can only use one instance at a time, making threading impossible. With VP you specify the instance with every call. Because of this you might have to write a little more code but it's a lot more flexible. There's a greeterbot example here: http://www.virtualparadise.org/wiki/ind ... reeter_bot. If you want, I can send you the files to develop using the C SDK.

Re: Greeterbot example in C#

Posted: Sat Mar 01, 2008 1:11 pm
by Xenion
You can switch instances in AW to. I never really used that but you have aw_instance_set

Re: Greeterbot example in C#

Posted: Sun Mar 02, 2008 1:24 pm
by Edwin
Xenion wrote:You can switch instances in AW to. I never really used that but you have aw_instance_set
I know it's possible, I didn't say it's not. What I said is that AW uses a global instance. that means if you call aw_instance_set, it affects the whole program. This means you can only use the AW SDK on one thread. With VP there is no global instance, it's passed to every function you call. Multiple threads can use the VP SDK at the same time with different instances without having to lock all other threads from changing the instance.

Say I have two AW bots running on different threads and one is programmed to say something, one bot sets the instance and tries to say something. Just before calling aw_say, the other bot changes the instance and aw_say is called on the wrong instance. This can be solved by locking other threads but this will probably affect performance because the other threads will just be waiting for the SDK to be available again.

With the VP SDK the instance is passed to every function except vp_init and vp_create like this:
vp_say(VPInstance instance, const char * message)

I hope this clears things up :)

Re: Greeterbot example in C#

Posted: Sun Mar 02, 2008 9:13 pm
by Xenion
Ah yes, I see it now.

But could you perhaps make the Instance an optional parameter so if you don't specify it, it just takes a default instance?

Re: Greeterbot example in C#

Posted: Sun Mar 02, 2008 9:30 pm
by Edwin
Xenion wrote:Ah yes, I see it now.

But could you perhaps make the Instance an optional parameter so if you don't specify it, it just takes a default instance?
Sorry, no. C doesn't do optional arguments and the instance is always the first parameter so that wouldn't work anyway.

Re: Greeterbot example in C#

Posted: Sun Mar 02, 2008 9:37 pm
by Xenion
Edwin wrote:
Xenion wrote:Ah yes, I see it now.

But could you perhaps make the Instance an optional parameter so if you don't specify it, it just takes a default instance?
Sorry, no. C doesn't do optional arguments and the instance is always the first parameter so that wouldn't work anyway.
We'll just get used to it, I guess.

Re: Greeterbot example in C#

Posted: Mon Mar 03, 2008 8:56 pm
by Edwin
Xenion wrote:
Edwin wrote:
Xenion wrote:Ah yes, I see it now.

But could you perhaps make the Instance an optional parameter so if you don't specify it, it just takes a default instance?
Sorry, no. C doesn't do optional arguments and the instance is always the first parameter so that wouldn't work anyway.
We'll just get used to it, I guess.
Or you could write a wrapper that uses a global instance... :mrgreen: :wink: