* Refactored the sound calls to SceneObjectPart
* Fixed a few bugs * Wrote an example module to make certain event systems more mature.ThreadPoolClientBranch
parent
99844ee4c0
commit
ca5aadfbff
|
@ -403,6 +403,8 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
public delegate void MoneyTransferRequest(LLUUID sourceID, LLUUID destID, int amount, int transactionType, string description);
|
public delegate void MoneyTransferRequest(LLUUID sourceID, LLUUID destID, int amount, int transactionType, string description);
|
||||||
|
|
||||||
|
// We keep all this information for fraud purposes in the future.
|
||||||
|
public delegate void MoneyBalanceRequest(IClientAPI remoteClient, LLUUID agentID, LLUUID sessionID, LLUUID TransactionID);
|
||||||
|
|
||||||
public delegate void ObjectPermissions(
|
public delegate void ObjectPermissions(
|
||||||
IClientAPI remoteClinet, LLUUID AgentID, LLUUID SessionID,
|
IClientAPI remoteClinet, LLUUID AgentID, LLUUID SessionID,
|
||||||
|
@ -507,6 +509,8 @@ namespace OpenSim.Framework
|
||||||
// Financial packets
|
// Financial packets
|
||||||
event MoneyTransferRequest OnMoneyTransferRequest;
|
event MoneyTransferRequest OnMoneyTransferRequest;
|
||||||
|
|
||||||
|
event MoneyBalanceRequest OnMoneyBalanceRequest;
|
||||||
|
|
||||||
|
|
||||||
LLVector3 StartPos { get; set; }
|
LLVector3 StartPos { get; set; }
|
||||||
|
|
||||||
|
|
|
@ -581,6 +581,8 @@ namespace OpenSim.Region.ClientStack
|
||||||
|
|
||||||
public event MoneyTransferRequest OnMoneyTransferRequest;
|
public event MoneyTransferRequest OnMoneyTransferRequest;
|
||||||
|
|
||||||
|
public event MoneyBalanceRequest OnMoneyBalanceRequest;
|
||||||
|
|
||||||
|
|
||||||
#region Scene/Avatar to Client
|
#region Scene/Avatar to Client
|
||||||
|
|
||||||
|
@ -2067,6 +2069,9 @@ namespace OpenSim.Region.ClientStack
|
||||||
private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
|
private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack;
|
MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack;
|
||||||
|
// validate the agent owns the agentID and sessionID
|
||||||
|
if (money.MoneyData.SourceID == sender.AgentId && money.AgentData.AgentID == sender.AgentId && money.AgentData.SessionID == sender.SessionId)
|
||||||
|
{
|
||||||
|
|
||||||
if (OnMoneyTransferRequest != null)
|
if (OnMoneyTransferRequest != null)
|
||||||
{
|
{
|
||||||
|
@ -2077,6 +2082,11 @@ namespace OpenSim.Region.ClientStack
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private bool HandleViewerEffect(IClientAPI sender, Packet Pack)
|
private bool HandleViewerEffect(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
|
@ -3434,7 +3444,13 @@ namespace OpenSim.Region.ClientStack
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
case PacketType.MoneyBalanceRequest:
|
case PacketType.MoneyBalanceRequest:
|
||||||
SendMoneyBalance(LLUUID.Zero, true, new byte[0], MoneyBalance);
|
MoneyBalanceRequestPacket moneybalancerequestpacket = (MoneyBalanceRequestPacket)Pack;
|
||||||
|
if (OnMoneyBalanceRequest != null)
|
||||||
|
{
|
||||||
|
OnMoneyBalanceRequest(this, moneybalancerequestpacket.AgentData.AgentID, moneybalancerequestpacket.AgentData.SessionID, moneybalancerequestpacket.MoneyData.TransactionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case PacketType.UUIDNameRequest:
|
case PacketType.UUIDNameRequest:
|
||||||
UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
|
UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
|
||||||
|
|
|
@ -0,0 +1,324 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSim Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Nini.Config;
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
|
using OpenSim.Region.Environment.Interfaces;
|
||||||
|
using OpenSim.Region.Environment.Scenes;
|
||||||
|
using libsecondlife;
|
||||||
|
using MoneyTransferArgs = OpenSim.Region.Environment.Scenes.EventManager.MoneyTransferArgs;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Environment.Modules
|
||||||
|
{
|
||||||
|
public class BetaGridLikeMoneyModule: IRegionModule
|
||||||
|
{
|
||||||
|
|
||||||
|
private LogBase m_log;
|
||||||
|
|
||||||
|
private Dictionary<ulong,Scene> m_scenel = new Dictionary<ulong,Scene>();
|
||||||
|
|
||||||
|
private IConfigSource m_gConfig;
|
||||||
|
|
||||||
|
private bool m_keepMoneyAcrossLogins = true;
|
||||||
|
|
||||||
|
private int m_minFundsBeforeRefresh = 100;
|
||||||
|
|
||||||
|
private int m_stipend = 1000;
|
||||||
|
|
||||||
|
private bool m_enabled = true;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private Dictionary<LLUUID, int> m_KnownClientFunds = new Dictionary<LLUUID, int>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private bool gridmode = false;
|
||||||
|
|
||||||
|
public void Initialise(Scene scene, IConfigSource config)
|
||||||
|
{
|
||||||
|
m_log = MainLog.Instance;
|
||||||
|
|
||||||
|
m_gConfig = config;
|
||||||
|
ReadConfigAndPopulate();
|
||||||
|
|
||||||
|
if (m_enabled)
|
||||||
|
{
|
||||||
|
lock (m_scenel)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (m_scenel.ContainsKey(scene.RegionInfo.RegionHandle))
|
||||||
|
{
|
||||||
|
m_scenel[scene.RegionInfo.RegionHandle] = scene;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_scenel.Add(scene.RegionInfo.RegionHandle, scene);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scene.EventManager.OnNewClient += OnNewClient;
|
||||||
|
scene.EventManager.OnMoneyTransfer += MoneyTransferAction;
|
||||||
|
scene.EventManager.OnClientClosed += ClientClosed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void ReadConfigAndPopulate()
|
||||||
|
{
|
||||||
|
IConfig startupConfig = m_gConfig.Configs["Startup"];
|
||||||
|
gridmode = startupConfig.GetBoolean("gridmode", false);
|
||||||
|
m_enabled = (startupConfig.GetString("moneymodule", "BetaGridLikeMoneyModule") == "BetaGridLikeMoneyModule");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnNewClient(IClientAPI client)
|
||||||
|
{
|
||||||
|
// Here we check if we're in grid mode
|
||||||
|
// I imagine that the 'check balance'
|
||||||
|
// function for the client should be here or shortly after
|
||||||
|
|
||||||
|
if (gridmode)
|
||||||
|
{
|
||||||
|
CheckExistAndRefreshFunds(client.AgentId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CheckExistAndRefreshFunds(client.AgentId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subscribe to Money messages
|
||||||
|
client.OnMoneyBalanceRequest += SendMoneyBalance;
|
||||||
|
client.OnLogout += ClientClosed;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClientClosed(LLUUID AgentID)
|
||||||
|
{
|
||||||
|
lock (m_KnownClientFunds)
|
||||||
|
{
|
||||||
|
if (!m_keepMoneyAcrossLogins)
|
||||||
|
m_KnownClientFunds.Remove(AgentID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MoneyTransferAction (Object osender, MoneyTransferArgs e)
|
||||||
|
{
|
||||||
|
IClientAPI sender = null;
|
||||||
|
IClientAPI receiver = null;
|
||||||
|
|
||||||
|
sender = LocateClientObject(e.sender);
|
||||||
|
if (sender != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
receiver = LocateClientObject(e.reciever);
|
||||||
|
bool transactionresult = doMoneyTranfer(e.sender, e.reciever, e.amount);
|
||||||
|
|
||||||
|
if (e.sender != e.reciever)
|
||||||
|
{
|
||||||
|
if (sender != null)
|
||||||
|
{
|
||||||
|
sender.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.sender));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (receiver != null)
|
||||||
|
{
|
||||||
|
receiver.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.reciever));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MainLog.Instance.Warn("MONEY", "Potential Fraud Warning, got money transfer request for avatar that isn't in this simulator - Details; Sender:" + e.sender.ToString() + " Reciver: " + e.reciever.ToString() + " Amount: " + e.amount.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool doMoneyTranfer(LLUUID Sender, LLUUID Receiver, int amount)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
if (amount >= 0)
|
||||||
|
{
|
||||||
|
lock (m_KnownClientFunds)
|
||||||
|
{
|
||||||
|
// If we don't know about the sender, then the sender can't
|
||||||
|
// actually be here and therefore this is likely fraud or outdated.
|
||||||
|
if (m_KnownClientFunds.ContainsKey(Sender))
|
||||||
|
{
|
||||||
|
// Does the sender have enough funds to give?
|
||||||
|
if (m_KnownClientFunds[Sender] >= amount)
|
||||||
|
{
|
||||||
|
// Subtract the funds from the senders account
|
||||||
|
m_KnownClientFunds[Sender] -= amount;
|
||||||
|
|
||||||
|
// do we know about the receiver?
|
||||||
|
if (!m_KnownClientFunds.ContainsKey(Receiver))
|
||||||
|
{
|
||||||
|
// Make a record for them so they get the updated balance when they login
|
||||||
|
CheckExistAndRefreshFunds(Receiver);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Add the amount to the Receiver's funds
|
||||||
|
m_KnownClientFunds[Receiver] += amount;
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// These below are redundant to make this clearer to read
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IClientAPI LocateClientObject(LLUUID AgentID)
|
||||||
|
{
|
||||||
|
ScenePresence tPresence = null;
|
||||||
|
IClientAPI rclient = null;
|
||||||
|
|
||||||
|
lock (m_scenel)
|
||||||
|
{
|
||||||
|
foreach (Scene _scene in m_scenel.Values)
|
||||||
|
{
|
||||||
|
tPresence = _scene.GetScenePresence(AgentID);
|
||||||
|
if (tPresence != null)
|
||||||
|
{
|
||||||
|
if (!tPresence.IsChildAgent)
|
||||||
|
{
|
||||||
|
rclient = tPresence.ControllingClient;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rclient != null)
|
||||||
|
{
|
||||||
|
return rclient;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClientClosed(IClientAPI client)
|
||||||
|
{
|
||||||
|
ClientClosed(client.AgentId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendMoneyBalance(IClientAPI client, LLUUID agentID, LLUUID SessionID, LLUUID TransactionID)
|
||||||
|
{
|
||||||
|
if (client.AgentId == agentID && client.SessionId == SessionID)
|
||||||
|
{
|
||||||
|
|
||||||
|
int returnfunds = 0;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
returnfunds = GetFundsForAgentID(agentID);
|
||||||
|
}
|
||||||
|
catch (System.Exception e)
|
||||||
|
{
|
||||||
|
client.SendAlertMessage(e.Message + " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
client.SendMoneyBalance(TransactionID, true, new byte[0], returnfunds);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
client.SendAlertMessage("Unable to send your money balance to you!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CheckExistAndRefreshFunds(LLUUID agentID)
|
||||||
|
{
|
||||||
|
lock (m_KnownClientFunds)
|
||||||
|
{
|
||||||
|
if (!m_KnownClientFunds.ContainsKey(agentID))
|
||||||
|
{
|
||||||
|
m_KnownClientFunds.Add(agentID, m_stipend);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_KnownClientFunds[agentID] <= m_minFundsBeforeRefresh)
|
||||||
|
{
|
||||||
|
m_KnownClientFunds[agentID] = m_stipend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private int GetFundsForAgentID(LLUUID AgentID)
|
||||||
|
{
|
||||||
|
int returnfunds = 0;
|
||||||
|
lock (m_KnownClientFunds)
|
||||||
|
{
|
||||||
|
if (m_KnownClientFunds.ContainsKey(AgentID))
|
||||||
|
{
|
||||||
|
returnfunds = m_KnownClientFunds[AgentID];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to get funds.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnfunds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PostInitialise()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get { return "BetaGridLikeMoneyModule"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsSharedModule
|
||||||
|
{
|
||||||
|
get { return true; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1315,6 +1315,8 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
avatar.AbsolutePosition.Z);
|
avatar.AbsolutePosition.Z);
|
||||||
m_sceneGridService.SendCloseChildAgentConnections(avatar);
|
m_sceneGridService.SendCloseChildAgentConnections(avatar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_eventManager.TriggerClientClosed(agentID);
|
||||||
}
|
}
|
||||||
catch (NullReferenceException)
|
catch (NullReferenceException)
|
||||||
{
|
{
|
||||||
|
|
|
@ -125,6 +125,10 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
public event NewGridInstantMessage OnGridInstantMessageToGroupsModule;
|
public event NewGridInstantMessage OnGridInstantMessageToGroupsModule;
|
||||||
|
|
||||||
|
public delegate void ClientClosed(LLUUID clientID);
|
||||||
|
|
||||||
|
public event ClientClosed OnClientClosed;
|
||||||
|
|
||||||
public delegate void ScriptChangedEvent(uint localID, uint change);
|
public delegate void ScriptChangedEvent(uint localID, uint change);
|
||||||
|
|
||||||
public event ScriptChangedEvent OnScriptChangedEvent;
|
public event ScriptChangedEvent OnScriptChangedEvent;
|
||||||
|
@ -339,5 +343,13 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void TriggerClientClosed(LLUUID ClientID)
|
||||||
|
{
|
||||||
|
if (OnClientClosed != null)
|
||||||
|
{
|
||||||
|
OnClientClosed(ClientID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1457,6 +1457,84 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Sound
|
||||||
|
public void PreloadSound(string sound)
|
||||||
|
{
|
||||||
|
LLUUID ownerID = OwnerID;
|
||||||
|
LLUUID objectID = UUID;
|
||||||
|
LLUUID soundID = LLUUID.Zero;
|
||||||
|
|
||||||
|
if (!LLUUID.TryParse(sound, out soundID))
|
||||||
|
{
|
||||||
|
//Trys to fetch sound id from prim's inventory.
|
||||||
|
//Prim's inventory doesn't support non script items yet
|
||||||
|
SceneObjectPart op = this;
|
||||||
|
foreach (KeyValuePair<LLUUID, TaskInventoryItem> item in op.TaskInventory)
|
||||||
|
{
|
||||||
|
if (item.Value.Name == sound)
|
||||||
|
{
|
||||||
|
soundID = item.Value.ItemID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
|
||||||
|
foreach (ScenePresence p in avatarts)
|
||||||
|
{
|
||||||
|
// TODO: some filtering by distance of avatar
|
||||||
|
|
||||||
|
p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendSound(string sound, double volume, bool triggered)
|
||||||
|
{
|
||||||
|
if (volume > 1)
|
||||||
|
volume = 1;
|
||||||
|
if (volume < 0)
|
||||||
|
volume = 0;
|
||||||
|
|
||||||
|
LLUUID ownerID = OwnerID;
|
||||||
|
LLUUID objectID = UUID;
|
||||||
|
LLUUID parentID = GetRootPartUUID();
|
||||||
|
LLUUID soundID = LLUUID.Zero;
|
||||||
|
LLVector3 position = AbsolutePosition; // region local
|
||||||
|
ulong regionHandle = m_parentGroup.Scene.RegionInfo.RegionHandle;
|
||||||
|
|
||||||
|
byte flags = 0;
|
||||||
|
|
||||||
|
if (!LLUUID.TryParse(sound, out soundID))
|
||||||
|
{
|
||||||
|
// search sound file from inventory
|
||||||
|
SceneObjectPart op = this;
|
||||||
|
foreach (KeyValuePair<LLUUID, TaskInventoryItem> item in op.TaskInventory)
|
||||||
|
{
|
||||||
|
if (item.Value.Name == sound)
|
||||||
|
{
|
||||||
|
soundID = item.Value.ItemID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
|
||||||
|
foreach (ScenePresence p in avatarts)
|
||||||
|
{
|
||||||
|
// TODO: some filtering by distance of avatar
|
||||||
|
if (triggered)
|
||||||
|
{
|
||||||
|
p.ControllingClient.SendTriggeredSound(soundID, ownerID, objectID, parentID, regionHandle, position, (float)volume);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)volume, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Resizing/Scale
|
#region Resizing/Scale
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -145,6 +145,7 @@ namespace SimpleApp
|
||||||
public event FriendActionDelegate OnDenyFriendRequest;
|
public event FriendActionDelegate OnDenyFriendRequest;
|
||||||
public event FriendshipTermination OnTerminateFriendship;
|
public event FriendshipTermination OnTerminateFriendship;
|
||||||
public event PacketStats OnPacketStats;
|
public event PacketStats OnPacketStats;
|
||||||
|
public event MoneyBalanceRequest OnMoneyBalanceRequest;
|
||||||
|
|
||||||
#pragma warning restore 67
|
#pragma warning restore 67
|
||||||
|
|
||||||
|
|
|
@ -906,37 +906,8 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
|
|
||||||
public void llPlaySound(string sound, double volume)
|
public void llPlaySound(string sound, double volume)
|
||||||
{
|
{
|
||||||
if (volume > 1)
|
|
||||||
volume = 1;
|
|
||||||
if (volume < 0)
|
|
||||||
volume = 0;
|
|
||||||
|
|
||||||
LLUUID ownerID = m_host.OwnerID;
|
m_host.SendSound(sound, volume, false);
|
||||||
LLUUID objectID = m_host.UUID;
|
|
||||||
LLUUID soundID = LLUUID.Zero;
|
|
||||||
byte flags = 0;
|
|
||||||
|
|
||||||
if (!LLUUID.TryParse(sound, out soundID))
|
|
||||||
{
|
|
||||||
//Trys to fetch sound id from prim's inventory.
|
|
||||||
//Prim's inventory doesn't support non script items yet
|
|
||||||
SceneObjectPart op = World.GetSceneObjectPart(objectID);
|
|
||||||
foreach (KeyValuePair<LLUUID, TaskInventoryItem> item in op.TaskInventory)
|
|
||||||
{
|
|
||||||
if (item.Value.Name == sound)
|
|
||||||
{
|
|
||||||
soundID = item.Value.ItemID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ScenePresence> avatarts = World.GetAvatars();
|
|
||||||
foreach (ScenePresence p in avatarts)
|
|
||||||
{
|
|
||||||
// TODO: some filtering by distance of avatar
|
|
||||||
p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)volume, flags);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llLoopSound(string sound, double volume)
|
public void llLoopSound(string sound, double volume)
|
||||||
|
@ -961,38 +932,7 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
|
|
||||||
public void llTriggerSound(string sound, double volume)
|
public void llTriggerSound(string sound, double volume)
|
||||||
{
|
{
|
||||||
if (volume > 1)
|
m_host.SendSound(sound, volume, true);
|
||||||
volume = 1;
|
|
||||||
if (volume < 0)
|
|
||||||
volume = 0;
|
|
||||||
|
|
||||||
LLUUID ownerID = m_host.OwnerID;
|
|
||||||
LLUUID objectID = m_host.UUID;
|
|
||||||
LLUUID parentID = this.m_host.GetRootPartUUID();
|
|
||||||
LLUUID soundID = LLUUID.Zero;
|
|
||||||
LLVector3 position = this.m_host.AbsolutePosition; // region local
|
|
||||||
ulong regionHandle = World.RegionInfo.RegionHandle;
|
|
||||||
|
|
||||||
if (!LLUUID.TryParse(sound, out soundID))
|
|
||||||
{
|
|
||||||
// search sound file from inventory
|
|
||||||
SceneObjectPart op = World.GetSceneObjectPart(objectID);
|
|
||||||
foreach (KeyValuePair<LLUUID, TaskInventoryItem> item in op.TaskInventory)
|
|
||||||
{
|
|
||||||
if (item.Value.Name == sound)
|
|
||||||
{
|
|
||||||
soundID = item.Value.ItemID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ScenePresence> avatarts = World.GetAvatars();
|
|
||||||
foreach (ScenePresence p in avatarts)
|
|
||||||
{
|
|
||||||
// TODO: some filtering by distance of avatar
|
|
||||||
p.ControllingClient.SendTriggeredSound(soundID, ownerID, objectID, parentID, regionHandle, position, (float)volume);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llStopSound()
|
public void llStopSound()
|
||||||
|
@ -1002,31 +942,7 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
|
|
||||||
public void llPreloadSound(string sound)
|
public void llPreloadSound(string sound)
|
||||||
{
|
{
|
||||||
LLUUID ownerID = m_host.OwnerID;
|
m_host.PreloadSound(sound);
|
||||||
LLUUID objectID = m_host.UUID;
|
|
||||||
LLUUID soundID = LLUUID.Zero;
|
|
||||||
|
|
||||||
if (!LLUUID.TryParse(sound, out soundID))
|
|
||||||
{
|
|
||||||
//Trys to fetch sound id from prim's inventory.
|
|
||||||
//Prim's inventory doesn't support non script items yet
|
|
||||||
SceneObjectPart op = World.GetSceneObjectPart(objectID);
|
|
||||||
foreach (KeyValuePair<LLUUID, TaskInventoryItem> item in op.TaskInventory)
|
|
||||||
{
|
|
||||||
if (item.Value.Name == sound)
|
|
||||||
{
|
|
||||||
soundID = item.Value.ItemID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ScenePresence> avatarts = World.GetAvatars();
|
|
||||||
foreach (ScenePresence p in avatarts)
|
|
||||||
{
|
|
||||||
// TODO: some filtering by distance of avatar
|
|
||||||
p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string llGetSubString(string src, int start, int end)
|
public string llGetSubString(string src, int start, int end)
|
||||||
|
@ -2439,32 +2355,7 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
|
|
||||||
}
|
}
|
||||||
prules.CRC = 1;
|
prules.CRC = 1;
|
||||||
Console.WriteLine("----------ps----------\n");
|
|
||||||
Console.WriteLine(" AngularVelocity:" + prules.AngularVelocity.ToString() + "\n" +
|
|
||||||
" BurstPartCount:" + prules.BurstPartCount.ToString() + "\n" +
|
|
||||||
" BurstRadius:" + prules.BurstRadius.ToString() + "\n" +
|
|
||||||
" BurstRate:" + prules.BurstRate.ToString() + "\n" +
|
|
||||||
" BurstSpeedMax:" + prules.BurstSpeedMax.ToString() + "\n" +
|
|
||||||
" BurstSpeedMin:" + prules.BurstSpeedMin.ToString() + "\n" +
|
|
||||||
" CRC:" + prules.CRC.ToString() + "\n" +
|
|
||||||
" InnerAngle:" + prules.InnerAngle.ToString() + "\n" +
|
|
||||||
" MaxAge:" + prules.MaxAge.ToString() + "\n" +
|
|
||||||
" OuterAngle:" + prules.OuterAngle.ToString() + "\n" +
|
|
||||||
" PartAcceleration:" + prules.PartAcceleration.ToString() + "\n" +
|
|
||||||
" PartDataFlags:" + prules.PartDataFlags.ToString() + "\n" +
|
|
||||||
" PartEndColor:" + prules.PartEndColor.ToString() + "\n" +
|
|
||||||
" PartEndScaleX:" + prules.PartEndScaleX.ToString() + "\n" +
|
|
||||||
" PartEndScaleY:" + prules.PartEndScaleY.ToString() + "\n" +
|
|
||||||
" PartFlags:" + prules.PartFlags.ToString() + "\n" +
|
|
||||||
" PartMaxAge:" + prules.PartMaxAge.ToString() + "\n" +
|
|
||||||
" PartStartColor:" + prules.PartStartColor.ToString() + "\n" +
|
|
||||||
" PartStartScaleX:" + prules.PartStartScaleX.ToString() + "\n" +
|
|
||||||
" PartStartScaleY:" + prules.PartStartScaleY.ToString() + "\n" +
|
|
||||||
" Pattern:" + prules.Pattern.ToString() + "\n" +
|
|
||||||
" StartAge:" + prules.StartAge.ToString() + "\n" +
|
|
||||||
" Target:" + prules.Target.ToString() + "\n" +
|
|
||||||
" Texture:" + prules.Texture.ToString() + "");
|
|
||||||
OpenSim.Framework.Console.MainLog.Instance.Verbose("PARTICLE", "PS: " + prules.ToString());
|
|
||||||
m_host.AddNewParticleSystem(prules);
|
m_host.AddNewParticleSystem(prules);
|
||||||
m_host.SendFullUpdateToAllClients();
|
m_host.SendFullUpdateToAllClients();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue