From 5ad6d5a939fb7bf0fdfdc6925d4afed306e08641 Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 11 Apr 2007 12:13:21 +0000 Subject: First basic test script now works in the jvm scripting engine. For it to work you need to have a java sdk installed and the javac.exe somewhere in the environment Path variable. Then To test, copy the text from bin/script1.text into a note card and then add that note to a prim. --- OpenSim.RegionServer/world/World.cs | 10 +-- OpenSim.RegionServer/world/WorldScripting.cs | 122 +++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 OpenSim.RegionServer/world/WorldScripting.cs (limited to 'OpenSim.RegionServer') diff --git a/OpenSim.RegionServer/world/World.cs b/OpenSim.RegionServer/world/World.cs index 74325b0..a973c6c 100644 --- a/OpenSim.RegionServer/world/World.cs +++ b/OpenSim.RegionServer/world/World.cs @@ -87,22 +87,22 @@ namespace OpenSim.world //Console.WriteLine("searching for script to add: " + substring); ScriptFactory scriptFactory; - Console.WriteLine("script string is " + substring); + //Console.WriteLine("script string is " + substring); if(substring.StartsWith("'); string sName = substring1.Substring(0, end); - Console.WriteLine(" script info : " + sEngine + " , " + sName); + //Console.WriteLine(" script info : " + sEngine + " , " + sName); int startscript = substring.IndexOf('>'); script = substring.Remove(0, startscript + 1); - Console.WriteLine("script data is " + script); + // Console.WriteLine("script data is " + script); if (this.scriptEngines.ContainsKey(sEngine)) { this.scriptEngines[sEngine].LoadScript(script, sName, entity.localid); @@ -172,7 +172,7 @@ namespace OpenSim.world } foreach (IScriptEngine scripteng in this.scriptEngines.Values) { - //scripteng.OnFrame(); + scripteng.OnFrame(); } //backup world data this.storageCount++; diff --git a/OpenSim.RegionServer/world/WorldScripting.cs b/OpenSim.RegionServer/world/WorldScripting.cs new file mode 100644 index 0000000..83838b4 --- /dev/null +++ b/OpenSim.RegionServer/world/WorldScripting.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Reflection; +using OpenSim.Framework; +using OpenSim.Framework.Interfaces; +using libsecondlife; + +namespace OpenSim.world +{ + public partial class World + { + private Dictionary scriptEngines = new Dictionary(); + + private void LoadScriptEngines() + { + this.LoadScriptPlugins(); + } + + public void LoadScriptPlugins() + { + string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "ScriptEngines"); + string[] pluginFiles = Directory.GetFiles(path, "*.dll"); + + + for (int i = 0; i < pluginFiles.Length; i++) + { + this.AddPlugin(pluginFiles[i]); + } + } + + private void AddPlugin(string FileName) + { + Assembly pluginAssembly = Assembly.LoadFrom(FileName); + + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (pluginType.IsPublic) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IScriptEngine", true); + + if (typeInterface != null) + { + IScriptEngine plug = (IScriptEngine)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + plug.Init(this); + this.scriptEngines.Add(plug.GetName(), plug); + + } + + typeInterface = null; + } + } + } + + pluginAssembly = null; + } + + public void LoadScript(string scriptType, string scriptName, string script, Entity ent) + { + if(this.scriptEngines.ContainsKey(scriptType)) + { + this.scriptEngines[scriptType].LoadScript(script, scriptName, ent.localid); + } + } + + #region IScriptAPI Methods + + public OSVector3 GetEntityPosition(uint localID) + { + OSVector3 res = new OSVector3(); + // Console.WriteLine("script- getting entity " + localID + " position"); + foreach (Entity entity in this.Entities.Values) + { + if (entity.localid == localID) + { + res.X = entity.Pos.X; + res.Y = entity.Pos.Y; + res.Z = entity.Pos.Z; + } + } + return res; + } + + public void SetEntityPosition(uint localID, float x , float y, float z) + { + foreach (Entity entity in this.Entities.Values) + { + if (entity.localid == localID && entity is Primitive) + { + LLVector3 pos = entity.Pos; + pos.X = x; + Primitive prim = entity as Primitive; + // Of course, we really should have asked the physEngine if this is possible, and if not, returned false. + prim.UpdatePosition(pos); + // Console.WriteLine("script- setting entity " + localID + " positon"); + } + } + + } + + public uint GetRandomAvatarID() + { + //Console.WriteLine("script- getting random avatar id"); + uint res = 0; + foreach (Entity entity in this.Entities.Values) + { + if (entity is Avatar) + { + res = entity.localid; + } + } + return res; + } + + #endregion + + + } +} -- cgit v1.1