Merging from server/server-1.25 back to trunk.

svn merge -r99446:104838 svn+ssh://svn.lindenlab.com/svn/linden/branches/server/server-1.25

Conflicts resolved by Prospero, except for one scary conflict in
SendConfirmationEmail.php which was resolved by jarv.
master
Robert Knop 2008-12-04 22:36:34 +00:00
parent fd46865a50
commit 189599b6ff
20 changed files with 261 additions and 64 deletions

View File

@ -36,10 +36,13 @@ import re
from indra.util.fastest_elementtree import ElementTreeError, fromstring
from indra.base import lluuid
try:
import cllsd
except ImportError:
cllsd = None
# cllsd.c in server/server-1.25 has memory leaks,
# so disabling cllsd for now
#try:
# import cllsd
#except ImportError:
# cllsd = None
cllsd = None
int_regex = re.compile(r"[-+]?\d+")
real_regex = re.compile(r"[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)?")

View File

@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
* Copyright (c) 2001-2007, Linden Research, Inc.
* Copyright (c) 2001-2008, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@ -77,6 +77,14 @@ enum LAND_STAT_REPORT_TYPE
const U32 STAT_FILTER_MASK = 0x1FFFFFFF;
// Region absolute limits
static const S32 REGION_AGENT_COUNT_MIN = 1;
static const S32 REGION_AGENT_COUNT_MAX = 200; // Must fit in U8 for the moment (RegionInfo msg)
static const S32 REGION_PRIM_COUNT_MIN = 0;
static const S32 REGION_PRIM_COUNT_MAX = 40000;
static const F32 REGION_PRIM_BONUS_MIN = 1.0;
static const F32 REGION_PRIM_BONUS_MAX = 10.0;
// Default maximum number of tasks/prims per region.
const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
@ -229,10 +237,11 @@ const S32 KEY_COUNT = 256;
const F32 DEFAULT_WATER_HEIGHT = 20.0f;
// Maturity ratings for simulators
const U8 SIM_ACCESS_MIN = 0;
const U8 SIM_ACCESS_MIN = 0; // Treated as 'unknown', usually ends up being SIM_ACCESS_PG
const U8 SIM_ACCESS_TRIAL = 7;
const U8 SIM_ACCESS_PG = 13;
const U8 SIM_ACCESS_MATURE = 21;
const U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only
const U8 SIM_ACCESS_DOWN = 254;
const U8 SIM_ACCESS_MAX = SIM_ACCESS_MATURE;

View File

