diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | 233 |
1 files changed, 37 insertions, 196 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index 795baac..8e24543 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -45,6 +45,7 @@ using OpenSim.Region.Environment.Scenes; | |||
45 | using OpenSim.Region.Physics.Manager; | 45 | using OpenSim.Region.Physics.Manager; |
46 | using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; | 46 | using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; |
47 | using OpenSim.Region.ScriptEngine.Shared; | 47 | using OpenSim.Region.ScriptEngine.Shared; |
48 | using OpenSim.Region.ScriptEngine.Shared.Api; | ||
48 | 49 | ||
49 | using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat; | 50 | using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat; |
50 | using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger; | 51 | using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger; |
@@ -79,7 +80,8 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
79 | m_localID = localID; | 80 | m_localID = localID; |
80 | m_itemID = itemID; | 81 | m_itemID = itemID; |
81 | 82 | ||
82 | AsyncCommands = m_ScriptEngine.m_ASYNCLSLCommandManager; | 83 | AsyncCommands = new AsyncCommandManager(m_ScriptEngine); |
84 | |||
83 | //m_log.Info(ScriptEngineName, "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); | 85 | //m_log.Info(ScriptEngineName, "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); |
84 | 86 | ||
85 | 87 | ||
@@ -759,256 +761,95 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
759 | public LSL_String llDetectedName(int number) | 761 | public LSL_String llDetectedName(int number) |
760 | { | 762 | { |
761 | m_host.AddScriptLPS(1); | 763 | m_host.AddScriptLPS(1); |
762 | LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID); | 764 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
763 | if (SenseList != null) | 765 | if (d == null) |
764 | { | ||
765 | if ((number >= 0) && (number < SenseList.Length)) | ||
766 | { | ||
767 | UUID SensedUUID = (UUID)SenseList.Data[number]; | ||
768 | return resolveName(SensedUUID); | ||
769 | } | ||
770 | } | ||
771 | else | ||
772 | { | ||
773 | ScriptManager sm; | ||
774 | IScript script = null; | ||
775 | |||
776 | if ((sm = m_ScriptEngine.m_ScriptManager) != null) | ||
777 | { | ||
778 | if (sm.Scripts.ContainsKey(m_localID)) | ||
779 | { | ||
780 | if ((script = sm.GetScript(m_localID, m_itemID)) != null) | ||
781 | { | ||
782 | //System.Console.WriteLine(number + " - " + script.llDetectParams._key.Length); | ||
783 | if (script.llDetectParams._string != null) | ||
784 | { | ||
785 | if (script.llDetectParams._string.Length > number) | ||
786 | { | ||
787 | if (script.llDetectParams._string[number] != null) | ||
788 | { | ||
789 | return script.llDetectParams._string[number]; | ||
790 | } | ||
791 | } | ||
792 | } | ||
793 | } | ||
794 | } | ||
795 | } | ||
796 | } | ||
797 | return String.Empty; | 766 | return String.Empty; |
798 | } | 767 | return d.Name; |
799 | |||
800 | public UUID uuidDetectedKey(int number) | ||
801 | { | ||
802 | LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID); | ||
803 | if (SenseList != null) | ||
804 | { | ||
805 | if ((number >= 0) && (number < SenseList.Length)) | ||
806 | { | ||
807 | UUID SensedUUID = (UUID)SenseList.Data[number]; | ||
808 | return SensedUUID; | ||
809 | } | ||
810 | } | ||
811 | else | ||
812 | { | ||
813 | ScriptManager sm; | ||
814 | IScript script = null; | ||
815 | |||
816 | if ((sm = m_ScriptEngine.m_ScriptManager) != null) | ||
817 | { | ||
818 | if (sm.Scripts.ContainsKey(m_localID)) | ||
819 | { | ||
820 | if ((script = sm.GetScript(m_localID, m_itemID)) != null) | ||
821 | { | ||
822 | //System.Console.WriteLine(number + " - " + script.llDetectParams._key.Length); | ||
823 | if (script.llDetectParams._key.Length > number) | ||
824 | { | ||
825 | if (script.llDetectParams._key[number]) | ||
826 | { | ||
827 | return new UUID(script.llDetectParams._key[number]); | ||
828 | } | ||
829 | } | ||
830 | } | ||
831 | } | ||
832 | } | ||
833 | } | ||
834 | return UUID.Zero; | ||
835 | } | ||
836 | |||
837 | public EntityBase entityDetectedKey(int number) | ||
838 | { | ||
839 | LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID); | ||
840 | if (SenseList != null) | ||
841 | { | ||
842 | if ((number >= 0) && (number < SenseList.Length)) | ||
843 | { | ||
844 | UUID SensedUUID = (UUID)SenseList.Data[number]; | ||
845 | EntityBase SensedObject = null; | ||
846 | lock (World.Entities) | ||
847 | { | ||
848 | World.Entities.TryGetValue(SensedUUID, out SensedObject); | ||
849 | } | ||
850 | return SensedObject; | ||
851 | } | ||
852 | } | ||
853 | else | ||
854 | { | ||
855 | ScriptManager sm; | ||
856 | IScript script = null; | ||
857 | |||
858 | if ((sm = m_ScriptEngine.m_ScriptManager) != null) | ||
859 | { | ||
860 | if (sm.Scripts.ContainsKey(m_localID)) | ||
861 | { | ||
862 | if ((script = sm.GetScript(m_localID, m_itemID)) != null) | ||
863 | { | ||
864 | //System.Console.WriteLine(number + " - " + script.llDetectParams._key.Length); | ||
865 | if (script.llDetectParams._key.Length > number) | ||
866 | { | ||
867 | if (script.llDetectParams._key[number]) | ||
868 | { | ||
869 | UUID SensedUUID = new UUID(script.llDetectParams._key[number]); | ||
870 | EntityBase SensedObject = null; | ||
871 | lock (World.Entities) | ||
872 | { | ||
873 | World.Entities.TryGetValue(SensedUUID, out SensedObject); | ||
874 | } | ||
875 | return SensedObject; | ||
876 | } | ||
877 | } | ||
878 | } | ||
879 | } | ||
880 | } | ||
881 | } | ||
882 | |||
883 | return null; | ||
884 | } | 768 | } |
885 | 769 | ||
886 | public LSL_String llDetectedKey(int number) | 770 | public LSL_String llDetectedKey(int number) |
887 | { | 771 | { |
888 | m_host.AddScriptLPS(1); | 772 | m_host.AddScriptLPS(1); |
889 | UUID SensedUUID = uuidDetectedKey(number); | 773 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
890 | if (SensedUUID == UUID.Zero) | 774 | if (d == null) |
891 | return String.Empty; | 775 | return String.Empty; |
892 | return SensedUUID.ToString(); | 776 | return d.Key.ToString(); |
893 | } | 777 | } |
894 | 778 | ||
895 | public LSL_String llDetectedOwner(int number) | 779 | public LSL_String llDetectedOwner(int number) |
896 | { | 780 | { |
897 | // returns UUID of owner of object detected | ||
898 | m_host.AddScriptLPS(1); | 781 | m_host.AddScriptLPS(1); |
899 | EntityBase SensedObject = entityDetectedKey(number); | 782 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
900 | if (SensedObject ==null) | 783 | if (d == null) |
901 | return String.Empty; | 784 | return String.Empty; |
902 | UUID SensedUUID = uuidDetectedKey(number); | 785 | return d.Owner.ToString(); |
903 | if (World.GetScenePresence(SensedUUID) == null) | ||
904 | { | ||
905 | // sensed object is not an avatar | ||
906 | // so get the owner of the sensed object | ||
907 | SceneObjectPart SOP = World.GetSceneObjectPart(SensedUUID); | ||
908 | if (SOP != null) { return SOP.ObjectOwner.ToString(); } | ||
909 | } | ||
910 | else | ||
911 | { | ||
912 | // sensed object is an avatar, and so must be its own owner | ||
913 | return SensedUUID.ToString(); | ||
914 | } | ||
915 | |||
916 | |||
917 | return String.Empty; | ||
918 | |||
919 | } | 786 | } |
920 | 787 | ||
921 | public LSL_Integer llDetectedType(int number) | 788 | public LSL_Integer llDetectedType(int number) |
922 | { | 789 | { |
923 | m_host.AddScriptLPS(1); | 790 | m_host.AddScriptLPS(1); |
924 | EntityBase SensedObject = entityDetectedKey(number); | 791 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
925 | if (SensedObject == null) | 792 | if (d == null) |
926 | return 0; | 793 | return 0; |
927 | int mask = 0; | 794 | return new LSL_Integer(d.Type); |
928 | |||
929 | UUID SensedUUID = uuidDetectedKey(number); | ||
930 | LSL_Vector ZeroVector = new LSL_Vector(0, 0, 0); | ||
931 | |||
932 | if (World.GetScenePresence(SensedUUID) != null) mask |= 0x01; // actor | ||
933 | if (SensedObject.Velocity.Equals(ZeroVector)) | ||
934 | mask |= 0x04; // passive non-moving | ||
935 | else | ||
936 | mask |= 0x02; // active moving | ||
937 | if (SensedObject is IScript) mask |= 0x08; // Scripted. It COULD have one hidden ... | ||
938 | return mask; | ||
939 | } | 795 | } |
940 | 796 | ||
941 | public LSL_Vector llDetectedPos(int number) | 797 | public LSL_Vector llDetectedPos(int number) |
942 | { | 798 | { |
943 | m_host.AddScriptLPS(1); | 799 | m_host.AddScriptLPS(1); |
944 | EntityBase SensedObject = entityDetectedKey(number); | 800 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
945 | if (SensedObject == null) | 801 | if (d == null) |
946 | return new LSL_Vector(0, 0, 0); | 802 | return new LSL_Vector(); |
947 | return new LSL_Vector( | 803 | return d.Position; |
948 | SensedObject.AbsolutePosition.X, | ||
949 | SensedObject.AbsolutePosition.Y, | ||
950 | SensedObject.AbsolutePosition.Z); | ||
951 | } | 804 | } |
952 | 805 | ||
953 | public LSL_Vector llDetectedVel(int number) | 806 | public LSL_Vector llDetectedVel(int number) |
954 | { | 807 | { |
955 | m_host.AddScriptLPS(1); | 808 | m_host.AddScriptLPS(1); |
956 | EntityBase SensedObject = entityDetectedKey(number); | 809 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
957 | if (SensedObject == null) | 810 | if (d == null) |
958 | return new LSL_Vector(0, 0, 0); | 811 | return new LSL_Vector(); |
959 | return new LSL_Vector( | 812 | return d.Velocity; |
960 | SensedObject.Velocity.X, | ||
961 | SensedObject.Velocity.Y, | ||
962 | SensedObject.Velocity.Z); | ||
963 | } | 813 | } |
964 | 814 | ||
965 | public LSL_Vector llDetectedGrab(int number) | 815 | public LSL_Vector llDetectedGrab(int number) |
966 | { | 816 | { |
967 | m_host.AddScriptLPS(1); | 817 | m_host.AddScriptLPS(1); |
968 | EntityBase SensedObject = entityDetectedKey(number); | 818 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); |
969 | if (SensedObject == null) | 819 | if (parms == null) |
970 | return new LSL_Vector(0, 0, 0); | 820 | return new LSL_Vector(0, 0, 0); |
971 | 821 | ||
972 | return new LSL_Vector( | 822 | return parms.OffsetPos; |
973 | SensedObject.AbsolutePosition.X, | ||
974 | SensedObject.AbsolutePosition.Y, | ||
975 | SensedObject.AbsolutePosition.Z); | ||
976 | } | 823 | } |
977 | 824 | ||
978 | public LSL_Rotation llDetectedRot(int number) | 825 | public LSL_Rotation llDetectedRot(int number) |
979 | { | 826 | { |
980 | m_host.AddScriptLPS(1); | 827 | m_host.AddScriptLPS(1); |
981 | EntityBase SensedObject = entityDetectedKey(number); | 828 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
982 | if (SensedObject == null) | 829 | if (d == null) |
983 | return new LSL_Rotation(); | 830 | return new LSL_Rotation(); |
984 | return new LSL_Rotation( | 831 | return d.Rotation; |
985 | SensedObject.Rotation.X, | ||
986 | SensedObject.Rotation.Y, | ||
987 | SensedObject.Rotation.Z, | ||
988 | SensedObject.Rotation.W); | ||
989 | } | 832 | } |
990 | 833 | ||
991 | public LSL_Integer llDetectedGroup(int number) | 834 | public LSL_Integer llDetectedGroup(int number) |
992 | { | 835 | { |
993 | m_host.AddScriptLPS(1); | 836 | m_host.AddScriptLPS(1); |
994 | UUID SensedUUID = uuidDetectedKey(number); | 837 | DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number); |
995 | if (SensedUUID == UUID.Zero) | 838 | if (d == null) |
996 | return new LSL_Integer(0); | 839 | return new LSL_Integer(0); |
997 | ScenePresence presence = World.GetScenePresence(SensedUUID); | 840 | if (m_host.GroupID == d.Group) |
998 | IClientAPI client = presence.ControllingClient; | ||
999 | if (m_host.GroupID == client.ActiveGroupId) | ||
1000 | return new LSL_Integer(1); | 841 | return new LSL_Integer(1); |
1001 | else | ||
1002 | return new LSL_Integer(0); | 842 | return new LSL_Integer(0); |
1003 | } | 843 | } |
1004 | 844 | ||
1005 | public LSL_Integer llDetectedLinkNumber(int number) | 845 | public LSL_Integer llDetectedLinkNumber(int number) |
1006 | { | 846 | { |
1007 | m_host.AddScriptLPS(1); | 847 | m_host.AddScriptLPS(1); |
1008 | EntityBase SensedObject = entityDetectedKey(number); | 848 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); |
1009 | if (SensedObject == null) | 849 | if (parms == null) |
1010 | return 0; | 850 | return new LSL_Integer(0); |
1011 | return m_host.LinkNum; | 851 | |
852 | return new LSL_Integer(parms.LinkNum); | ||
1012 | } | 853 | } |
1013 | 854 | ||
1014 | public LSL_Vector llDetectedTouchBinormal(int index) | 855 | public LSL_Vector llDetectedTouchBinormal(int index) |