diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs | 101 |
1 files changed, 62 insertions, 39 deletions
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs index 9730b02..e12588c 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs | |||
@@ -65,6 +65,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
65 | m_scenes.Add(scene); | 65 | m_scenes.Add(scene); |
66 | scene.EventManager.OnNewClient += NewClient; | 66 | scene.EventManager.OnNewClient += NewClient; |
67 | scene.EventManager.OnChatFromWorld += SimChat; | 67 | scene.EventManager.OnChatFromWorld += SimChat; |
68 | scene.EventManager.OnChatBroadcast += SimBroadcast; | ||
68 | } | 69 | } |
69 | 70 | ||
70 | // wrap this in a try block so that defaults will work if | 71 | // wrap this in a try block so that defaults will work if |
@@ -104,8 +105,34 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
104 | #endregion | 105 | #endregion |
105 | 106 | ||
106 | #region ISimChat Members | 107 | #region ISimChat Members |
108 | public void SimBroadcast(Object sender, ChatFromViewerArgs c) | ||
109 | { | ||
110 | // We only want to relay stuff on channel 0 | ||
111 | if (c.Channel != 0 && c.Channel != DEBUG_CHANNEL) return; | ||
112 | |||
113 | if (c.Channel == DEBUG_CHANNEL) | ||
114 | c.Type = ChatTypeEnum.DebugChannel; | ||
115 | |||
116 | // chat works by redistributing every incoming chat | ||
117 | // message to each avatar in the scene | ||
118 | LLVector3 pos = new LLVector3(128, 128, 30); | ||
119 | ((Scene)c.Scene).ForEachScenePresence(delegate(ScenePresence presence) | ||
120 | { | ||
121 | if (!presence.IsChildAgent) return; | ||
122 | |||
123 | presence.ControllingClient.SendChatMessage(c.Message, | ||
124 | 1, //255, | ||
125 | pos, c.From, LLUUID.Zero, | ||
126 | c.Channel == DEBUG_CHANNEL? (byte)ChatSourceType.Object : (byte)ChatSourceType.Agent, | ||
127 | (byte)ChatAudibleLevel.Fully); | ||
128 | }); | ||
129 | } | ||
130 | |||
107 | public void SimChat(Object sender, ChatFromViewerArgs e) | 131 | public void SimChat(Object sender, ChatFromViewerArgs e) |
108 | { | 132 | { |
133 | // early return if not on public or debug channel | ||
134 | if (e.Channel != 0 && e.Channel != DEBUG_CHANNEL) return; | ||
135 | |||
109 | ScenePresence avatar = null; | 136 | ScenePresence avatar = null; |
110 | Scene scene = (Scene) e.Scene; | 137 | Scene scene = (Scene) e.Scene; |
111 | 138 | ||
@@ -136,32 +163,28 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
136 | fromAgentID = e.Sender.AgentId; | 163 | fromAgentID = e.Sender.AgentId; |
137 | } | 164 | } |
138 | 165 | ||
139 | // We only want to relay stuff on channel 0 | 166 | if (e.Channel == DEBUG_CHANNEL) |
140 | if (e.Channel == 0 || e.Channel == DEBUG_CHANNEL) | 167 | e.Type = ChatTypeEnum.DebugChannel; |
141 | { | ||
142 | if (e.Channel == DEBUG_CHANNEL) | ||
143 | e.Type = ChatTypeEnum.DebugChannel; | ||
144 | 168 | ||
145 | // chat works by redistributing every incoming chat | 169 | // chat works by redistributing every incoming chat |
146 | // message to each avatar in the scene | 170 | // message to each avatar in the scene |
147 | foreach (Scene s in m_scenes) | 171 | foreach (Scene s in m_scenes) |
148 | { | 172 | { |
149 | s.ForEachScenePresence(delegate(ScenePresence presence) | 173 | s.ForEachScenePresence(delegate(ScenePresence presence) |
174 | { | ||
175 | if (e.Channel == DEBUG_CHANNEL) | ||
150 | { | 176 | { |
151 | if (e.Channel == DEBUG_CHANNEL) | 177 | TrySendChatMessage(presence, fromPos, regionPos, |
152 | { | 178 | fromAgentID, fromName, e.Type, |
153 | TrySendChatMessage(presence, fromPos, regionPos, | 179 | message, ChatSourceType.Object); |
154 | fromAgentID, fromName, e.Type, | 180 | } |
155 | message, ChatSourceType.Object); | 181 | else |
156 | } | 182 | { |
157 | else | 183 | TrySendChatMessage(presence, fromPos, regionPos, |
158 | { | 184 | fromAgentID, fromName, e.Type, |
159 | TrySendChatMessage(presence, fromPos, regionPos, | 185 | message, ChatSourceType.Agent); |
160 | fromAgentID, fromName, e.Type, | 186 | } |
161 | message, ChatSourceType.Agent); | 187 | }); |
162 | } | ||
163 | }); | ||
164 | } | ||
165 | } | 188 | } |
166 | } | 189 | } |
167 | 190 | ||
@@ -183,23 +206,23 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
183 | LLUUID fromAgentID, string fromName, ChatTypeEnum type, | 206 | LLUUID fromAgentID, string fromName, ChatTypeEnum type, |
184 | string message, ChatSourceType src) | 207 | string message, ChatSourceType src) |
185 | { | 208 | { |
186 | if (!presence.IsChildAgent) | 209 | // don't send stuff to child agents |
210 | if (presence.IsChildAgent) return; | ||
211 | |||
212 | LLVector3 fromRegionPos = fromPos + regionPos; | ||
213 | LLVector3 toRegionPos = presence.AbsolutePosition + regionPos; | ||
214 | int dis = Math.Abs((int) Util.GetDistanceTo(toRegionPos, fromRegionPos)); | ||
215 | |||
216 | if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || | ||
217 | type == ChatTypeEnum.Say && dis > m_saydistance || | ||
218 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) | ||
187 | { | 219 | { |
188 | LLVector3 fromRegionPos = fromPos + regionPos; | 220 | return; |
189 | LLVector3 toRegionPos = presence.AbsolutePosition + regionPos; | ||
190 | int dis = Math.Abs((int) Util.GetDistanceTo(toRegionPos, fromRegionPos)); | ||
191 | |||
192 | if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || | ||
193 | type == ChatTypeEnum.Say && dis > m_saydistance || | ||
194 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) | ||
195 | { | ||
196 | return; | ||
197 | } | ||
198 | |||
199 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView | ||
200 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, | ||
201 | fromAgentID,(byte)src,(byte)ChatAudibleLevel.Fully); | ||
202 | } | 221 | } |
222 | |||
223 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView | ||
224 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, | ||
225 | fromAgentID,(byte)src,(byte)ChatAudibleLevel.Fully); | ||
203 | } | 226 | } |
204 | } | 227 | } |
205 | } \ No newline at end of file | 228 | } \ No newline at end of file |