@ -88,6 +88,12 @@ LLAppChildCallback LLApp::sDefaultChildCallback = NULL;
LLApp::LLApp() : mThreadErrorp(NULL)
{
commonCtor();
startErrorThread();
}
void LLApp::commonCtor()
{
// Set our status to running
setStatus(APP_STATUS_RUNNING);
@ -96,9 +102,9 @@ LLApp::LLApp() : mThreadErrorp(NULL)
#if !LL_WINDOWS
// This must be initialized before the error handler.
sSigChildCount = new LLAtomicU32(0);
sSigChildCount = new LLAtomicU32(0);
#endif
// Setup error handling
setupErrorHandling();
@ -118,6 +124,13 @@ LLApp::LLApp() : mThreadErrorp(NULL)
// Set the application to this instance.
sApplication = this;
}
LLApp::LLApp(LLErrorThread *error_thread) :
mThreadErrorp(error_thread)
{
commonCtor();
}
@ -261,17 +274,20 @@ void LLApp::setupErrorHandling()
#endif
}
void LLApp::startErrorThread()
{
//
// Start the error handling thread, which is responsible for taking action
// when the app goes into the APP_STATUS_ERROR state
//
llinfos << "LLApp::setupErrorHandling - Starting error thread" << llendl;
llinfos << "Starting error thread" << llendl;
mThreadErrorp = new LLErrorThread();
mThreadErrorp->setUserData((void *) this);
mThreadErrorp->start();
mThreadErrorp->start();
}
void LLApp::setErrorHandler(LLAppErrorHandler handler)
{
LLApp::sErrorHandler = handler;

View File

@ -77,6 +77,11 @@ public:
LLApp();
virtual ~LLApp();
protected:
LLApp(LLErrorThread* error_thread);
void commonCtor();
public:
/**
* @brief Return the static app instance if one was created.
*/
@ -245,8 +250,9 @@ protected:
void stepFrame();
private:
void startErrorThread();
void setupErrorHandling(); // Do platform-specific error-handling setup (signals, structured exceptions)
static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.
static void runSyncErrorHandler(); // run IMMEDIATELY when we get an error, ran in the context of the faulting thread.

View File

@ -33,9 +33,9 @@
#define LL_LLVERSIONSERVER_H
const S32 LL_VERSION_MAJOR = 1;
const S32 LL_VERSION_MINOR = 25;
const S32 LL_VERSION_MINOR = 26;
const S32 LL_VERSION_PATCH = 0;
const S32 LL_VERSION_BUILD = 104413;
const S32 LL_VERSION_BUILD = 103578;
const char * const LL_CHANNEL = "Second Life Server";

View File

@ -62,7 +62,6 @@
#include "lltransfermanager.h"
#include "llmodularmath.h"
const F32 PING_INTERVAL = 5.f; // seconds
const S32 PING_START_BLOCK = 3; // How many pings behind we have to be to consider ourself blocked.
const S32 PING_RELEASE_BLOCK = 2; // How many pings behind we have to be to consider ourself unblocked.
@ -70,7 +69,8 @@ const F32 TARGET_PERIOD_LENGTH = 5.f; // seconds
const F32 LL_DUPLICATE_SUPPRESSION_TIMEOUT = 60.f; //seconds - this can be long, as time-based cleanup is
// only done when wrapping packetids, now...
LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id)
LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id,
const F32 circuit_heartbeat_interval, const F32 circuit_timeout)
: mHost (host),
mWrapID(0),
mPacketsOutID(0),
@ -105,7 +105,9 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id)
mPeakBPSOut(0),
mPeriodTime(0.0),
mExistenceTimer(),
mCurrentResendCount(0)
mCurrentResendCount(0),
mHeartbeatInterval(circuit_heartbeat_interval),
mHeartbeatTimeout(circuit_timeout)
{
// Need to guarantee that this time is up to date, we may be creating a circuit even though we haven't been
// running a message system loop.
@ -113,9 +115,9 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id)
F32 distribution_offset = ll_frand();
mPingTime = mt_sec;
mLastPingSendTime = mt_sec + PING_INTERVAL * distribution_offset;
mLastPingSendTime = mt_sec + mHeartbeatInterval * distribution_offset;
mLastPingReceivedTime = mt_sec;
mNextPingSendTime = mLastPingSendTime + 0.95*PING_INTERVAL + ll_frand(0.1f*PING_INTERVAL);
mNextPingSendTime = mLastPingSendTime + 0.95*mHeartbeatInterval + ll_frand(0.1f*mHeartbeatInterval);
mPeriodTime = mt_sec;
mTimeoutCallback = NULL;
@ -429,7 +431,8 @@ S32 LLCircuitData::resendUnackedPackets(const F64 now)
}
LLCircuit::LLCircuit() : mLastCircuit(NULL)
LLCircuit::LLCircuit(const F32 circuit_heartbeat_interval, const F32 circuit_timeout) : mLastCircuit(NULL),
mHeartbeatInterval(circuit_heartbeat_interval), mHeartbeatTimeout(circuit_timeout)
{
}
@ -447,7 +450,7 @@ LLCircuitData *LLCircuit::addCircuitData(const LLHost &host, TPACKETID in_id)
{
// This should really validate if one already exists
llinfos << "LLCircuit::addCircuitData for " << host << llendl;
LLCircuitData *tempp = new LLCircuitData(host, in_id);
LLCircuitData *tempp = new LLCircuitData(host, in_id, mHeartbeatInterval, mHeartbeatTimeout);
mCircuitData.insert(circuit_data_map::value_type(host, tempp));
mPingSet.insert(tempp);
@ -801,7 +804,7 @@ void LLCircuit::updateWatchDogTimers(LLMessageSystem *msgsys)
// Always remember to remove it from the set before changing the sorting
// key (mNextPingSendTime)
mPingSet.erase(psit);
cdp->mNextPingSendTime = cur_time + PING_INTERVAL;
cdp->mNextPingSendTime = cur_time + mHeartbeatInterval;
mPingSet.insert(cdp);
continue;
}
@ -819,7 +822,7 @@ void LLCircuit::updateWatchDogTimers(LLMessageSystem *msgsys)
if (cdp->updateWatchDogTimers(msgsys))
{
// Randomize our pings a bit by doing some up to 5% early or late
F64 dt = 0.95f*PING_INTERVAL + ll_frand(0.1f*PING_INTERVAL);
F64 dt = 0.95f*mHeartbeatInterval + ll_frand(0.1f*mHeartbeatInterval);
// Remove it, and reinsert it with the new next ping time.
// Always remove before changing the sorting key.
@ -1047,7 +1050,7 @@ BOOL LLCircuitData::checkCircuitTimeout()
F64 time_since_last_ping = LLMessageSystem::getMessageTimeSeconds() - mLastPingReceivedTime;
// Nota Bene: This needs to be turned off if you are debugging multiple simulators
if (time_since_last_ping > PING_INTERVAL_MAX)
if (time_since_last_ping > mHeartbeatTimeout)
{
llwarns << "LLCircuitData::checkCircuitTimeout for " << mHost << " last ping " << time_since_last_ping << " seconds ago." <<llendl;
setAlive(FALSE);
@ -1063,10 +1066,7 @@ BOOL LLCircuitData::checkCircuitTimeout()
return FALSE;
}
}
else if (time_since_last_ping > PING_INTERVAL_ALARM)
{
//llwarns << "Unresponsive circuit: " << mHost << ": " << time_since_last_ping << " seconds since last ping."<< llendl;
}
return TRUE;
}
@ -1280,7 +1280,7 @@ void LLCircuitData::pingTimerStop(const U8 ping_id)
delta_ping += 256;
}
U32 msec = (U32) ((delta_ping*PING_INTERVAL + time) * 1000.f);
U32 msec = (U32) ((delta_ping*mHeartbeatInterval + time) * 1000.f);
setPingDelay(msec);
mPingsInTransit = delta_ping;
@ -1371,7 +1371,8 @@ F32 LLCircuitData::getPingInTransitTime()
if (mPingsInTransit)
{
time_since_ping_was_sent = (F32)((mPingsInTransit*PING_INTERVAL - 1) + (LLMessageSystem::getMessageTimeSeconds() - mPingTime))*1000.f;
time_since_ping_was_sent = (F32)((mPingsInTransit*mHeartbeatInterval - 1)
+ (LLMessageSystem::getMessageTimeSeconds() - mPingTime))*1000.f;
}
return time_since_ping_was_sent;

