From 96c09a66c4d6019bd9e06cba141591b0faeb4a70 Mon Sep 17 00:00:00 2001 From: MW Date: Sun, 10 Jun 2007 12:37:51 +0000 Subject: More rearranging. --- .../World/scripting/IScriptContext.cs | 13 +++ .../World/scripting/IScriptEntity.cs | 19 +++++ .../World/scripting/IScriptHandler.cs | 98 ++++++++++++++++++++++ OpenSim/OpenSim.Region/World/scripting/Script.cs | 26 ++++++ .../World/scripting/ScriptFactory.cs | 8 ++ .../World/scripting/Scripts/FollowRandomAvatar.cs | 37 ++++++++ 6 files changed, 201 insertions(+) create mode 100644 OpenSim/OpenSim.Region/World/scripting/IScriptContext.cs create mode 100644 OpenSim/OpenSim.Region/World/scripting/IScriptEntity.cs create mode 100644 OpenSim/OpenSim.Region/World/scripting/IScriptHandler.cs create mode 100644 OpenSim/OpenSim.Region/World/scripting/Script.cs create mode 100644 OpenSim/OpenSim.Region/World/scripting/ScriptFactory.cs create mode 100644 OpenSim/OpenSim.Region/World/scripting/Scripts/FollowRandomAvatar.cs (limited to 'OpenSim/OpenSim.Region/World/scripting') diff --git a/OpenSim/OpenSim.Region/World/scripting/IScriptContext.cs b/OpenSim/OpenSim.Region/World/scripting/IScriptContext.cs new file mode 100644 index 0000000..3dc7dab --- /dev/null +++ b/OpenSim/OpenSim.Region/World/scripting/IScriptContext.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; + +namespace OpenSim.Region.Scripting +{ + public interface IScriptContext + { + IScriptEntity Entity { get; } + bool TryGetRandomAvatar(out IScriptReadonlyEntity avatar); + } +} diff --git a/OpenSim/OpenSim.Region/World/scripting/IScriptEntity.cs b/OpenSim/OpenSim.Region/World/scripting/IScriptEntity.cs new file mode 100644 index 0000000..abb789f --- /dev/null +++ b/OpenSim/OpenSim.Region/World/scripting/IScriptEntity.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; + +namespace OpenSim.Region.Scripting +{ + public interface IScriptReadonlyEntity + { + LLVector3 Pos { get; } + string Name { get; } + } + + public interface IScriptEntity + { + LLVector3 Pos { get; set; } + string Name { get; } + } +} diff --git a/OpenSim/OpenSim.Region/World/scripting/IScriptHandler.cs b/OpenSim/OpenSim.Region/World/scripting/IScriptHandler.cs new file mode 100644 index 0000000..6644649 --- /dev/null +++ b/OpenSim/OpenSim.Region/World/scripting/IScriptHandler.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using OpenSim.Physics.Manager; +using OpenSim.Region; +using Avatar=OpenSim.Region.Avatar; +using Primitive = OpenSim.Region.Primitive; + +namespace OpenSim.Region.Scripting +{ + public delegate void ScriptEventHandler(IScriptContext context); + + public class ScriptHandler : IScriptContext, IScriptEntity, IScriptReadonlyEntity + { + private World m_world; + private Script m_script; + private Entity m_entity; + + public LLUUID ScriptId + { + get + { + return m_script.ScriptId; + } + } + + public void OnFrame() + { + m_script.OnFrame(this); + } + + public ScriptHandler(Script script, Entity entity, World world) + { + m_script = script; + m_entity = entity; + m_world = world; + } + + #region IScriptContext Members + + IScriptEntity IScriptContext.Entity + { + get + { + return this; + } + } + + bool IScriptContext.TryGetRandomAvatar(out IScriptReadonlyEntity avatar) + { + foreach (Entity entity in m_world.Entities.Values ) + { + if( entity is Avatar ) + { + avatar = entity; + return true; + } + } + + avatar = null; + return false; + } + + #endregion + + #region IScriptEntity and IScriptReadonlyEntity Members + + public string Name + { + get + { + return m_entity.Name; + } + } + + public LLVector3 Pos + { + get + { + return m_entity.Pos; + } + + set + { + if (m_entity is Primitive) + { + Primitive prim = m_entity as Primitive; + // Of course, we really should have asked the physEngine if this is possible, and if not, returned false. + // prim.UpdatePosition( value ); + } + } + } + + #endregion + } + +} diff --git a/OpenSim/OpenSim.Region/World/scripting/Script.cs b/OpenSim/OpenSim.Region/World/scripting/Script.cs new file mode 100644 index 0000000..c0c2c0c --- /dev/null +++ b/OpenSim/OpenSim.Region/World/scripting/Script.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; + +namespace OpenSim.Region.Scripting +{ + public class Script + { + private LLUUID m_scriptId; + public virtual LLUUID ScriptId + { + get + { + return m_scriptId; + } + } + + public Script( LLUUID scriptId ) + { + m_scriptId = scriptId; + } + + public ScriptEventHandler OnFrame; + } +} diff --git a/OpenSim/OpenSim.Region/World/scripting/ScriptFactory.cs b/OpenSim/OpenSim.Region/World/scripting/ScriptFactory.cs new file mode 100644 index 0000000..6f2e5f0 --- /dev/null +++ b/OpenSim/OpenSim.Region/World/scripting/ScriptFactory.cs @@ -0,0 +1,8 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Region.Scripting +{ + public delegate Script ScriptFactory(); +} diff --git a/OpenSim/OpenSim.Region/World/scripting/Scripts/FollowRandomAvatar.cs b/OpenSim/OpenSim.Region/World/scripting/Scripts/FollowRandomAvatar.cs new file mode 100644 index 0000000..9c0146b --- /dev/null +++ b/OpenSim/OpenSim.Region/World/scripting/Scripts/FollowRandomAvatar.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; + +namespace OpenSim.Region.Scripting +{ + public class FollowRandomAvatar : Script + { + public FollowRandomAvatar() + : base(LLUUID.Random()) + { + OnFrame += MyOnFrame; + } + + private void MyOnFrame(IScriptContext context) + { + LLVector3 pos = context.Entity.Pos; + + IScriptReadonlyEntity avatar; + + if (context.TryGetRandomAvatar(out avatar)) + { + LLVector3 avatarPos = avatar.Pos; + + float x = pos.X + ((float)avatarPos.X.CompareTo(pos.X)) / 2; + float y = pos.Y + ((float)avatarPos.Y.CompareTo(pos.Y)) / 2; + + LLVector3 newPos = new LLVector3(x, y, pos.Z); + + context.Entity.Pos = newPos; + } + } + } + + +} -- cgit v1.1