diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 48 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs | 125 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IGodsModule.cs | 5 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 36 |
4 files changed, 97 insertions, 117 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 55050d9..27ca740 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -10455,6 +10455,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10455 | private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack) | 10455 | private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack) |
10456 | { | 10456 | { |
10457 | RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack; | 10457 | RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack; |
10458 | |||
10459 | if (rglpPack.AgentData.SessionID != SessionId || | ||
10460 | rglpPack.AgentData.AgentID != AgentId) | ||
10461 | return true; | ||
10462 | |||
10458 | RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock; | 10463 | RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock; |
10459 | UUID token = rblock.Token; | 10464 | UUID token = rblock.Token; |
10460 | 10465 | ||
@@ -10464,7 +10469,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10464 | 10469 | ||
10465 | if (handlerReqGodlikePowers != null) | 10470 | if (handlerReqGodlikePowers != null) |
10466 | { | 10471 | { |
10467 | handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this); | 10472 | handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike); |
10468 | } | 10473 | } |
10469 | 10474 | ||
10470 | return true; | 10475 | return true; |
@@ -10475,6 +10480,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10475 | GodUpdateRegionInfoPacket GodUpdateRegionInfo = | 10480 | GodUpdateRegionInfoPacket GodUpdateRegionInfo = |
10476 | (GodUpdateRegionInfoPacket)Packet; | 10481 | (GodUpdateRegionInfoPacket)Packet; |
10477 | 10482 | ||
10483 | if (GodUpdateRegionInfo.AgentData.SessionID != SessionId || | ||
10484 | GodUpdateRegionInfo.AgentData.AgentID != AgentId) | ||
10485 | return true; | ||
10486 | |||
10478 | GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate; | 10487 | GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate; |
10479 | if (handlerGodUpdateRegionInfo != null) | 10488 | if (handlerGodUpdateRegionInfo != null) |
10480 | { | 10489 | { |
@@ -10508,6 +10517,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10508 | GodlikeMessagePacket GodlikeMessage = | 10517 | GodlikeMessagePacket GodlikeMessage = |
10509 | (GodlikeMessagePacket)Packet; | 10518 | (GodlikeMessagePacket)Packet; |
10510 | 10519 | ||
10520 | if (GodlikeMessage.AgentData.SessionID != SessionId || | ||
10521 | GodlikeMessage.AgentData.AgentID != AgentId) | ||
10522 | return true; | ||
10523 | |||
10511 | GodlikeMessage handlerGodlikeMessage = onGodlikeMessage; | 10524 | GodlikeMessage handlerGodlikeMessage = onGodlikeMessage; |
10512 | if (handlerGodlikeMessage != null) | 10525 | if (handlerGodlikeMessage != null) |
10513 | { | 10526 | { |
@@ -10524,6 +10537,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10524 | { | 10537 | { |
10525 | StateSavePacket SaveStateMessage = | 10538 | StateSavePacket SaveStateMessage = |
10526 | (StateSavePacket)Packet; | 10539 | (StateSavePacket)Packet; |
10540 | |||
10541 | if (SaveStateMessage.AgentData.SessionID != SessionId || | ||
10542 | SaveStateMessage.AgentData.AgentID != AgentId) | ||
10543 | return true; | ||
10544 | |||
10527 | SaveStateHandler handlerSaveStatePacket = OnSaveState; | 10545 | SaveStateHandler handlerSaveStatePacket = OnSaveState; |
10528 | if (handlerSaveStatePacket != null) | 10546 | if (handlerSaveStatePacket != null) |
10529 | { | 10547 | { |
@@ -10537,30 +10555,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10537 | { | 10555 | { |
10538 | GodKickUserPacket gkupack = (GodKickUserPacket)Pack; | 10556 | GodKickUserPacket gkupack = (GodKickUserPacket)Pack; |
10539 | 10557 | ||
10540 | if (gkupack.UserInfo.GodSessionID == SessionId && AgentId == gkupack.UserInfo.GodID) | 10558 | if (gkupack.UserInfo.GodSessionID != SessionId || |
10541 | { | 10559 | gkupack.UserInfo.GodID != AgentId) |
10542 | GodKickUser handlerGodKickUser = OnGodKickUser; | 10560 | return true; |
10543 | if (handlerGodKickUser != null) | 10561 | |
10544 | { | 10562 | GodKickUser handlerGodKickUser = OnGodKickUser; |
10545 | handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID, | 10563 | if (handlerGodKickUser != null) |
10546 | gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason); | ||
10547 | } | ||
10548 | } | ||
10549 | else | ||
10550 | { | 10564 | { |
10551 | SendAgentAlertMessage("Kick request denied", false); | 10565 | handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason); |
10552 | } | 10566 | } |
10553 | //KickUserPacket kupack = new KickUserPacket(); | ||
10554 | //KickUserPacket.UserInfoBlock kupackib = kupack.UserInfo; | ||
10555 | |||
10556 | //kupack.UserInfo.AgentID = gkupack.UserInfo.AgentID; | ||
10557 | //kupack.UserInfo.SessionID = gkupack.UserInfo.GodSessionID; | ||
10558 | |||
10559 | //kupack.TargetBlock.TargetIP = (uint)0; | ||
10560 | //kupack.TargetBlock.TargetPort = (ushort)0; | ||
10561 | //kupack.UserInfo.Reason = gkupack.UserInfo.Reason; | ||
10562 | 10567 | ||
10563 | //OutPacket(kupack, ThrottleOutPacketType.Task); | ||
10564 | return true; | 10568 | return true; |
10565 | } | 10569 | } |
10566 | #endregion GodPackets | 10570 | #endregion GodPackets |
diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs index e0c4924..db02379 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs | |||
@@ -152,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
152 | if (god == null || god.ControllingClient.SessionId != godSessionID) | 152 | if (god == null || god.ControllingClient.SessionId != godSessionID) |
153 | return String.Empty; | 153 | return String.Empty; |
154 | 154 | ||
155 | KickUser(godID, godSessionID, agentID, kickFlags, Util.StringToBytes1024(reason)); | 155 | KickUser(godID, agentID, kickFlags, Util.StringToBytes1024(reason)); |
156 | } | 156 | } |
157 | else | 157 | else |
158 | { | 158 | { |
@@ -162,59 +162,53 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
162 | } | 162 | } |
163 | 163 | ||
164 | public void RequestGodlikePowers( | 164 | public void RequestGodlikePowers( |
165 | UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient) | 165 | UUID agentID, UUID sessionID, UUID token, bool godLike) |
166 | { | 166 | { |
167 | ScenePresence sp = m_scene.GetScenePresence(agentID); | 167 | ScenePresence sp = m_scene.GetScenePresence(agentID); |
168 | if(sp == null || sp.IsDeleted || sp.isNPC) | ||
169 | return; | ||
168 | 170 | ||
169 | if (sp != null) | 171 | if (sessionID != sp.ControllingClient.SessionId) |
170 | { | 172 | return; |
171 | if (godLike == false) | ||
172 | { | ||
173 | sp.GrantGodlikePowers(agentID, sessionID, token, godLike); | ||
174 | return; | ||
175 | } | ||
176 | 173 | ||
177 | // First check that this is the sim owner | 174 | sp.GrantGodlikePowers(token, godLike); |
178 | if (m_scene.Permissions.IsGod(agentID)) | 175 | |
179 | { | 176 | if (godLike && sp.GodLevel < 200 && DialogModule != null) |
180 | // Next we check for spoofing..... | 177 | DialogModule.SendAlertToUser(agentID, "Request for god powers denied"); |
181 | UUID testSessionID = sp.ControllingClient.SessionId; | ||
182 | if (sessionID == testSessionID) | ||
183 | { | ||
184 | if (sessionID == controllingClient.SessionId) | ||
185 | { | ||
186 | //m_log.Info("godlike: " + godLike.ToString()); | ||
187 | sp.GrantGodlikePowers(agentID, testSessionID, token, godLike); | ||
188 | } | ||
189 | } | ||
190 | } | ||
191 | else | ||
192 | { | ||
193 | if (DialogModule != null) | ||
194 | DialogModule.SendAlertToUser(agentID, "Request for god powers denied"); | ||
195 | } | ||
196 | } | ||
197 | } | 178 | } |
198 | 179 | ||
199 | /// <summary> | 180 | /// <summary> |
200 | /// Kicks User specified from the simulator. This logs them off of the grid | 181 | /// Kicks or freezes User specified from the simulator. This logs them off of the grid |
201 | /// If the client gets the UUID: 44e87126e7944ded05b37c42da3d5cdb it assumes | ||
202 | /// that you're kicking it even if the avatar's UUID isn't the UUID that the | ||
203 | /// agent is assigned | ||
204 | /// </summary> | 182 | /// </summary> |
205 | /// <param name="godID">The person doing the kicking</param> | 183 | /// <param name="godID">The person doing the kicking</param> |
206 | /// <param name="sessionID">The session of the person doing the kicking</param> | ||
207 | /// <param name="agentID">the person that is being kicked</param> | 184 | /// <param name="agentID">the person that is being kicked</param> |
208 | /// <param name="kickflags">Tells what to do to the user</param> | 185 | /// <param name="kickflags">Tells what to do to the user</param> |
209 | /// <param name="reason">The message to send to the user after it's been turned into a field</param> | 186 | /// <param name="reason">The message to send to the user after it's been turned into a field</param> |
210 | public void KickUser(UUID godID, UUID sessionID, UUID agentID, uint kickflags, byte[] reason) | 187 | public void KickUser(UUID godID, UUID agentID, uint kickflags, byte[] reason) |
211 | { | 188 | { |
212 | if (!m_scene.Permissions.IsGod(godID)) | 189 | // assuming automatic god rights on this for fast griefing reaction |
190 | // this is also needed for kick via message | ||
191 | if(!m_scene.Permissions.IsGod(godID)) | ||
213 | return; | 192 | return; |
214 | 193 | ||
215 | ScenePresence sp = m_scene.GetScenePresence(agentID); | 194 | int godlevel = 200; |
195 | // update level so higher gods can kick lower ones | ||
196 | ScenePresence god = m_scene.GetScenePresence(godID); | ||
197 | if(god != null && god.GodLevel > godlevel) | ||
198 | godlevel = god.GodLevel; | ||
216 | 199 | ||
217 | if (sp == null && agentID != ALL_AGENTS) | 200 | if(agentID == ALL_AGENTS) |
201 | { | ||
202 | m_scene.ForEachRootScenePresence(delegate(ScenePresence p) | ||
203 | { | ||
204 | if (p.UUID != godID && godlevel > p.GodLevel) | ||
205 | doKickmodes(godID, p, kickflags, reason); | ||
206 | }); | ||
207 | return; | ||
208 | } | ||
209 | |||
210 | ScenePresence sp = m_scene.GetScenePresence(agentID); | ||
211 | if (sp == null || sp.IsChildAgent) | ||
218 | { | 212 | { |
219 | IMessageTransferModule transferModule = | 213 | IMessageTransferModule transferModule = |
220 | m_scene.RequestModuleInterface<IMessageTransferModule>(); | 214 | m_scene.RequestModuleInterface<IMessageTransferModule>(); |
@@ -230,48 +224,41 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
230 | return; | 224 | return; |
231 | } | 225 | } |
232 | 226 | ||
227 | if (godlevel <= sp.GodLevel) // no god wars | ||
228 | return; | ||
229 | |||
230 | if(sp.UUID == godID) | ||
231 | return; | ||
232 | |||
233 | doKickmodes(godID, sp, kickflags, reason); | ||
234 | } | ||
235 | |||
236 | private void doKickmodes(UUID godID, ScenePresence sp, uint kickflags, byte[] reason) | ||
237 | { | ||
233 | switch (kickflags) | 238 | switch (kickflags) |
234 | { | 239 | { |
235 | case 0: | 240 | case 0: |
236 | if (sp != null) | ||
237 | { | ||
238 | KickPresence(sp, Utils.BytesToString(reason)); | 241 | KickPresence(sp, Utils.BytesToString(reason)); |
239 | } | 242 | break; |
240 | else if (agentID == ALL_AGENTS) | 243 | case 1: |
241 | { | ||
242 | m_scene.ForEachRootScenePresence( | ||
243 | delegate(ScenePresence p) | ||
244 | { | ||
245 | if (p.UUID != godID && (!m_scene.Permissions.IsGod(p.UUID))) | ||
246 | KickPresence(p, Utils.BytesToString(reason)); | ||
247 | } | ||
248 | ); | ||
249 | } | ||
250 | break; | ||
251 | case 1: | ||
252 | if (sp != null) | ||
253 | { | ||
254 | sp.AllowMovement = false; | 244 | sp.AllowMovement = false; |
255 | m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason)); | 245 | m_dialogModule.SendAlertToUser(sp.UUID, Utils.BytesToString(reason)); |
256 | m_dialogModule.SendAlertToUser(godID, "User Frozen"); | 246 | m_dialogModule.SendAlertToUser(godID, "User Frozen"); |
257 | } | 247 | break; |
258 | break; | 248 | case 2: |
259 | case 2: | ||
260 | if (sp != null) | ||
261 | { | ||
262 | sp.AllowMovement = true; | 249 | sp.AllowMovement = true; |
263 | m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason)); | 250 | m_dialogModule.SendAlertToUser(sp.UUID, Utils.BytesToString(reason)); |
264 | m_dialogModule.SendAlertToUser(godID, "User Unfrozen"); | 251 | m_dialogModule.SendAlertToUser(godID, "User Unfrozen"); |
265 | } | 252 | break; |
266 | break; | 253 | default: |
267 | default: | 254 | break; |
268 | break; | ||
269 | } | 255 | } |
270 | } | 256 | } |
271 | 257 | ||
258 | |||
272 | private void KickPresence(ScenePresence sp, string reason) | 259 | private void KickPresence(ScenePresence sp, string reason) |
273 | { | 260 | { |
274 | if (sp.IsChildAgent) | 261 | if(sp.IsDeleted || sp.IsChildAgent) |
275 | return; | 262 | return; |
276 | sp.ControllingClient.Kick(reason); | 263 | sp.ControllingClient.Kick(reason); |
277 | sp.Scene.CloseAgent(sp.UUID, true); | 264 | sp.Scene.CloseAgent(sp.UUID, true); |
@@ -286,7 +273,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
286 | UUID godID = new UUID(msg.fromAgentID); | 273 | UUID godID = new UUID(msg.fromAgentID); |
287 | uint kickMode = (uint)msg.binaryBucket[0]; | 274 | uint kickMode = (uint)msg.binaryBucket[0]; |
288 | 275 | ||
289 | KickUser(godID, UUID.Zero, agentID, kickMode, Util.StringToBytes1024(reason)); | 276 | KickUser(godID, agentID, kickMode, Util.StringToBytes1024(reason)); |
290 | } | 277 | } |
291 | } | 278 | } |
292 | } | 279 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IGodsModule.cs b/OpenSim/Region/Framework/Interfaces/IGodsModule.cs index 552ce01..1cb9a30 100644 --- a/OpenSim/Region/Framework/Interfaces/IGodsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IGodsModule.cs | |||
@@ -43,16 +43,15 @@ namespace OpenSim.Region.Framework.Interfaces | |||
43 | /// <param name="token"></param> | 43 | /// <param name="token"></param> |
44 | /// <param name="godLike"></param> | 44 | /// <param name="godLike"></param> |
45 | /// <param name="controllingClient"></param> | 45 | /// <param name="controllingClient"></param> |
46 | void RequestGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient); | 46 | void RequestGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godLike); |
47 | 47 | ||
48 | /// <summary> | 48 | /// <summary> |
49 | /// Kicks User specified from the simulator. This logs them off of the grid. | 49 | /// Kicks User specified from the simulator. This logs them off of the grid. |
50 | /// </summary> | 50 | /// </summary> |
51 | /// <param name="godID">The person doing the kicking</param> | 51 | /// <param name="godID">The person doing the kicking</param> |
52 | /// <param name="sessionID">The session of the person doing the kicking</param> | ||
53 | /// <param name="agentID">the person that is being kicked</param> | 52 | /// <param name="agentID">the person that is being kicked</param> |
54 | /// <param name="kickflags">This isn't used apparently</param> | 53 | /// <param name="kickflags">This isn't used apparently</param> |
55 | /// <param name="reason">The message to send to the user after it's been turned into a field</param> | 54 | /// <param name="reason">The message to send to the user after it's been turned into a field</param> |
56 | void KickUser(UUID godID, UUID sessionID, UUID agentID, uint kickflags, byte[] reason); | 55 | void KickUser(UUID godID, UUID agentID, uint kickflags, byte[] reason); |
57 | } | 56 | } |
58 | } | 57 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f906d9f..c1b1a63 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -4506,34 +4506,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
4506 | #endregion | 4506 | #endregion |
4507 | 4507 | ||
4508 | /// <summary> | 4508 | /// <summary> |
4509 | /// This allows the Sim owner the abiility to kick users from their sim currently. | 4509 | /// handle god level requests. |
4510 | /// It tells the client that the agent has permission to do so. | ||
4511 | /// </summary> | 4510 | /// </summary> |
4512 | public void GrantGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godStatus) | 4511 | public void GrantGodlikePowers(UUID token, bool godStatus) |
4513 | { | 4512 | { |
4514 | int oldgodlevel = GodLevel; | 4513 | int oldgodlevel = GodLevel; |
4515 | 4514 | ||
4516 | if (godStatus) | 4515 | if (godStatus && !isNPC && m_scene.Permissions.IsGod(UUID)) |
4517 | { | 4516 | { |
4518 | // For now, assign god level 200 to anyone | 4517 | GodLevel = 200; |
4519 | // who is granted god powers, but has no god level set. | 4518 | if(GodLevel < UserLevel) |
4520 | // | 4519 | GodLevel = UserLevel; |
4521 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID); | ||
4522 | if (account != null) | ||
4523 | { | ||
4524 | if (account.UserLevel > 0) | ||
4525 | GodLevel = account.UserLevel; | ||
4526 | else | ||
4527 | GodLevel = 200; | ||
4528 | } | ||
4529 | } | 4520 | } |
4530 | else | 4521 | else |
4531 | { | 4522 | GodLevel = 0; |
4532 | GodLevel = 0; | ||
4533 | } | ||
4534 | 4523 | ||
4535 | ControllingClient.SendAdminResponse(token, (uint)GodLevel); | 4524 | ControllingClient.SendAdminResponse(token, (uint)GodLevel); |
4536 | |||
4537 | if(oldgodlevel != GodLevel) | 4525 | if(oldgodlevel != GodLevel) |
4538 | parcelGodCheck(m_currentParcelUUID, GodLevel >= 200); | 4526 | parcelGodCheck(m_currentParcelUUID, GodLevel >= 200); |
4539 | } | 4527 | } |
@@ -4640,7 +4628,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4640 | cAgent.BodyRotation = Rotation; | 4628 | cAgent.BodyRotation = Rotation; |
4641 | cAgent.ControlFlags = (uint)m_AgentControlFlags; | 4629 | cAgent.ControlFlags = (uint)m_AgentControlFlags; |
4642 | 4630 | ||
4643 | if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) | 4631 | if (GodLevel > 200 && m_scene.Permissions.IsGod(cAgent.AgentID)) |
4644 | cAgent.GodLevel = (byte)GodLevel; | 4632 | cAgent.GodLevel = (byte)GodLevel; |
4645 | else | 4633 | else |
4646 | cAgent.GodLevel = (byte) 0; | 4634 | cAgent.GodLevel = (byte) 0; |
@@ -4741,10 +4729,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
4741 | Rotation = cAgent.BodyRotation; | 4729 | Rotation = cAgent.BodyRotation; |
4742 | m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags; | 4730 | m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags; |
4743 | 4731 | ||
4744 | if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) | 4732 | if (cAgent.GodLevel >200 && m_scene.Permissions.IsGod(cAgent.AgentID)) |
4745 | GodLevel = cAgent.GodLevel; | 4733 | GodLevel = cAgent.GodLevel; |
4746 | SetAlwaysRun = cAgent.AlwaysRun; | 4734 | else |
4735 | GodLevel = 0; | ||
4747 | 4736 | ||
4737 | SetAlwaysRun = cAgent.AlwaysRun; | ||
4748 | 4738 | ||
4749 | Appearance = new AvatarAppearance(cAgent.Appearance); | 4739 | Appearance = new AvatarAppearance(cAgent.Appearance); |
4750 | /* | 4740 | /* |