View File

@ -50,10 +50,6 @@
//
// Constants
//
const F32 PING_INTERVAL_MAX = 100.f;
const F32 PING_INTERVAL_ALARM = 50.f;
const F32 LL_AVERAGED_PING_ALPHA = 0.2f; // relaxation constant on ping running average
const F32 LL_AVERAGED_PING_MAX = 2000; // msec
const F32 LL_AVERAGED_PING_MIN = 100; // msec // IW: increased to avoid retransmits when a process is slow
@ -85,7 +81,8 @@ class LLSD;
class LLCircuitData
{
public:
LLCircuitData(const LLHost &host, TPACKETID in_id);
LLCircuitData(const LLHost &host, TPACKETID in_id,
const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
~LLCircuitData();
S32 resendUnackedPackets(const F64 now);
@ -283,6 +280,9 @@ protected:
S32 mCurrentResendCount; // Number of resent packets since last spam
LLStatRate mOutOfOrderRate; // Rate of out of order packets coming in.
U32 mLastPacketGap; // Gap in sequence number of last packet.
const F32 mHeartbeatInterval;
const F32 mHeartbeatTimeout;
};
@ -292,7 +292,7 @@ class LLCircuit
{
public:
// CREATORS
LLCircuit();
LLCircuit(const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
~LLCircuit();
// ACCESSORS
@ -345,5 +345,9 @@ protected:
// optimize the many, many times we call findCircuit. This may be
// set in otherwise const methods, so it is declared mutable.
mutable LLCircuitData* mLastCircuit;
private:
const F32 mHeartbeatInterval;
const F32 mHeartbeatTimeout;
};
#endif

View File

@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
* Copyright (c) 2002-2007, Linden Research, Inc.
* Copyright (c) 2002-2008, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@ -60,8 +60,10 @@ const U32 REGION_FLAGS_BLOCK_LAND_RESELL = (1 << 7);
// All content wiped once per night
const U32 REGION_FLAGS_SANDBOX = (1 << 8);
const U32 REGION_FLAGS_NULL_LAYER = (1 << 9);
const U32 REGION_FLAGS_SKIP_AGENT_ACTION = (1 << 10);
const U32 REGION_FLAGS_SKIP_UPDATE_INTEREST_LIST= (1 << 11);
// const U32 REGION_FLAGS_SKIP_AGENT_ACTION = (1 << 10);
const U32 REGION_FLAGS_HARD_ALLOW_LAND_TRANSFER = (1 << 10); // Region allows land reselling
// const U32 REGION_FLAGS_SKIP_UPDATE_INTEREST_LIST= (1 << 11);
const U32 REGION_FLAGS_HARD_ALLOW_POST_CLASSIFIED = (1 << 11); // Region allows posting of classified ads
const U32 REGION_FLAGS_SKIP_COLLISIONS = (1 << 12); // Pin all non agent rigid bodies
const U32 REGION_FLAGS_SKIP_SCRIPTS = (1 << 13);
const U32 REGION_FLAGS_SKIP_PHYSICS = (1 << 14); // Skip all physics

View File

@ -290,7 +290,9 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port,
S32 version_major,
S32 version_minor,
S32 version_patch,
bool failure_is_fatal)
bool failure_is_fatal,
const F32 circuit_heartbeat_interval, const F32 circuit_timeout) :
mCircuitInfo(circuit_heartbeat_interval, circuit_timeout)
{
init();
@ -2496,7 +2498,9 @@ bool start_messaging_system(
bool b_dump_prehash_file,
const std::string& secret,
const LLUseCircuitCodeResponder* responder,
bool failure_is_fatal)
bool failure_is_fatal,
const F32 circuit_heartbeat_interval,
const F32 circuit_timeout)
{
gMessageSystem = new LLMessageSystem(
template_name,
@ -2504,7 +2508,9 @@ bool start_messaging_system(
version_major,
version_minor,
version_patch,
failure_is_fatal);
failure_is_fatal,
circuit_heartbeat_interval,
circuit_timeout);
g_shared_secret.assign(secret);
if (!gMessageSystem)

View File

@ -285,7 +285,8 @@ public:
// Read file and build message templates
LLMessageSystem(const std::string& filename, U32 port, S32 version_major,
S32 version_minor, S32 version_patch,
bool failure_is_fatal = true);
bool failure_is_fatal,
const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
~LLMessageSystem();
@ -780,8 +781,10 @@ bool start_messaging_system(
S32 version_patch,
bool b_dump_prehash_file,
const std::string& secret,
const LLUseCircuitCodeResponder* responder = NULL,
bool failure_is_fatal = true);
const LLUseCircuitCodeResponder* responder,
bool failure_is_fatal,
const F32 circuit_heartbeat_interval,
const F32 circuit_timeout);
void end_messaging_system();

