private void SendOutNearestBanLine(IScenePresence sp, ILandObject ourLandObject) { int multiple = 0; int result = 0; Vector3 spAbs = sp.AbsolutePosition; foreach (ILandObject parcel in from parcel in AllParcels() let aamax = parcel.LandData.AABBMax let aamin = parcel.LandData.AABBMin where Math.Abs(aamax.X - spAbs.X) < 4 || Math.Abs(aamax.Y - spAbs.Y) < 4 || Math.Abs(aamin.X - spAbs.X) < 4 || Math.Abs(aamin.Y - spAbs.Y) < 4 select parcel) { //Do the & since we don't need to check again if we have already set the ban flag if ((result & (int) ParcelPropertiesStatus.CollisionBanned) != (int) ParcelPropertiesStatus.CollisionBanned && parcel.IsBannedFromLand(sp.UUID)) { multiple++; result |= (int) ParcelPropertiesStatus.CollisionBanned; continue; //Only send one } else if ((result & (int) ParcelPropertiesStatus.CollisionNotOnAccessList) != (int) ParcelPropertiesStatus.CollisionNotOnAccessList && parcel.IsRestrictedFromLand(sp.UUID)) { multiple++; result |= (int) ParcelPropertiesStatus.CollisionNotOnAccessList; continue; //Only send one } } ParcelResult dataResult = ParcelResult.NoData; if (multiple > 1) dataResult = ParcelResult.Multiple; else if (multiple == 1) dataResult = ParcelResult.Single; m_lastDataResults[sp.UUID] = dataResult; m_lastResults[sp.UUID] = result; m_lastLandObject[sp.UUID] = ourLandObject; if (multiple == 0) //If there is no result, don't send anything return; ourLandObject.SendLandProperties(result, false, (int) dataResult, sp.ControllingClient); }
public void UpdateLandProperties(ILandObject land, LandUpdateArgs args, IClientAPI remote_client) { bool snap_selection = false; bool needOverlay = false; if (land.UpdateLandProperties(args, remote_client, out snap_selection, out needOverlay)) { UUID parcelID = land.LandData.GlobalID; m_scene.ForEachScenePresence(delegate(ScenePresence avatar) { if (avatar.IsDeleted || avatar.isNPC) return; IClientAPI client = avatar.ControllingClient; if (needOverlay) SendParcelOverlay(client); if (avatar.IsChildAgent) { if(client == remote_client) land.SendLandProperties(-10000, false, LandChannel.LAND_RESULT_SINGLE, client); return; } ILandObject aland = GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); if (aland != null) { if(client == remote_client && land != aland) land.SendLandProperties(-10000, false, LandChannel.LAND_RESULT_SINGLE, client); else if (land == aland) aland.SendLandProperties(0, false, LandChannel.LAND_RESULT_SINGLE, client); } if (avatar.currentParcelUUID == parcelID) avatar.currentParcelUUID = parcelID; // force parcel flags review }); } }