diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | 663 |
1 files changed, 424 insertions, 239 deletions
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 80fa08a..924f448 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | |||
@@ -33,15 +33,19 @@ using System.Linq; | |||
33 | using System.Reflection; | 33 | using System.Reflection; |
34 | using System.Security; | 34 | using System.Security; |
35 | using System.Timers; | 35 | using System.Timers; |
36 | using System.Threading; | ||
36 | using log4net; | 37 | using log4net; |
37 | using Mono.Addins; | 38 | using Mono.Addins; |
38 | using Nini.Config; | 39 | using Nini.Config; |
39 | using OpenMetaverse; | 40 | using OpenMetaverse; |
40 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
42 | using OpenSim.Framework.Monitoring; | ||
41 | using OpenSim.Region.Framework.Interfaces; | 43 | using OpenSim.Region.Framework.Interfaces; |
42 | using OpenSim.Region.Framework.Scenes; | 44 | using OpenSim.Region.Framework.Scenes; |
43 | using OpenSim.Services.Interfaces; | 45 | using OpenSim.Services.Interfaces; |
44 | using RegionFlags = OpenMetaverse.RegionFlags; | 46 | using RegionFlags = OpenMetaverse.RegionFlags; |
47 | using Timer = System.Timers.Timer; | ||
48 | |||
45 | 49 | ||
46 | namespace OpenSim.Region.CoreModules.World.Estate | 50 | namespace OpenSim.Region.CoreModules.World.Estate |
47 | { | 51 | { |
@@ -53,8 +57,8 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
53 | private Timer m_regionChangeTimer = new Timer(); | 57 | private Timer m_regionChangeTimer = new Timer(); |
54 | public Scene Scene { get; private set; } | 58 | public Scene Scene { get; private set; } |
55 | public IUserManagement UserManager { get; private set; } | 59 | public IUserManagement UserManager { get; private set; } |
56 | 60 | ||
57 | protected EstateManagementCommands m_commands; | 61 | protected EstateManagementCommands m_commands; |
58 | 62 | ||
59 | /// <summary> | 63 | /// <summary> |
60 | /// If false, region restart requests from the client are blocked even if they are otherwise legitimate. | 64 | /// If false, region restart requests from the client are blocked even if they are otherwise legitimate. |
@@ -67,14 +71,18 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
67 | public event ChangeDelegate OnRegionInfoChange; | 71 | public event ChangeDelegate OnRegionInfoChange; |
68 | public event ChangeDelegate OnEstateInfoChange; | 72 | public event ChangeDelegate OnEstateInfoChange; |
69 | public event MessageDelegate OnEstateMessage; | 73 | public event MessageDelegate OnEstateMessage; |
74 | public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; | ||
75 | public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest; | ||
76 | |||
77 | private int m_delayCount = 0; | ||
70 | 78 | ||
71 | #region Region Module interface | 79 | #region Region Module interface |
72 | 80 | ||
73 | public string Name { get { return "EstateManagementModule"; } } | 81 | public string Name { get { return "EstateManagementModule"; } } |
74 | |||
75 | public Type ReplaceableInterface { get { return null; } } | ||
76 | 82 | ||
77 | public void Initialise(IConfigSource source) | 83 | public Type ReplaceableInterface { get { return null; } } |
84 | |||
85 | public void Initialise(IConfigSource source) | ||
78 | { | 86 | { |
79 | AllowRegionRestartFromClient = true; | 87 | AllowRegionRestartFromClient = true; |
80 | 88 | ||
@@ -83,7 +91,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
83 | if (config != null) | 91 | if (config != null) |
84 | AllowRegionRestartFromClient = config.GetBoolean("AllowRegionRestartFromClient", true); | 92 | AllowRegionRestartFromClient = config.GetBoolean("AllowRegionRestartFromClient", true); |
85 | } | 93 | } |
86 | 94 | ||
87 | public void AddRegion(Scene scene) | 95 | public void AddRegion(Scene scene) |
88 | { | 96 | { |
89 | Scene = scene; | 97 | Scene = scene; |
@@ -95,20 +103,24 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
95 | 103 | ||
96 | m_commands = new EstateManagementCommands(this); | 104 | m_commands = new EstateManagementCommands(this); |
97 | m_commands.Initialise(); | 105 | m_commands.Initialise(); |
106 | |||
107 | m_regionChangeTimer.Interval = 10000; | ||
108 | m_regionChangeTimer.Elapsed += RaiseRegionInfoChange; | ||
109 | m_regionChangeTimer.AutoReset = false; | ||
98 | } | 110 | } |
99 | 111 | ||
100 | public void RemoveRegion(Scene scene) {} | 112 | public void RemoveRegion(Scene scene) {} |
101 | 113 | ||
102 | public void RegionLoaded(Scene scene) | 114 | public void RegionLoaded(Scene scene) |
103 | { | 115 | { |
104 | // Sets up the sun module based no the saved Estate and Region Settings | 116 | // Sets up the sun module based no the saved Estate and Region Settings |
105 | // DO NOT REMOVE or the sun will stop working | 117 | // DO NOT REMOVE or the sun will stop working |
106 | scene.TriggerEstateSunUpdate(); | 118 | scene.TriggerEstateSunUpdate(); |
107 | 119 | ||
108 | UserManager = scene.RequestModuleInterface<IUserManagement>(); | 120 | UserManager = scene.RequestModuleInterface<IUserManagement>(); |
109 | } | 121 | } |
110 | 122 | ||
111 | public void Close() | 123 | public void Close() |
112 | { | 124 | { |
113 | m_commands.Close(); | 125 | m_commands.Close(); |
114 | } | 126 | } |
@@ -142,6 +154,10 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
142 | flags |= RegionFlags.AllowParcelChanges; | 154 | flags |= RegionFlags.AllowParcelChanges; |
143 | if (Scene.RegionInfo.RegionSettings.BlockShowInSearch) | 155 | if (Scene.RegionInfo.RegionSettings.BlockShowInSearch) |
144 | flags |= RegionFlags.BlockParcelSearch; | 156 | flags |= RegionFlags.BlockParcelSearch; |
157 | if (Scene.RegionInfo.RegionSettings.GodBlockSearch) | ||
158 | flags |= (RegionFlags)(1 << 11); | ||
159 | if (Scene.RegionInfo.RegionSettings.Casino) | ||
160 | flags |= (RegionFlags)(1 << 10); | ||
145 | 161 | ||
146 | if (Scene.RegionInfo.RegionSettings.FixedSun) | 162 | if (Scene.RegionInfo.RegionSettings.FixedSun) |
147 | flags |= RegionFlags.SunFixed; | 163 | flags |= RegionFlags.SunFixed; |
@@ -194,6 +210,14 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
194 | change(Scene.RegionInfo.RegionID); | 210 | change(Scene.RegionInfo.RegionID); |
195 | } | 211 | } |
196 | 212 | ||
213 | protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e) | ||
214 | { | ||
215 | ChangeDelegate change = OnRegionInfoChange; | ||
216 | |||
217 | if (change != null) | ||
218 | change(Scene.RegionInfo.RegionID); | ||
219 | } | ||
220 | |||
197 | public void TriggerRegionInfoChange() | 221 | public void TriggerRegionInfoChange() |
198 | { | 222 | { |
199 | m_regionChangeTimer.Stop(); | 223 | m_regionChangeTimer.Stop(); |
@@ -423,7 +447,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
423 | Scene.RegionInfo.EstateSettings.EstateID); | 447 | Scene.RegionInfo.EstateSettings.EstateID); |
424 | 448 | ||
425 | remote_client.SendEstateList(invoice, | 449 | remote_client.SendEstateList(invoice, |
426 | (int)Constants.EstateAccessCodex.AccessOptions, | 450 | (int)Constants.EstateAccessCodex.AllowedAccess, |
427 | Scene.RegionInfo.EstateSettings.EstateAccess, | 451 | Scene.RegionInfo.EstateSettings.EstateAccess, |
428 | Scene.RegionInfo.EstateSettings.EstateID); | 452 | Scene.RegionInfo.EstateSettings.EstateID); |
429 | 453 | ||
@@ -462,7 +486,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
462 | 486 | ||
463 | if((byte)maxAgents <= Scene.RegionInfo.AgentCapacity) | 487 | if((byte)maxAgents <= Scene.RegionInfo.AgentCapacity) |
464 | Scene.RegionInfo.RegionSettings.AgentLimit = (byte) maxAgents; | 488 | Scene.RegionInfo.RegionSettings.AgentLimit = (byte) maxAgents; |
465 | else | 489 | else |
466 | Scene.RegionInfo.RegionSettings.AgentLimit = Scene.RegionInfo.AgentCapacity; | 490 | Scene.RegionInfo.RegionSettings.AgentLimit = Scene.RegionInfo.AgentCapacity; |
467 | 491 | ||
468 | Scene.RegionInfo.RegionSettings.ObjectBonus = objectBonusFactor; | 492 | Scene.RegionInfo.RegionSettings.ObjectBonus = objectBonusFactor; |
@@ -554,6 +578,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
554 | bool UseEstateSun, bool UseFixedSun, float SunHour, | 578 | bool UseEstateSun, bool UseFixedSun, float SunHour, |
555 | bool UseGlobal, bool EstateFixedSun, float EstateSunHour) | 579 | bool UseGlobal, bool EstateFixedSun, float EstateSunHour) |
556 | { | 580 | { |
581 | double lastwaterlevel = Scene.RegionInfo.RegionSettings.WaterHeight; | ||
557 | // Water Height | 582 | // Water Height |
558 | Scene.RegionInfo.RegionSettings.WaterHeight = WaterHeight; | 583 | Scene.RegionInfo.RegionSettings.WaterHeight = WaterHeight; |
559 | 584 | ||
@@ -566,6 +591,9 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
566 | Scene.RegionInfo.RegionSettings.FixedSun = UseFixedSun; | 591 | Scene.RegionInfo.RegionSettings.FixedSun = UseFixedSun; |
567 | Scene.RegionInfo.RegionSettings.SunPosition = SunHour; | 592 | Scene.RegionInfo.RegionSettings.SunPosition = SunHour; |
568 | 593 | ||
594 | if(Scene.PhysicsEnabled && Scene.PhysicsScene != null && lastwaterlevel != WaterHeight) | ||
595 | Scene.PhysicsScene.SetWaterLevel(WaterHeight); | ||
596 | |||
569 | Scene.TriggerEstateSunUpdate(); | 597 | Scene.TriggerEstateSunUpdate(); |
570 | 598 | ||
571 | //m_log.Debug("[ESTATE]: UFS: " + UseFixedSun.ToString()); | 599 | //m_log.Debug("[ESTATE]: UFS: " + UseFixedSun.ToString()); |
@@ -587,6 +615,16 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
587 | IRestartModule restartModule = Scene.RequestModuleInterface<IRestartModule>(); | 615 | IRestartModule restartModule = Scene.RequestModuleInterface<IRestartModule>(); |
588 | if (restartModule != null) | 616 | if (restartModule != null) |
589 | { | 617 | { |
618 | if (timeInSeconds == -1) | ||
619 | { | ||
620 | m_delayCount++; | ||
621 | if (m_delayCount > 3) | ||
622 | return; | ||
623 | |||
624 | restartModule.DelayRestart(3600, "Restart delayed by region manager"); | ||
625 | return; | ||
626 | } | ||
627 | |||
590 | List<int> times = new List<int>(); | 628 | List<int> times = new List<int>(); |
591 | while (timeInSeconds > 0) | 629 | while (timeInSeconds > 0) |
592 | { | 630 | { |
@@ -602,7 +640,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
602 | restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), false); | 640 | restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), false); |
603 | 641 | ||
604 | m_log.InfoFormat( | 642 | m_log.InfoFormat( |
605 | "User {0} requested restart of region {1} in {2} seconds", | 643 | "User {0} requested restart of region {1} in {2} seconds", |
606 | remoteClient.Name, Scene.Name, times.Count != 0 ? times[0] : 0); | 644 | remoteClient.Name, Scene.Name, times.Count != 0 ? times[0] : 0); |
607 | } | 645 | } |
608 | } | 646 | } |
@@ -610,236 +648,363 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
610 | private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID) | 648 | private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID) |
611 | { | 649 | { |
612 | // m_log.DebugFormat( | 650 | // m_log.DebugFormat( |
613 | // "[ESTATE MANAGEMENT MODULE]: Handling request from {0} to change estate covenant to {1}", | 651 | // "[ESTATE MANAGEMENT MODULE]: Handling request from {0} to change estate covenant to {1}", |
614 | // remoteClient.Name, estateCovenantID); | 652 | // remoteClient.Name, estateCovenantID); |
615 | 653 | ||
616 | Scene.RegionInfo.RegionSettings.Covenant = estateCovenantID; | 654 | Scene.RegionInfo.RegionSettings.Covenant = estateCovenantID; |
617 | Scene.RegionInfo.RegionSettings.CovenantChangedDateTime = Util.UnixTimeSinceEpoch(); | 655 | Scene.RegionInfo.RegionSettings.CovenantChangedDateTime = Util.UnixTimeSinceEpoch(); |
618 | Scene.RegionInfo.RegionSettings.Save(); | 656 | Scene.RegionInfo.RegionSettings.Save(); |
619 | TriggerRegionInfoChange(); | 657 | TriggerRegionInfoChange(); |
620 | } | 658 | } |
621 | 659 | ||
622 | private void handleEstateAccessDeltaRequest(IClientAPI remote_client, UUID invoice, int estateAccessType, UUID user) | 660 | private object deltareqLock = new object(); |
661 | private bool runnigDeltaExec = false; | ||
662 | |||
663 | private class EstateAccessDeltaRequest | ||
664 | { | ||
665 | public IClientAPI remote_client; | ||
666 | public UUID invoice; | ||
667 | public int estateAccessType; | ||
668 | public UUID user; | ||
669 | } | ||
670 | |||
671 | private OpenSim.Framework.BlockingQueue<EstateAccessDeltaRequest> deltaRequests = new OpenSim.Framework.BlockingQueue<EstateAccessDeltaRequest>(); | ||
672 | |||
673 | private void handleEstateAccessDeltaRequest(IClientAPI _remote_client, UUID _invoice, int _estateAccessType, UUID _user) | ||
623 | { | 674 | { |
624 | // EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups.. etc. | 675 | // EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups.. etc. |
625 | 676 | ||
626 | if (user == Scene.RegionInfo.EstateSettings.EstateOwner) | 677 | if (_user == Scene.RegionInfo.EstateSettings.EstateOwner) |
627 | return; // never process EO | 678 | return; // never process EO |
628 | 679 | ||
629 | if ((estateAccessType & 4) != 0) // User add | 680 | EstateAccessDeltaRequest newreq = new EstateAccessDeltaRequest(); |
681 | newreq.remote_client = _remote_client; | ||
682 | newreq.invoice = _invoice; | ||
683 | newreq.estateAccessType = _estateAccessType; | ||
684 | newreq.user = _user; | ||
685 | |||
686 | deltaRequests.Enqueue(newreq); | ||
687 | |||
688 | lock(deltareqLock) | ||
630 | { | 689 | { |
631 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) | 690 | if(!runnigDeltaExec) |
632 | { | 691 | { |
633 | if ((estateAccessType & 1) != 0) // All estates | 692 | runnigDeltaExec = true; |
693 | WorkManager.RunInThreadPool(execDeltaRequests,null,"execDeltaRequests"); | ||
694 | } | ||
695 | } | ||
696 | } | ||
697 | |||
698 | private void execDeltaRequests(object o) | ||
699 | { | ||
700 | IClientAPI remote_client; | ||
701 | UUID invoice; | ||
702 | int estateAccessType; | ||
703 | UUID user; | ||
704 | Dictionary<int,EstateSettings> changed = new Dictionary<int,EstateSettings>(); | ||
705 | Dictionary<IClientAPI,UUID> sendAllowedOrBanList = new Dictionary<IClientAPI,UUID>(); | ||
706 | Dictionary<IClientAPI,UUID> sendManagers = new Dictionary<IClientAPI,UUID>(); | ||
707 | Dictionary<IClientAPI,UUID> sendGroups = new Dictionary<IClientAPI,UUID>(); | ||
708 | |||
709 | List<EstateSettings> otherEstates = new List<EstateSettings>(); | ||
710 | |||
711 | bool sentAllowedFull = false; | ||
712 | bool sentBansFull = false; | ||
713 | bool sentGroupsFull = false; | ||
714 | bool sentManagersFull = false; | ||
715 | |||
716 | while(Scene.IsRunning) | ||
717 | { | ||
718 | EstateAccessDeltaRequest req = deltaRequests.Dequeue(500); | ||
719 | |||
720 | if(!Scene.IsRunning) | ||
721 | break; | ||
722 | |||
723 | if(req == null) | ||
724 | { | ||
725 | if(changed.Count > 0) | ||
634 | { | 726 | { |
635 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | 727 | foreach(EstateSettings est in changed.Values) |
636 | EstateSettings estateSettings; | 728 | Scene.EstateDataService.StoreEstateSettings(est); |
637 | 729 | ||
638 | foreach (int estateID in estateIDs) | 730 | TriggerEstateInfoChange(); |
639 | { | ||
640 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | ||
641 | { | ||
642 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | ||
643 | estateSettings.AddEstateUser(user); | ||
644 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | ||
645 | } | ||
646 | } | ||
647 | } | 731 | } |
648 | 732 | ||
649 | Scene.RegionInfo.EstateSettings.AddEstateUser(user); | 733 | EstateSettings es = Scene.RegionInfo.EstateSettings; |
650 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 734 | foreach(KeyValuePair<IClientAPI,UUID> kvp in sendAllowedOrBanList) |
735 | { | ||
736 | IClientAPI cli = kvp.Key; | ||
737 | UUID invoive = kvp.Value; | ||
738 | cli.SendEstateList(invoive, (int)Constants.EstateAccessCodex.AllowedAccess, es.EstateAccess, es.EstateID); | ||
739 | cli.SendBannedUserList(invoive, es.EstateBans, es.EstateID); | ||
740 | } | ||
741 | sendAllowedOrBanList.Clear(); | ||
651 | 742 | ||
652 | TriggerEstateInfoChange(); | 743 | foreach(KeyValuePair<IClientAPI,UUID> kvp in sendManagers) |
653 | remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID); | 744 | { |
745 | IClientAPI cli = kvp.Key; | ||
746 | cli.SendEstateList(kvp.Value, (int)Constants.EstateAccessCodex.EstateManagers, es.EstateManagers, es.EstateID); | ||
747 | } | ||
748 | foreach(KeyValuePair<IClientAPI,UUID> kvp in sendGroups) | ||
749 | { | ||
750 | IClientAPI cli = kvp.Key; | ||
751 | cli.SendEstateList(kvp.Value, (int)Constants.EstateAccessCodex.AllowedGroups, es.EstateGroups, es.EstateID); | ||
752 | } | ||
753 | otherEstates.Clear(); | ||
754 | sendAllowedOrBanList.Clear(); | ||
755 | sendManagers.Clear(); | ||
756 | sendGroups.Clear(); | ||
757 | changed.Clear(); | ||
758 | lock(deltareqLock) | ||
759 | { | ||
760 | if(deltaRequests.Count() != 0) | ||
761 | continue; | ||
762 | runnigDeltaExec = false; | ||
763 | return; | ||
764 | } | ||
654 | } | 765 | } |
655 | else | 766 | |
767 | remote_client = req.remote_client; | ||
768 | if(!remote_client.IsActive) | ||
769 | continue; | ||
770 | |||
771 | invoice = req.invoice; | ||
772 | user = req.user; | ||
773 | |||
774 | estateAccessType = req.estateAccessType; | ||
775 | |||
776 | bool needReply = ((estateAccessType & 1024) == 0); | ||
777 | bool doOtherEstates = ((estateAccessType & 3) != 0); | ||
778 | |||
779 | EstateSettings thisSettings = Scene.RegionInfo.EstateSettings; | ||
780 | int thisEstateID =(int)thisSettings.EstateID; | ||
781 | |||
782 | UUID agentID = remote_client.AgentId; | ||
783 | |||
784 | bool isadmin = Scene.Permissions.IsAdministrator(agentID); | ||
785 | // just i case recheck rights | ||
786 | if (!isadmin && !Scene.Permissions.IsEstateManager(agentID)) | ||
656 | { | 787 | { |
657 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | 788 | remote_client.SendAlertMessage("Method EstateAccess Failed, you don't have permissions"); |
789 | continue; | ||
658 | } | 790 | } |
659 | 791 | ||
660 | } | 792 | otherEstates.Clear(); |
661 | 793 | if(doOtherEstates) | |
662 | if ((estateAccessType & 8) != 0) // User remove | ||
663 | { | ||
664 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) | ||
665 | { | 794 | { |
666 | if ((estateAccessType & 1) != 0) // All estates | 795 | UUID thisOwner = Scene.RegionInfo.EstateSettings.EstateOwner; |
796 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(thisOwner); | ||
797 | foreach (int estateID in estateIDs) | ||
667 | { | 798 | { |
668 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | 799 | if (estateID == thisEstateID) |
800 | continue; | ||
801 | |||
669 | EstateSettings estateSettings; | 802 | EstateSettings estateSettings; |
803 | if(changed.ContainsKey(estateID)) | ||
804 | estateSettings = changed[estateID]; | ||
805 | else | ||
806 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | ||
807 | |||
808 | if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) | ||
809 | continue; | ||
810 | otherEstates.Add(estateSettings); | ||
811 | } | ||
812 | estateIDs.Clear(); | ||
813 | } | ||
670 | 814 | ||
671 | foreach (int estateID in estateIDs) | 815 | // the commands |
816 | // first the ones allowed for estate managers on this region | ||
817 | if ((estateAccessType & 4) != 0) // User add | ||
818 | { | ||
819 | if(thisSettings.EstateUsersCount() >= (int)Constants.EstateAccessLimits.AllowedAccess) | ||
820 | { | ||
821 | if(!sentAllowedFull) | ||
672 | { | 822 | { |
673 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | 823 | sentAllowedFull = true; |
824 | remote_client.SendAlertMessage("Estate Allowed users list is full"); | ||
825 | } | ||
826 | } | ||
827 | else | ||
828 | { | ||
829 | if (doOtherEstates) | ||
830 | { | ||
831 | foreach (EstateSettings estateSettings in otherEstates) | ||
674 | { | 832 | { |
675 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | 833 | if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) |
676 | estateSettings.RemoveEstateUser(user); | 834 | continue; |
677 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | 835 | if(estateSettings.EstateUsersCount() >= (int)Constants.EstateAccessLimits.AllowedAccess) |
836 | continue; | ||
837 | estateSettings.AddEstateUser(user); | ||
838 | estateSettings.RemoveBan(user); | ||
839 | changed[(int)estateSettings.EstateID] = estateSettings; | ||
678 | } | 840 | } |
679 | } | 841 | } |
680 | } | ||
681 | 842 | ||
682 | Scene.RegionInfo.EstateSettings.RemoveEstateUser(user); | 843 | thisSettings.AddEstateUser(user); |
683 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 844 | thisSettings.RemoveBan(user); |
845 | changed[thisEstateID] = thisSettings;; | ||
684 | 846 | ||
685 | TriggerEstateInfoChange(); | 847 | if(needReply) |
686 | remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID); | 848 | sendAllowedOrBanList[remote_client] = invoice; |
849 | } | ||
687 | } | 850 | } |
688 | else | 851 | |
852 | if ((estateAccessType & 8) != 0) // User remove | ||
689 | { | 853 | { |
690 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | 854 | if (doOtherEstates) // All estates |
855 | { | ||
856 | foreach (EstateSettings estateSettings in otherEstates) | ||
857 | { | ||
858 | if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) | ||
859 | continue; | ||
860 | estateSettings.RemoveEstateUser(user); | ||
861 | changed[(int)estateSettings.EstateID] = estateSettings; | ||
862 | } | ||
863 | } | ||
864 | |||
865 | thisSettings.RemoveEstateUser(user); | ||
866 | changed[thisEstateID] = thisSettings;; | ||
867 | |||
868 | if(needReply) | ||
869 | sendAllowedOrBanList[remote_client] = invoice; | ||
691 | } | 870 | } |
692 | } | ||
693 | 871 | ||
694 | if ((estateAccessType & 16) != 0) // Group add | 872 | if ((estateAccessType & 16) != 0) // Group add |
695 | { | ||
696 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) | ||
697 | { | 873 | { |
698 | if ((estateAccessType & 1) != 0) // All estates | 874 | if(thisSettings.EstateGroupsCount() >= (int)Constants.EstateAccessLimits.AllowedGroups) |
699 | { | 875 | { |
700 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | 876 | if(!sentGroupsFull) |
701 | EstateSettings estateSettings; | 877 | { |
702 | 878 | sentGroupsFull = true; | |
703 | foreach (int estateID in estateIDs) | 879 | remote_client.SendAlertMessage("Estate Allowed groups list is full"); |
880 | } | ||
881 | } | ||
882 | else | ||
883 | { | ||
884 | if (doOtherEstates) // All estates | ||
704 | { | 885 | { |
705 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | 886 | foreach (EstateSettings estateSettings in otherEstates) |
706 | { | 887 | { |
707 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | 888 | if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) |
889 | continue; | ||
890 | if(estateSettings.EstateGroupsCount() >= (int)Constants.EstateAccessLimits.AllowedGroups) | ||
891 | continue; | ||
708 | estateSettings.AddEstateGroup(user); | 892 | estateSettings.AddEstateGroup(user); |
709 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | 893 | changed[(int)estateSettings.EstateID] = estateSettings; |
710 | } | 894 | } |
711 | } | 895 | } |
712 | } | ||
713 | 896 | ||
714 | Scene.RegionInfo.EstateSettings.AddEstateGroup(user); | 897 | thisSettings.AddEstateGroup(user); |
715 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 898 | changed[thisEstateID] = thisSettings; |
716 | 899 | ||
717 | TriggerEstateInfoChange(); | 900 | sendGroups[remote_client] = invoice; |
718 | remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, Scene.RegionInfo.EstateSettings.EstateGroups, Scene.RegionInfo.EstateSettings.EstateID); | 901 | } |
719 | } | ||
720 | else | ||
721 | { | ||
722 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | ||
723 | } | 902 | } |
724 | } | ||
725 | 903 | ||
726 | if ((estateAccessType & 32) != 0) // Group remove | 904 | if ((estateAccessType & 32) != 0) // Group remove |
727 | { | ||
728 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) | ||
729 | { | 905 | { |
730 | if ((estateAccessType & 1) != 0) // All estates | 906 | if (doOtherEstates) // All estates |
731 | { | 907 | { |
732 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | 908 | foreach (EstateSettings estateSettings in otherEstates) |
733 | EstateSettings estateSettings; | ||
734 | |||
735 | foreach (int estateID in estateIDs) | ||
736 | { | 909 | { |
737 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | 910 | if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) |
738 | { | 911 | continue; |
739 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | 912 | estateSettings.RemoveEstateGroup(user); |
740 | estateSettings.RemoveEstateGroup(user); | 913 | changed[(int)estateSettings.EstateID] = estateSettings; |
741 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | ||
742 | } | ||
743 | } | 914 | } |
744 | } | 915 | } |
745 | 916 | ||
746 | Scene.RegionInfo.EstateSettings.RemoveEstateGroup(user); | 917 | thisSettings.RemoveEstateGroup(user); |
747 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 918 | changed[thisEstateID] = thisSettings; |
748 | 919 | ||
749 | TriggerEstateInfoChange(); | 920 | sendGroups[remote_client] = invoice; |
750 | remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, Scene.RegionInfo.EstateSettings.EstateGroups, Scene.RegionInfo.EstateSettings.EstateID); | ||
751 | } | 921 | } |
752 | else | ||
753 | { | ||
754 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | ||
755 | } | ||
756 | } | ||
757 | 922 | ||
758 | if ((estateAccessType & 64) != 0) // Ban add | 923 | if ((estateAccessType & 64) != 0) // Ban add |
759 | { | ||
760 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false)) | ||
761 | { | 924 | { |
762 | EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; | ||
763 | 925 | ||
764 | bool alreadyInList = false; | 926 | if(thisSettings.EstateBansCount() >= (int)Constants.EstateAccessLimits.EstateBans) |
765 | |||
766 | for (int i = 0; i < banlistcheck.Length; i++) | ||
767 | { | 927 | { |
768 | if (user == banlistcheck[i].BannedUserID) | 928 | if(!sentBansFull) |
769 | { | 929 | { |
770 | alreadyInList = true; | 930 | sentBansFull = true; |
771 | break; | 931 | remote_client.SendAlertMessage("Estate Ban list is full"); |
772 | } | 932 | } |
773 | |||
774 | } | 933 | } |
775 | if (!alreadyInList) | 934 | else |
776 | { | 935 | { |
936 | EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; | ||
777 | 937 | ||
778 | if ((estateAccessType & 1) != 0) // All estates | 938 | bool alreadyInList = false; |
779 | { | ||
780 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | ||
781 | EstateSettings estateSettings; | ||
782 | 939 | ||
783 | foreach (int estateID in estateIDs) | 940 | for (int i = 0; i < banlistcheck.Length; i++) |
941 | { | ||
942 | if (user == banlistcheck[i].BannedUserID) | ||
943 | { | ||
944 | alreadyInList = true; | ||
945 | break; | ||
946 | } | ||
947 | } | ||
948 | if (!alreadyInList) | ||
949 | { | ||
950 | if (doOtherEstates) // All estates | ||
784 | { | 951 | { |
785 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | 952 | foreach (EstateSettings estateSettings in otherEstates) |
786 | { | 953 | { |
954 | if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) | ||
955 | continue; | ||
956 | |||
957 | if(estateSettings.EstateBansCount() >= (int)Constants.EstateAccessLimits.EstateBans) | ||
958 | continue; | ||
959 | |||
787 | EstateBan bitem = new EstateBan(); | 960 | EstateBan bitem = new EstateBan(); |
788 | 961 | ||
789 | bitem.BannedUserID = user; | 962 | bitem.BannedUserID = user; |
790 | bitem.EstateID = (uint)estateID; | 963 | bitem.EstateID = estateSettings.EstateID; |
791 | bitem.BannedHostAddress = "0.0.0.0"; | 964 | bitem.BannedHostAddress = "0.0.0.0"; |
792 | bitem.BannedHostIPMask = "0.0.0.0"; | 965 | bitem.BannedHostIPMask = "0.0.0.0"; |
793 | 966 | ||
794 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | ||
795 | estateSettings.AddBan(bitem); | 967 | estateSettings.AddBan(bitem); |
796 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | 968 | estateSettings.RemoveEstateUser(user); |
969 | changed[(int)estateSettings.EstateID] = estateSettings; | ||
797 | } | 970 | } |
798 | } | 971 | } |
799 | } | ||
800 | 972 | ||
801 | EstateBan item = new EstateBan(); | 973 | EstateBan item = new EstateBan(); |
802 | 974 | ||
803 | item.BannedUserID = user; | 975 | item.BannedUserID = user; |
804 | item.EstateID = Scene.RegionInfo.EstateSettings.EstateID; | 976 | item.EstateID = Scene.RegionInfo.EstateSettings.EstateID; |
805 | item.BannedHostAddress = "0.0.0.0"; | 977 | item.BannedHostAddress = "0.0.0.0"; |
806 | item.BannedHostIPMask = "0.0.0.0"; | 978 | item.BannedHostIPMask = "0.0.0.0"; |
807 | 979 | ||
808 | Scene.RegionInfo.EstateSettings.AddBan(item); | 980 | thisSettings.AddBan(item); |
809 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 981 | thisSettings.RemoveEstateUser(user); |
982 | changed[thisEstateID] = thisSettings; | ||
810 | 983 | ||
811 | TriggerEstateInfoChange(); | 984 | ScenePresence s = Scene.GetScenePresence(user); |
812 | 985 | if (s != null) | |
813 | ScenePresence s = Scene.GetScenePresence(user); | ||
814 | if (s != null) | ||
815 | { | ||
816 | if (!s.IsChildAgent) | ||
817 | { | 986 | { |
818 | if (!Scene.TeleportClientHome(user, s.ControllingClient)) | 987 | if (!s.IsChildAgent) |
819 | { | 988 | { |
820 | s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out."); | 989 | if (!Scene.TeleportClientHome(user, s.ControllingClient)) |
821 | Scene.CloseAgent(s.UUID, false); | 990 | { |
991 | s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out."); | ||
992 | Scene.CloseAgent(s.UUID, false); | ||
993 | } | ||
822 | } | 994 | } |
823 | } | 995 | } |
824 | } | 996 | } |
825 | 997 | else | |
826 | } | 998 | { |
827 | else | 999 | remote_client.SendAlertMessage("User is already on the region ban list"); |
828 | { | 1000 | } |
829 | remote_client.SendAlertMessage("User is already on the region ban list"); | 1001 | //Scene.RegionInfo.regionBanlist.Add(Manager(user); |
1002 | if(needReply) | ||
1003 | sendAllowedOrBanList[remote_client] = invoice; | ||
830 | } | 1004 | } |
831 | //Scene.RegionInfo.regionBanlist.Add(Manager(user); | ||
832 | remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID); | ||
833 | } | ||
834 | else | ||
835 | { | ||
836 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | ||
837 | } | 1005 | } |
838 | } | ||
839 | 1006 | ||
840 | if ((estateAccessType & 128) != 0) // Ban remove | 1007 | if ((estateAccessType & 128) != 0) // Ban remove |
841 | { | ||
842 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false)) | ||
843 | { | 1008 | { |
844 | EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; | 1009 | EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; |
845 | 1010 | ||
@@ -855,107 +1020,93 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
855 | break; | 1020 | break; |
856 | } | 1021 | } |
857 | } | 1022 | } |
858 | 1023 | ||
859 | if (alreadyInList && listitem != null) | 1024 | if (alreadyInList && listitem != null) |
860 | { | 1025 | { |
861 | if ((estateAccessType & 1) != 0) // All estates | 1026 | if (doOtherEstates) // All estates |
862 | { | 1027 | { |
863 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | 1028 | foreach (EstateSettings estateSettings in otherEstates) |
864 | EstateSettings estateSettings; | ||
865 | |||
866 | foreach (int estateID in estateIDs) | ||
867 | { | 1029 | { |
868 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | 1030 | if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) |
869 | { | 1031 | continue; |
870 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | 1032 | estateSettings.RemoveBan(user); |
871 | estateSettings.RemoveBan(user); | 1033 | changed[(int)estateSettings.EstateID] = estateSettings; |
872 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | ||
873 | } | ||
874 | } | 1034 | } |
875 | } | 1035 | } |
876 | 1036 | ||
877 | Scene.RegionInfo.EstateSettings.RemoveBan(listitem.BannedUserID); | 1037 | thisSettings.RemoveBan(listitem.BannedUserID); |
878 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 1038 | changed[thisEstateID] = thisSettings; |
879 | |||
880 | TriggerEstateInfoChange(); | ||
881 | } | 1039 | } |
882 | else | 1040 | else |
883 | { | 1041 | { |
884 | remote_client.SendAlertMessage("User is not on the region ban list"); | 1042 | remote_client.SendAlertMessage("User is not on the region ban list"); |
885 | } | 1043 | } |
886 | 1044 | ||
887 | //Scene.RegionInfo.regionBanlist.Add(Manager(user); | 1045 | if(needReply) |
888 | remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID); | 1046 | sendAllowedOrBanList[remote_client] = invoice; |
889 | } | 1047 | } |
890 | else | 1048 | |
1049 | // last the ones only for owners of this region | ||
1050 | if (!Scene.Permissions.CanIssueEstateCommand(agentID, true)) | ||
891 | { | 1051 | { |
892 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | 1052 | remote_client.SendAlertMessage("Method EstateAccess Failed, you don't have permissions"); |
1053 | continue; | ||
893 | } | 1054 | } |
894 | } | ||
895 | 1055 | ||
896 | if ((estateAccessType & 256) != 0) // Manager add | 1056 | if ((estateAccessType & 256) != 0) // Manager add |
897 | { | ||
898 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) | ||
899 | { | 1057 | { |
900 | if ((estateAccessType & 1) != 0) // All estates | 1058 | if(thisSettings.EstateManagersCount() >= (int)Constants.EstateAccessLimits.EstateManagers) |
901 | { | 1059 | { |
902 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | 1060 | if(!sentManagersFull) |
903 | EstateSettings estateSettings; | 1061 | { |
904 | 1062 | sentManagersFull = true; | |
905 | foreach (int estateID in estateIDs) | 1063 | remote_client.SendAlertMessage("Estate Managers list is full"); |
1064 | } | ||
1065 | } | ||
1066 | else | ||
1067 | { | ||
1068 | if (doOtherEstates) // All estates | ||
906 | { | 1069 | { |
907 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | 1070 | foreach (EstateSettings estateSettings in otherEstates) |
908 | { | 1071 | { |
909 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | 1072 | if(!isadmin && !estateSettings.IsEstateOwner(agentID)) // redundante check? |
1073 | continue; | ||
1074 | if(estateSettings.EstateManagersCount() >= (int)Constants.EstateAccessLimits.EstateManagers) | ||
1075 | continue; | ||
910 | estateSettings.AddEstateManager(user); | 1076 | estateSettings.AddEstateManager(user); |
911 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | 1077 | changed[(int)estateSettings.EstateID] = estateSettings; |
912 | } | 1078 | } |
913 | } | 1079 | } |
914 | } | ||
915 | 1080 | ||
916 | Scene.RegionInfo.EstateSettings.AddEstateManager(user); | 1081 | thisSettings.AddEstateManager(user); |
917 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 1082 | changed[thisEstateID] = thisSettings; |
918 | 1083 | ||
919 | TriggerEstateInfoChange(); | 1084 | sendManagers[remote_client] = invoice; |
920 | remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, Scene.RegionInfo.EstateSettings.EstateManagers, Scene.RegionInfo.EstateSettings.EstateID); | 1085 | } |
921 | } | ||
922 | else | ||
923 | { | ||
924 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | ||
925 | } | 1086 | } |
926 | } | ||
927 | 1087 | ||
928 | if ((estateAccessType & 512) != 0) // Manager remove | 1088 | if ((estateAccessType & 512) != 0) // Manager remove |
929 | { | ||
930 | if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) | ||
931 | { | 1089 | { |
932 | if ((estateAccessType & 1) != 0) // All estates | 1090 | if (doOtherEstates) // All estates |
933 | { | 1091 | { |
934 | List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); | 1092 | foreach (EstateSettings estateSettings in otherEstates) |
935 | EstateSettings estateSettings; | ||
936 | |||
937 | foreach (int estateID in estateIDs) | ||
938 | { | 1093 | { |
939 | if (estateID != Scene.RegionInfo.EstateSettings.EstateID) | 1094 | if(!isadmin && !estateSettings.IsEstateOwner(agentID)) |
940 | { | 1095 | continue; |
941 | estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); | 1096 | |
942 | estateSettings.RemoveEstateManager(user); | 1097 | estateSettings.RemoveEstateManager(user); |
943 | Scene.EstateDataService.StoreEstateSettings(estateSettings); | 1098 | changed[(int)estateSettings.EstateID] = estateSettings; |
944 | } | ||
945 | } | 1099 | } |
946 | } | 1100 | } |
947 | 1101 | ||
948 | Scene.RegionInfo.EstateSettings.RemoveEstateManager(user); | 1102 | thisSettings.RemoveEstateManager(user); |
949 | Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); | 1103 | changed[thisEstateID] = thisSettings; |
950 | 1104 | ||
951 | TriggerEstateInfoChange(); | 1105 | sendManagers[remote_client] = invoice; |
952 | remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, Scene.RegionInfo.EstateSettings.EstateManagers, Scene.RegionInfo.EstateSettings.EstateID); | ||
953 | } | ||
954 | else | ||
955 | { | ||
956 | remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); | ||
957 | } | 1106 | } |
958 | } | 1107 | } |
1108 | lock(deltareqLock) | ||
1109 | runnigDeltaExec = false; | ||
959 | } | 1110 | } |
960 | 1111 | ||
961 | public void HandleOnEstateManageTelehub(IClientAPI client, UUID invoice, UUID senderID, string cmd, uint param1) | 1112 | public void HandleOnEstateManageTelehub(IClientAPI client, UUID invoice, UUID senderID, string cmd, uint param1) |
@@ -1007,7 +1158,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1007 | IClientAPI remote_client, UUID invoice, UUID senderID, UUID sessionID, string senderName, string message) | 1158 | IClientAPI remote_client, UUID invoice, UUID senderID, UUID sessionID, string senderName, string message) |
1008 | { | 1159 | { |
1009 | IDialogModule dm = Scene.RequestModuleInterface<IDialogModule>(); | 1160 | IDialogModule dm = Scene.RequestModuleInterface<IDialogModule>(); |
1010 | 1161 | ||
1011 | if (dm != null) | 1162 | if (dm != null) |
1012 | dm.SendNotificationToUsersInRegion(senderID, senderName, message); | 1163 | dm.SendNotificationToUsersInRegion(senderID, senderName, message); |
1013 | } | 1164 | } |
@@ -1044,13 +1195,20 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1044 | 1195 | ||
1045 | private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey) | 1196 | private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey) |
1046 | { | 1197 | { |
1198 | EstateTeleportOneUserHomeRequest evOverride = OnEstateTeleportOneUserHomeRequest; | ||
1199 | if(evOverride != null) | ||
1200 | { | ||
1201 | evOverride(remover_client, invoice, senderID, prey); | ||
1202 | return; | ||
1203 | } | ||
1204 | |||
1047 | if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false)) | 1205 | if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false)) |
1048 | return; | 1206 | return; |
1049 | 1207 | ||
1050 | if (prey != UUID.Zero) | 1208 | if (prey != UUID.Zero) |
1051 | { | 1209 | { |
1052 | ScenePresence s = Scene.GetScenePresence(prey); | 1210 | ScenePresence s = Scene.GetScenePresence(prey); |
1053 | if (s != null) | 1211 | if (s != null && !s.IsDeleted && !s.IsInTransit) |
1054 | { | 1212 | { |
1055 | if (!Scene.TeleportClientHome(prey, s.ControllingClient)) | 1213 | if (!Scene.TeleportClientHome(prey, s.ControllingClient)) |
1056 | { | 1214 | { |
@@ -1063,6 +1221,13 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1063 | 1221 | ||
1064 | private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID) | 1222 | private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID) |
1065 | { | 1223 | { |
1224 | EstateTeleportAllUsersHomeRequest evOverride = OnEstateTeleportAllUsersHomeRequest; | ||
1225 | if(evOverride != null) | ||
1226 | { | ||
1227 | evOverride(remover_client, invoice, senderID); | ||
1228 | return; | ||
1229 | } | ||
1230 | |||
1066 | if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false)) | 1231 | if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false)) |
1067 | return; | 1232 | return; |
1068 | 1233 | ||
@@ -1084,7 +1249,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1084 | } | 1249 | } |
1085 | }); | 1250 | }); |
1086 | } | 1251 | } |
1087 | 1252 | ||
1088 | private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID) | 1253 | private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID) |
1089 | { | 1254 | { |
1090 | lock (this) | 1255 | lock (this) |
@@ -1167,7 +1332,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1167 | if (TerrainUploader == null) | 1332 | if (TerrainUploader == null) |
1168 | { | 1333 | { |
1169 | m_log.DebugFormat( | 1334 | m_log.DebugFormat( |
1170 | "[TERRAIN]: Started receiving terrain upload for region {0} from {1}", | 1335 | "[TERRAIN]: Started receiving terrain upload for region {0} from {1}", |
1171 | Scene.Name, remote_client.Name); | 1336 | Scene.Name, remote_client.Name); |
1172 | 1337 | ||
1173 | TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName); | 1338 | TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName); |
@@ -1187,25 +1352,43 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1187 | { | 1352 | { |
1188 | // Save terrain here | 1353 | // Save terrain here |
1189 | ITerrainModule terr = Scene.RequestModuleInterface<ITerrainModule>(); | 1354 | ITerrainModule terr = Scene.RequestModuleInterface<ITerrainModule>(); |
1190 | 1355 | ||
1191 | if (terr != null) | 1356 | if (terr != null) |
1192 | { | 1357 | { |
1358 | string file = Util.cacheDir() + "/terrain_"; | ||
1359 | try | ||
1360 | { | ||
1361 | file = file + Uri.EscapeDataString(Scene.Name) + ".raw"; | ||
1362 | } | ||
1363 | catch (Exception) | ||
1364 | { | ||
1365 | file = file + ".raw"; | ||
1366 | } | ||
1193 | // m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + Scene.RegionInfo.RegionName); | 1367 | // m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + Scene.RegionInfo.RegionName); |
1194 | if (File.Exists(Util.dataDir() + "/terrain.raw")) | 1368 | if (File.Exists(file)) |
1369 | { | ||
1370 | File.Delete(file); | ||
1371 | } | ||
1372 | terr.SaveToFile(file); | ||
1373 | |||
1374 | byte[] bdata; | ||
1375 | using(FileStream input = new FileStream(file, FileMode.Open)) | ||
1376 | { | ||
1377 | bdata = new byte[input.Length]; | ||
1378 | input.Read(bdata, 0, (int)input.Length); | ||
1379 | } | ||
1380 | if(bdata == null || bdata.Length == 0) | ||
1195 | { | 1381 | { |
1196 | File.Delete(Util.dataDir() + "/terrain.raw"); | 1382 | remote_client.SendAlertMessage("Terrain error"); |
1383 | return; | ||
1197 | } | 1384 | } |
1198 | terr.SaveToFile(Util.dataDir() + "/terrain.raw"); | ||
1199 | 1385 | ||
1200 | FileStream input = new FileStream(Util.dataDir() + "/terrain.raw", FileMode.Open); | ||
1201 | byte[] bdata = new byte[input.Length]; | ||
1202 | input.Read(bdata, 0, (int)input.Length); | ||
1203 | remote_client.SendAlertMessage("Terrain file written, starting download..."); | 1386 | remote_client.SendAlertMessage("Terrain file written, starting download..."); |
1204 | Scene.XferManager.AddNewFile("terrain.raw", bdata); | 1387 | string xfername = (UUID.Random()).ToString(); |
1388 | Scene.XferManager.AddNewFile(xfername, bdata); | ||
1205 | 1389 | ||
1206 | m_log.DebugFormat("[CLIENT]: Sending terrain for region {0} to {1}", Scene.Name, remote_client.Name); | 1390 | m_log.DebugFormat("[CLIENT]: Sending terrain for region {0} to {1}", Scene.Name, remote_client.Name); |
1207 | 1391 | remote_client.SendInitiateDownload(xfername, clientFileName); | |
1208 | remote_client.SendInitiateDownload("terrain.raw", clientFileName); | ||
1209 | } | 1392 | } |
1210 | } | 1393 | } |
1211 | 1394 | ||
@@ -1319,7 +1502,8 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1319 | 1502 | ||
1320 | public void sendRegionInfoPacketToAll() | 1503 | public void sendRegionInfoPacketToAll() |
1321 | { | 1504 | { |
1322 | Scene.ForEachRootClient(delegate(IClientAPI client) | 1505 | // Scene.ForEachRootClient(delegate(IClientAPI client) |
1506 | Scene.ForEachClient(delegate(IClientAPI client) | ||
1323 | { | 1507 | { |
1324 | HandleRegionInfoRequest(client); | 1508 | HandleRegionInfoRequest(client); |
1325 | }); | 1509 | }); |
@@ -1443,7 +1627,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1443 | Scene.RegionInfo.EstateSettings.FixedSun, | 1627 | Scene.RegionInfo.EstateSettings.FixedSun, |
1444 | (float)Scene.RegionInfo.EstateSettings.SunPosition); | 1628 | (float)Scene.RegionInfo.EstateSettings.SunPosition); |
1445 | 1629 | ||
1446 | sendRegionInfoPacketToAll(); | 1630 | // sendRegionInfoPacketToAll(); already done by setRegionTerrainSettings |
1447 | } | 1631 | } |
1448 | 1632 | ||
1449 | 1633 | ||
@@ -1477,7 +1661,8 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1477 | sendRegionHandshake(client); | 1661 | sendRegionHandshake(client); |
1478 | } | 1662 | } |
1479 | 1663 | ||
1480 | private uint GetEstateFlags() | 1664 | |
1665 | public uint GetEstateFlags() | ||
1481 | { | 1666 | { |
1482 | RegionFlags flags = RegionFlags.None; | 1667 | RegionFlags flags = RegionFlags.None; |
1483 | 1668 | ||