View File

@ -36,7 +36,8 @@ FS (f|F)
#include "llclickaction.h"
void count();
void comment();
void line_comment();
void block_comment();
void parse_string();
#define YYLMAX 16384
@ -60,7 +61,8 @@ extern "C" { int yyerror(const char *fmt, ...); }
%}
%%
"//" { gInternalLine++; gInternalColumn = 0; comment(); }
"//" { gInternalLine++; gInternalColumn = 0; line_comment(); }
"/*" { block_comment(); }
"integer" { count(); return(INTEGER); }
"float" { count(); return(FLOAT_TYPE); }
@ -790,7 +792,7 @@ S32 yywrap()
return(1);
}
void comment()
void line_comment()
{
char c;
@ -798,6 +800,25 @@ void comment()
;
}
void block_comment()
{
char c1 = 0;
char c2 = yyinput();
while (c2 != 0 && c2 != EOF && !(c1 == '*' && c2 == '/')) {
if (c2 == '\n')
{
gInternalLine++;
gInternalColumn = 0;
}
else if (c2 == '\t')
gInternalColumn += 4 - (gInternalColumn % 8);
else
gInternalColumn++;
c1 = c2;
c2 = yyinput();
}
}
void count()
{
S32 i;

View File

@ -630,7 +630,9 @@ static void print_cil_cast(LLFILE* fp, LSCRIPTType srcType, LSCRIPTType targetTy
switch(targetType)
{
case LST_INTEGER:
fprintf(fp, "conv.i4\n");
//fprintf(fp, "call int32 [LslLibrary]LindenLab.SecondLife.LslRunTime::ToInteger(float32)\n");
fprintf(fp, "conv.i4\n"); // TODO replace this line with the above
// we the entire grid is > 1.25.1
break;
case LST_STRING:
fprintf(fp, "call string [LslLibrary]LindenLab.SecondLife.LslRunTime::ToString(float32)\n");

View File

@ -891,14 +891,13 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
b_done = TRUE;
}
while (!b_done)
if (!b_done)
{
// Call handler for next queued event.
if(getEventCount() > 0)
{
++events_processed;
callNextQueuedEventHandler(event_register, id, quanta);
b_done = TRUE;
}
else
{
@ -910,8 +909,8 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
++events_processed;
callEventHandler(event, id, quanta);
}
b_done = TRUE;
}
b_done = TRUE;
}
}
}
@ -946,6 +945,10 @@ F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **erro
timer_checks = 0;
}
}
if (inloop == 0.0f)
{
inloop = timer.getElapsedTimeF32();
}
return inloop;
}

