aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Vegetation/VegetationModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/World/Vegetation/VegetationModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/World/Vegetation/VegetationModule.cs118
1 files changed, 118 insertions, 0 deletions
diff --git a/OpenSim/Region/CoreModules/World/Vegetation/VegetationModule.cs b/OpenSim/Region/CoreModules/World/Vegetation/VegetationModule.cs
new file mode 100644
index 0000000..8b2bb1e
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Vegetation/VegetationModule.cs
@@ -0,0 +1,118 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using log4net;
31using Nini.Config;
32using OpenMetaverse;
33using OpenSim.Framework;
34using OpenSim.Framework.Communications;
35using OpenSim.Framework.Communications.Cache;
36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.Framework.Scenes;
38
39namespace OpenSim.Region.CoreModules.Avatar.Vegetation
40{
41 public class VegetationModule : IRegionModule, IVegetationModule
42 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44
45 protected Scene m_scene;
46
47 protected static readonly PCode[] creationCapabilities = new PCode[] { PCode.Grass, PCode.NewTree, PCode.Tree };
48 public PCode[] CreationCapabilities { get { return creationCapabilities; } }
49
50 public void Initialise(Scene scene, IConfigSource source)
51 {
52 m_scene = scene;
53 m_scene.RegisterModuleInterface<IVegetationModule>(this);
54 }
55
56 public void PostInitialise() {}
57 public void Close() {}
58 public string Name { get { return "Vegetation Module"; } }
59 public bool IsSharedModule { get { return false; } }
60
61 public SceneObjectGroup AddTree(
62 UUID uuid, UUID groupID, Vector3 scale, Quaternion rotation, Vector3 position, Tree treeType, bool newTree)
63 {
64 PrimitiveBaseShape treeShape = new PrimitiveBaseShape();
65 treeShape.PathCurve = 16;
66 treeShape.PathEnd = 49900;
67 treeShape.PCode = newTree ? (byte)PCode.NewTree : (byte)PCode.Tree;
68 treeShape.Scale = scale;
69 treeShape.State = (byte)treeType;
70
71 return m_scene.AddNewPrim(uuid, groupID, position, rotation, treeShape);
72 }
73
74 public SceneObjectGroup CreateEntity(
75 UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
76 {
77 if (Array.IndexOf(creationCapabilities, (PCode)shape.PCode) < 0)
78 {
79 m_log.DebugFormat("[VEGETATION]: PCode {0} not handled by {1}", shape.PCode, Name);
80 return null;
81 }
82
83 SceneObjectGroup sceneObject = new SceneObjectGroup(ownerID, pos, rot, shape);
84 SceneObjectPart rootPart = sceneObject.GetChildPart(sceneObject.UUID);
85
86 // if grass or tree, make phantom
87 //rootPart.TrimPermissions();
88 rootPart.AddFlag(PrimFlags.Phantom);
89 if (rootPart.Shape.PCode != (byte)PCode.Grass)
90 AdaptTree(ref shape);
91
92 m_scene.AddNewSceneObject(sceneObject, true);
93 sceneObject.SetGroup(groupID, null);
94
95 return sceneObject;
96 }
97
98 protected void AdaptTree(ref PrimitiveBaseShape tree)
99 {
100 // Tree size has to be adapted depending on its type
101 switch ((Tree)tree.State)
102 {
103 case Tree.Cypress1:
104 case Tree.Cypress2:
105 tree.Scale = new Vector3(4, 4, 10);
106 break;
107
108 // case... other tree types
109 // tree.Scale = new Vector3(?, ?, ?);
110 // break;
111
112 default:
113 tree.Scale = new Vector3(4, 4, 4);
114 break;
115 }
116 }
117 }
118}