View File

@ -755,6 +755,10 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
model->deleteObject(mUUID);
model->notifyObservers();
}
else if ("restoreToWorld" == action)
{
restoreToWorld();
}
else if ("restore" == action)
{
restoreItem();
@ -811,6 +815,47 @@ void LLItemBridge::restoreItem()
}
}
void LLItemBridge::restoreToWorld()
{
LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
if (itemp)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("RezRestoreToWorld");
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->nextBlockFast(_PREHASH_InventoryData);
itemp->packMessage(msg);
msg->sendReliable(gAgent.getRegion()->getHost());
}
//Similar functionality to the drag and drop rez logic
BOOL remove_from_inventory = FALSE;
//remove local inventory copy, sim will deal with permissions and removing the item
//from the actual inventory if its a no-copy etc
if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
{
remove_from_inventory = TRUE;
}
// Check if it's in the trash. (again similar to the normal rez logic)
LLUUID trash_id;
trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
{
remove_from_inventory = TRUE;
}
if(remove_from_inventory)
{
gInventory.deleteObject(itemp->getUUID());
gInventory.notifyObservers();
}
}
LLUIImagePtr LLItemBridge::getIcon() const
{
return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]);
@ -3375,6 +3420,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Object Wear"));
items.push_back(std::string("Attach To"));
items.push_back(std::string("Attach To HUD"));
items.push_back(std::string("Restore to Last Position"));
LLMenuGL* attach_menu = menu.getChildMenuByName("Attach To", TRUE);
LLMenuGL* attach_hud_menu = menu.getChildMenuByName("Attach To HUD", TRUE);
@ -4363,7 +4409,6 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Wearable Wear"));
items.push_back(std::string("Wearable Edit"));
if ((flags & FIRST_SELECTED_ITEM) == 0)
{
disabled_items.push_back(std::string("Wearable Edit"));

View File

@ -159,6 +159,7 @@ public:
virtual const std::string& getPrefix() { return LLStringUtil::null; }
virtual void restoreItem() {}
virtual void restoreToWorld() {}
// LLFolderViewEventListener functions
virtual const std::string& getName() const;
@ -234,6 +235,7 @@ public:
virtual void selectItem();
virtual void restoreItem();
virtual void restoreToWorld();
virtual LLUIImagePtr getIcon() const;
virtual const std::string& getDisplayName() const;
@ -274,7 +276,6 @@ public:
virtual void selectItem();
virtual void restoreItem();
virtual LLUIImagePtr getIcon() const;
virtual BOOL renameItem(const std::string& new_name);
virtual BOOL removeItem();

View File

@ -478,6 +478,14 @@ bool idle_startup()
}
LLHTTPSender::setDefaultSender(new LLNullHTTPSender());
// TODO parameterize
const F32 circuit_heartbeat_interval = 5;
const F32 circuit_timeout = 100;
const LLUseCircuitCodeResponder* responder = NULL;
bool failure_is_fatal = true;
if(!start_messaging_system(
message_template_path,
port,
@ -485,7 +493,11 @@ bool idle_startup()
LL_VERSION_MINOR,
LL_VERSION_PATCH,
FALSE,
std::string()))
std::string(),
responder,
failure_is_fatal,
circuit_heartbeat_interval,
circuit_timeout))
{
std::string msg = LLTrans::getString("LoginFailedNoNetwork");
msg.append(llformat(" Error: %d", gMessageSystem->getErrorCode()));

View File

@ -59,6 +59,9 @@ namespace tut
if(! init)
{
ll_init_apr();
const F32 circuit_heartbeat_interval=5;
const F32 circuit_timeout=100;
start_messaging_system("notafile", 13035,
LL_VERSION_MAJOR,
LL_VERSION_MINOR,
@ -66,7 +69,9 @@ namespace tut
FALSE,
"notasharedsecret",
NULL,
false);
false,
circuit_heartbeat_interval,
circuit_timeout);
//init_prehash_data();
init = true;
}

View File

@ -70,6 +70,9 @@ namespace tut
//init_prehash_data();
init = true;
}
const F32 circuit_heartbeat_interval=5;
const F32 circuit_timeout=100;
// currently test disconnected message system
start_messaging_system("notafile", 13035,
@ -79,7 +82,10 @@ namespace tut
FALSE,
"notasharedsecret",
NULL,
false);
false,
circuit_heartbeat_interval,
circuit_timeout
);
// generate temp dir
std::ostringstream ostr;
#if LL_WINDOWS

View File

@ -662,30 +662,30 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>e398a04adb84796072dcc1f5efc69f4a</string>
<string>af7b1fc9072443009f19e43fb3c8342f</string>
<key>url</key>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-20080912.tar.bz2</uri>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-20081029.tar.bz2</uri>
</map>
<key>linux32</key>
<map>
<key>md5sum</key>
<string>5a7821cb8aa471051e0361a74d115613</string>
<string>ca909a0a48c3dcc61656f1635fc3e3b4</string>
<key>url</key>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-i686-gcc-4.1-20081030.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
<key>md5sum</key>
<string>b2095827a940c791240339dac677ef2d</string>
<string>cd4076d6caf5fabff36bf48bd01e4ba8</string>
<key>url</key>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux64-20080909.tar.bz2</uri>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux64-20081030.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>f25fbb29c2275267233c79f0c68ca37f</string>
<key>url</key>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-windows-20081010.tar.bz2</uri>
<uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-windows-20081030.tar.bz2</uri>
</map>
</map>
</map>

View File

@ -2942,6 +2942,14 @@ version 2.0
{ UseEstateSun BOOL }
{ SunHour F32 } // last value set by estate or region controls JC
}
{
RegionInfo2 Single
{ ProductSKU Variable 1 } // string
{ ProductName Variable 1 } // string
{ MaxAgents32 U32 } // Identical to RegionInfo.MaxAgents but allows greater range
{ HardMaxAgents U32 }
{ HardMaxObjects U32 }
}
}
// GodUpdateRegionInfo
@ -3059,6 +3067,14 @@ version 2.0
RegionInfo2 Single
{ RegionID LLUUID }
}
{
RegionInfo3 Single
{ CPUClassID S32 }
{ CPURatio S32 }
{ ColoName Variable 1 } // string
{ ProductSKU Variable 1 } // string
{ ProductName Variable 1 } // string
}
}
// RegionHandshakeReply
@ -8854,3 +8870,39 @@ version 2.0
}
}
// This message is sent from viewer -> simulator when the viewer wants
// to rez an object out of inventory back to its position before it
// last moved into the inventory
{
RezRestoreToWorld Low 425 NotTrusted Unencoded UDPDeprecated
{
AgentData Single
{ AgentID LLUUID }
{ SessionID LLUUID }
}
{
InventoryData Single
{ ItemID LLUUID }
{ FolderID LLUUID }
{ CreatorID LLUUID } // permissions
{ OwnerID LLUUID } // permissions
{ GroupID LLUUID } // permissions
{ BaseMask U32 } // permissions
{ OwnerMask U32 } // permissions
{ GroupMask U32 } // permissions
{ EveryoneMask U32 } // permissions
{ NextOwnerMask U32 } // permissions
{ GroupOwned BOOL } // permissions
{ TransactionID LLUUID }
{ Type S8 }
{ InvType S8 }
{ Flags U32 }
{ SaleType U8 }
{ SalePrice S32 }
{ Name Variable 1 }
{ Description Variable 1 }
{ CreationDate S32 }
{ CRC U32 }
}
}