Merge up to 26394 / 1d7dbcc52ca3 (FS tip).

meow-7.2.2
Nicky 2012-02-02 19:49:00 +01:00
commit 47124812cd
13 changed files with 405 additions and 199 deletions

View File

@ -103,6 +103,7 @@ Aleric Inglewood
STORM-864
STORM-955
STORM-960
STORM-1793
Ales Beaumont
VWR-9352
SNOW-240
@ -610,6 +611,7 @@ Jonathan Yap
STORM-1788
STORM-1799
STORM-1796
STORM-1793
Kadah Coba
STORM-1060
Jondan Lundquist
@ -1239,6 +1241,8 @@ WolfPup Lowenhar
VWR-20741
VWR-20933
Wundur Primbee
Xellessanova Zenith
STORM-1793
Xiki Luik
xstorm Radek
YongYong Francois

View File

@ -469,6 +469,47 @@ void LLScriptLibrary::init()
// IF YOU ADD NEW SCRIPT CALLS, YOU MUST PUT THEM AT THE END OF THIS LIST.
// Otherwise the bytecode numbers for each call will be wrong, and all
// existing scripts will crash.
// <FS:Ansariel> According to Kelly Linden we don't need to obey the function ID order in the viewer!
// Server v11.08.10.238207 new functions:
addFunction(10.f, 0.f, dummy_func, "llSetMemoryLimit", "i", "i");
addFunction(10.f, 0.f, dummy_func, "llGetMemoryLimit", "i", NULL);
addFunction(10.f, 0.f, dummy_func, "llSetLinkMedia", "i", "iil");
addFunction(10.f, 0.f, dummy_func, "llGetLinkMedia", "l", "iil");
addFunction(10.f, 0.f, dummy_func, "llClearLinkMedia", "i", "ii");
addFunction(10.f, 0.f, dummy_func, "llSetLinkCamera", NULL, "ivv");
addFunction(10.f, 0.f, dummy_func, "llSetContentType", NULL, "ki");
addFunction(10.f, 0.f, dummy_func, "llLinkSitTarget", NULL, "ivq");
addFunction(10.f, 0.f, dummy_func, "llAvatarOnLinkSitTarget", "k", "i");
addFunction(10.f, 0.f, dummy_func, "llSetVelocity", NULL, "vi");
// Server v11.09.09.240509 new functions:
addFunction(10.f, 0.f, dummy_func, "llCastRay", "l", "vvl");
addFunction(10.f, 0.f, dummy_func, "llGetMassMKS", "f", NULL);
addFunction(10.f, 0.f, dummy_func, "llSetPhysicsMaterial", NULL, "iffff");
addFunction(10.f, 0.f, dummy_func, "llGetPhysicsMaterial", "l", NULL);
// Server v11.10.18.243270 new functions:
addFunction(10.f, 0.f, dummy_func, "llManageEstateAccess", "i", "ik");
// Server RC magnum v11.10.31.244254 new function:
addFunction(10.f, 0.f, dummy_func, "llSetKeyframedMotion", NULL, "ll");
// Server RC Le Tigre v11.10.30.245889 new function:
addFunction(10.f, 0.f, dummy_func, "llTransferLindenDollars", "k", "ki");
// Server new function 2011-12-13:
addFunction(10.f, 0.f, dummy_func, "llGetParcelMusicURL", "s", NULL);
// Missing script functions as of 2011-12-13
addFunction(10.f, 0.f, dummy_func, "llScriptProfiler", NULL, "i");
addFunction(10.f, 0.f, dummy_func, "llGetSPMaxMemory", "i", NULL);
addFunction(10.f, 0.f, dummy_func, "llGetUsedMemory", "i", NULL);
addFunction(10.f, 0.f, dummy_func, "llSetAngularVelocity", NULL, "vi");
// Server 12.01.24.248357 new functions
addFunction(0.f, 0.f, dummy_func, "llSetRegionPos", "i", "v");
// </FS:Ansariel> According to Kelly Linden we don't need to obey the function ID order in the viewer!
}
LLScriptLibraryFunction::LLScriptLibraryFunction(F32 eu, F32 st, void (*exec_func)(LLScriptLibData *, LLScriptLibData *, const LLUUID &), const char *name, const char *ret_type, const char *args, BOOL god_only)

View File

@ -52,6 +52,9 @@ remote_data remote_data(integer event_type, key channel, key message_id, str
http_response http_response(key request_id, integer status, list metadata, string body):Triggered when task receives a response to one of its llHTTPRequests
http_request http_request(key id, string method, string body):Triggered when task receives an http request against a public URL
# <FS:Ansariel> Added manually
transaction_result transaction_result(key id, integer success, string data): Triggered when L$ is given to task
# integer constants
[word .1, .1, .5]
TRUE Integer constant for Boolean operations
@ -588,6 +591,64 @@ STATUS_NOT_SUPPORTED Feature not supported
STATUS_INTERNAL_ERROR An internal error occurred
STATUS_WHITELIST_FAILED URL failed to pass whitelist
# <FS:Ansariel> Manually added constants
KFM_COMMAND Option for llSetKeyframedMotion(), followed by one of KFM_CMD_STOP, KFM_CMD_PLAY, KFM_CMD_PAUSE. Note that KFM_COMMAND must be the only option in the list, and cannot be specified in the same function call that sets the keyframes list.
KFM_MODE Option for llSetKeyframedMotion(), used to specify the playback mode, followed by one of KFM_FORWARD, KFM_LOOP, KFM_PING_PONG or KFM_REVERSE.
KFM_DATA Option for llSetKeyframedMotion(), followed by a bitwise combination of KFM_TRANSLATION and KFM_ROTATION. If you specify one or the other, you should only include translations or rotations in your keyframe list.
KFM_FORWARD Option for llSetKeyframedMotion(), used after KFM_MODE to specify the forward playback mode.
KFM_LOOP Option for llSetKeyframedMotion(), used after KFM_MODE to specify the loop playback mode.
KFM_PING_PONG Option for llSetKeyframedMotion(), used after KFM_MODE to specify the ping pong playback mode.
KFM_REVERSE Option for llSetKeyframedMotion(), used after KFM_MODE to specify the reverse playback mode.
KFM_ROTATION Option for llSetKeyframedMotion(), used after KFM_DATA, possibly as a bitwise combination with KFM_TRANSLATION.
KFM_TRANSLATION Option for llSetKeyframedMotion(), used after KFM_DATA, possibly as a bitwise combination with KFM_ROTATION.
KFM_CMD_PLAY Option for llSetKeyframedMotion(), used after KFM_COMMAND to play the motion.
KFM_CMD_STOP Option for llSetKeyframedMotion(), used after KFM_COMMAND to stop the motion.
KFM_CMD_PAUSE Option for llSetKeyframedMotion(), used after KFM_COMMAND to pause the motion.
ESTATE_ACCESS_ALLOWED_AGENT_ADD Used with llManageEstateAccess to add an agent to this estate's allowed residents list.
ESTATE_ACCESS_ALLOWED_AGENT_REMOVE Used with llManageEstateAccess to remove an agent from this estate's allowed residents list.
ESTATE_ACCESS_ALLOWED_GROUP_ADD Used with llManageEstateAccess to add a group to this estate's allowed groups list.
ESTATE_ACCESS_ALLOWED_GROUP_REMOVE Used with llManageEstateAccess to remove a group from this estate's allowed groups list.
ESTATE_ACCESS_BANNED_AGENT_ADD Used with llManageEstateAccess to add an agent to this estate's banned residents list.
ESTATE_ACCESS_BANNED_AGENT_REMOVE Used with llManageEstateAccess to remove an agent from this estate's banned residents list.
OBJECT_PHYSICS_COST Used with llGetObjectDetails to get the physics cost.
OBJECT_PRIM_EQUIVALENCE Used with llGetObjectDetails to get the prim equivalence.
OBJECT_SERVER_COST Used with llGetObjectDetails to get the server cost.
OBJECT_STREAMING_COST Used with llGetObjectDetails to get the streaming (download) cost.
PRIM_PHYSICS_SHAPE_TYPE For primitive physics shape type. Followed with either PRIM_PHYSICS_SHAPE_PRIM, PRIM_PHYSICS_SHAPE_NONE or PRIM_PHYSICS_SHAPE_CONVEX.
PRIM_PHYSICS_SHAPE_PRIM Use the normal prim shape for physics (this is the default for all non-mesh objects)
PRIM_PHYSICS_SHAPE_NONE Use the convex hull of the prim shape for physics (this is the default for mesh objects)
PRIM_PHYSICS_SHAPE_CONVEX Ignore this prim in the physics shape. This cannot be applied to the root prim.
DENSITY For use with llSetPhysicsMaterial() as a bitwise value in its material_bits parameter, to set the density.
FRICTION For use with llSetPhysicsMaterial() as a bitwise value in its material_bits parameter, to set the friction.
RESTITUTION For use with llSetPhysicsMaterial() as a bitwise value in its material_bits parameter, to set the restitution.
GRAVITY_MULTIPLIER For use with llSetPhysicsMaterial() as a bitwise value in its material_bits parameter, to set the gravity multiplier.
PROFILE_SCRIPT_NONE Disables memory profiling when passed to llScriptProfiler()
PROFILE_SCRIPT_MEMORY Enables memory profiling when passed to llScriptProfiler()
RCERR_UNKNOWN Returned by llCastRay() when the raycast failed for an unspecified reason.
RCERR_SIM_PERF_LOW Returned by llCastRay() when the raycast failed because simulator performance is low.
RCERR_CAST_TIME_EXCEEDED Returned by llCastRay() when the raycast failed because the parcel or agent has exceeded the maximum time allowed for raycasting.
RC_REJECT_TYPES Option for llCastRay() used to ignore specific types of objects, followed with a bitwise combination of RC_REJECT_AGENTS, RC_REJECT_PHYSICAL, RC_REJECT_NONPHYSICAL and RC_REJECT_LAND.
RC_DETECT_PHANTOM Option for llCastRay() followed with TRUE to detect phantom AND volume detect objects, FASLE otherwise.
RC_DATA_FLAGS Option for llCastRay() followed with a bitwise combination of RC_GET_NORMAL, RC_GET_ROOT_KEY and RC_GET_LINK_NUM.
RC_MAX_HITS Option for llCastRay() followed with an integer specifying the maximum number of hits to return (must be <= 256).
RC_REJECT_AGENTS Flag used in the RC_REJECT_TYPES mask to reject agents in llCastRay().
RC_REJECT_PHYSICAL Flag used in the RC_REJECT_TYPES mask to reject physical objects in llCastRay().
RC_REJECT_NONPHYSICAL Flag used in the RC_REJECT_TYPES mask to reject non-physical objects in llCastRay().
RC_REJECT_LAND Flag used in the RC_REJECT_TYPES mask to reject land in llCastRay().
RC_GET_NORMAL Flag used in the RC_DATA_FLAGS mask to get hit normals in llCastRay() results.
RC_GET_ROOT_KEY Flag used in the RC_DATA_FLAGS mask to get root keys in llCastRay() results.
RC_GET_LINK_NUM Flag used in the RC_DATA_FLAGS mask to get link numbers in llCastRay() results.
# </FS:Ansariel> Manually added constants
# string constants
[word .1, .3, .5]
NULL_KEY Indicates an empty key

View File

@ -3661,6 +3661,15 @@ void LLAppViewer::requestQuit()
{
sendLogoutRequest();
}
else if(LLStartUp::getStartupState() == STATE_STARTED) // LO: Fix for FIRE-2613: sidebar tabs and floaters not remembering being open/torn off
{
if (gFloaterView)
{
// application is quitting
gFloaterView->closeAllChildren(true);
}
} // ~LO
// Quit immediately
forceQuit();
@ -4154,6 +4163,12 @@ bool finish_disconnect(const LLSD& notification, const LLSD& response)
if (1 == option)
{
if (gFloaterView)
{
// application is quitting
gFloaterView->closeAllChildren(true);
}
LLAppViewer::instance()->forceQuit();
}
return false;
@ -4162,6 +4177,12 @@ bool finish_disconnect(const LLSD& notification, const LLSD& response)
// Callback from an early disconnect dialog, force an exit
bool finish_forced_disconnect(const LLSD& notification, const LLSD& response)
{
if (gFloaterView)
{
// application is quitting
gFloaterView->closeAllChildren(true);
}
LLAppViewer::instance()->forceQuit();
return false;
}

View File

@ -1093,17 +1093,19 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
{
LLVolume* volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
LLPointer<LLVolume> volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
std::string mesh_string((char*) data, data_size);
std::istringstream stream(mesh_string);
if (volume->unpackVolumeFaces(stream, data_size))
{
LoadedMesh mesh(volume, mesh_params, lod);
if (volume->getNumFaces() > 0)
{
LLMutexLock lock(mMutex);
mLoadedQ.push(mesh);
LoadedMesh mesh(volume, mesh_params, lod);
{
LLMutexLock lock(mMutex);
mLoadedQ.push(mesh);
}
return true;
}
}

View File

@ -90,6 +90,8 @@ const F32 DOT_SCALE = 0.75f;
const F32 MIN_PICK_SCALE = 2.f;
const S32 MOUSE_DRAG_SLOP = 2; // How far the mouse needs to move before we think it's a drag
const F64 COARSEUPDATE_MAX_Z = 1020.0f;
const F32 WIDTH_PIXELS = 2.f;
const S32 CIRCLE_STEPS = 100;
@ -342,7 +344,8 @@ void LLNetMap::draw()
}
LLVector3 map_center_agent = gAgent.getPosAgentFromGlobal(mObjectImageCenterGlobal);
map_center_agent -= gAgentCamera.getCameraPositionAgent();
LLVector3 camera_position = gAgentCamera.getCameraPositionAgent();
map_center_agent -= camera_position;
map_center_agent.mV[VX] *= mScale/region_width;
map_center_agent.mV[VY] *= mScale/region_width;
@ -363,9 +366,6 @@ void LLNetMap::draw()
gGL.popMatrix();
LLVector3d pos_global;
LLVector3 pos_map;
// Mouse pointer in local coordinates
S32 local_mouse_x;
S32 local_mouse_y;
@ -375,143 +375,109 @@ void LLNetMap::draw()
F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop
F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE);
LLVector3 pos_map;
uuid_vec_t avatar_ids;
std::vector<LLVector3d> positions;
bool unknown_relative_z;
LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgentCamera.getCameraPositionGlobal());
// Draw avatars
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
for (U32 i = 0; i < avatar_ids.size(); i++)
{
LLViewerRegion* regionp = *iter;
const LLVector3d& origin_global = regionp->getOriginGlobal();
//pos_map = globalPosToView(positions[i]); // <FS:Ansariel> Do this later after advanced height check
LLUUID uuid = avatar_ids[i];
S32 count = regionp->mMapAvatars.count();
S32 i;
LLVector3 pos_local;
U32 compact_local;
U8 bits;
// TODO: it'd be very cool to draw these in sorted order from lowest Z to highest.
// just be careful to sort the avatar IDs along with the positions. -MG
for (i = 0; i < count; i++)
{
compact_local = regionp->mMapAvatars.get(i);
bits = compact_local & 0xFF;
pos_local.mV[VZ] = F32(bits) * 4.f;
compact_local >>= 8;
bits = compact_local & 0xFF;
pos_local.mV[VY] = (F32)bits;
compact_local >>= 8;
bits = compact_local & 0xFF;
pos_local.mV[VX] = (F32)bits;
// Ansariel: Moved further down
//pos_global.setVec( pos_local );
//pos_global += origin_global;
//pos_map = globalPosToView(pos_global);
// END Ansariel: Moved further down
LLUUID uuid(NULL);
BOOL show_as_friend = FALSE;
if( i < regionp->mMapAvatarIDs.count())
{
uuid = regionp->mMapAvatarIDs.get(i);
// show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL);
// bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL);
// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f
show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL) &&
(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL) &&
(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
// [/RLVa:KB]
}
LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color;
LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color;
// Ansariel: Colorize and make use of avatar viewer objects
// for improved height indication
bool isHeightUnknown = (pos_local.mV[VZ] == 0.f);
if (uuid.notNull())
// <FS:Ansariel> Also check for legacy unknown height reported as height = 0m
//unknown_relative_z = positions[i].mdV[VZ] == COARSEUPDATE_MAX_Z &&
// camera_position.mV[VZ] >= COARSEUPDATE_MAX_Z;
unknown_relative_z = (positions[i].mdV[VZ] == COARSEUPDATE_MAX_Z &&
camera_position.mV[VZ] >= COARSEUPDATE_MAX_Z) || (positions[i].mdV[VZ] == 0.f);
// </FS:Ansariel>
// Colorize muted avatars and Lindens
std::string fullName;
LLMuteList* muteListInstance = LLMuteList::getInstance();
if (muteListInstance->isMuted(uuid)) color = map_avatar_muted_color;
else if (gCacheName->getFullName(uuid, fullName) && muteListInstance->isLinden(fullName)) color = map_avatar_linden_color;
// Try to workaround 1020m bug by using
// the viewer object for the avatar.
if (unknown_relative_z)
{
LLViewerObject* viewerObject = gObjectList.findObject(uuid);
if (viewerObject)
{
// Colorize muted avatars and Lindens
std::string fullName;
LLMuteList* muteListInstance = LLMuteList::getInstance();
positions[i].mdV[VZ] = viewerObject->getPositionGlobal().mdV[VZ];
unknown_relative_z = false;
}
}
pos_map = globalPosToView(positions[i]);
if (muteListInstance->isMuted(uuid)) color = map_avatar_muted_color;
else if (gCacheName->getFullName(uuid, fullName) && muteListInstance->isLinden(fullName)) color = map_avatar_linden_color;
// Try to workaround 1020m bug by using
// the viewer object for the avatar.
if (isHeightUnknown)
{
LLViewerObject* viewerObject = gObjectList.findObject(uuid);
if (viewerObject)
{
pos_local.mV[VZ] = viewerObject->getPositionGlobal().mdV[VZ];
isHeightUnknown = false;
}
}
// Mark Avatars with special colors - Ansariel
if (LLNetMap::sAvatarMarksMap.find(uuid) != LLNetMap::sAvatarMarksMap.end())
{
color = LLNetMap::sAvatarMarksMap[uuid];
}
// Mark Avatars with special colors - Ansariel
if (LLNetMap::sAvatarMarksMap.find(uuid) != LLNetMap::sAvatarMarksMap.end())
{
color = LLNetMap::sAvatarMarksMap[uuid];
}
//color based on contact sets prefs
if(LGGContactSets::getInstance()->hasFriendColorThatShouldShow(uuid,FALSE,FALSE,FALSE,TRUE))
{
color = LGGContactSets::getInstance()->getFriendColor(uuid);
}
}
//color based on contact sets prefs
if(LGGContactSets::getInstance()->hasFriendColorThatShouldShow(uuid,FALSE,FALSE,FALSE,TRUE))
{
color = LGGContactSets::getInstance()->getFriendColor(uuid);
}
// Ansariel: Moved down here so we can take precise
// height data into account
pos_global.setVec( pos_local );
pos_global += origin_global;
pos_map = globalPosToView(pos_global);
LLWorldMapView::drawAvatar(
pos_map.mV[VX], pos_map.mV[VY],
color,
pos_map.mV[VZ], mDotRadius,
unknown_relative_z);
LLWorldMapView::drawAvatar(
pos_map.mV[VX], pos_map.mV[VY],
color,
pos_map.mV[VZ], mDotRadius,
isHeightUnknown);
if(uuid.notNull())
if(uuid.notNull())
{
bool selected = false;
uuid_vec_t::iterator sel_iter = gmSelected.begin();
for (; sel_iter != gmSelected.end(); sel_iter++)
{
bool selected = false;
uuid_vec_t::iterator sel_iter = gmSelected.begin();
for (; sel_iter != gmSelected.end(); sel_iter++)
if(*sel_iter == uuid)
{
if(*sel_iter == uuid)
{
selected = true;
break;
}
}
if(selected)
{
if( (pos_map.mV[VX] < 0) ||
(pos_map.mV[VY] < 0) ||
(pos_map.mV[VX] >= getRect().getWidth()) ||
(pos_map.mV[VY] >= getRect().getHeight()) )
{
S32 x = llround( pos_map.mV[VX] );
S32 y = llround( pos_map.mV[VY] );
LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10);
} else
{
LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);
}
selected = true;
break;
}
}
F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
LLVector2(local_mouse_x,local_mouse_y));
if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
if(selected)
{
closest_dist_squared = dist_to_cursor_squared;
mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i);
mClosestAgentPosition = pos_global;
if( (pos_map.mV[VX] < 0) ||
(pos_map.mV[VY] < 0) ||
(pos_map.mV[VX] >= getRect().getWidth()) ||
(pos_map.mV[VY] >= getRect().getHeight()) )
{
S32 x = llround( pos_map.mV[VX] );
S32 y = llround( pos_map.mV[VY] );
LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10);
} else
{
LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);
}
}
}
F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
LLVector2(local_mouse_x,local_mouse_y));
if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
{
closest_dist_squared = dist_to_cursor_squared;
mClosestAgentToCursor = uuid;
mClosestAgentPosition = positions[i];
}
}
// Draw dot for autopilot target
@ -534,7 +500,7 @@ void LLNetMap::draw()
}
// Draw dot for self avatar position
pos_global = gAgent.getPositionGlobal();
LLVector3d pos_global = gAgent.getPositionGlobal();
pos_map = globalPosToView(pos_global);
S32 dot_width = llround(mDotRadius * 2.f);
LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage;
@ -617,9 +583,11 @@ void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
createObjectImage();
}
LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
LLVector3 LLNetMap::globalPosToView(const LLVector3d& global_pos)
{
LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal();
LLVector3d camera_position = gAgentCamera.getCameraPositionGlobal();
LLVector3d relative_pos_global = global_pos - camera_position;
LLVector3 pos_local;
pos_local.setVec(relative_pos_global); // convert to floats from doubles
@ -657,7 +625,7 @@ void LLNetMap::drawRing(const F32 radius, const LLVector3 pos_map, const LLUICol
void LLNetMap::drawTracking(const LLVector3d& pos_global, const LLColor4& color,
BOOL draw_arrow )
{
LLVector3 pos_local = globalPosToView( pos_global );
LLVector3 pos_local = globalPosToView(pos_global);
if( (pos_local.mV[VX] < 0) ||
(pos_local.mV[VY] < 0) ||
(pos_local.mV[VX] >= getRect().getWidth()) ||
@ -815,8 +783,8 @@ BOOL LLNetMap::handleToolTipAgent(const LLUUID& avatar_id)
LLVector3d delta = otherPosition - myPosition;
F32 distance = (F32)delta.magVec();
// If avatar is >1020, the value for Z is returned as 0
bool isHigher1020mBug = (otherPosition[VZ] == 0.0);
// If avatar is >1020, the value for Z is returned as 0 (legacy) or 1020 (new)
bool isHigher1020mBug = (otherPosition[VZ] == COARSEUPDATE_MAX_Z || otherPosition[VZ] == 0.0);
// Ansariel: Try to get distance from the nearby people panel
// aka radar. This usually contains better data,
@ -827,11 +795,13 @@ BOOL LLNetMap::handleToolTipAgent(const LLUUID& avatar_id)
LLAvatarListItem* avatar_list_item = ((LLPanelPeople*)panel_people)->getNearbyList()->getAvatarListItem(avatar_id);
if (avatar_list_item != NULL)
{
distance = avatar_list_item->getRange();
F32 radar_distance = avatar_list_item->getRange();
// If avatar is >1020m and no viewer object exists,
// it is beyond far clip, so the distance value is wrong!
isHigher1020mBug = (isHigher1020mBug && gObjectList.findObject(avatar_id) == NULL);
if (isHigher1020mBug && radar_distance > -1.f)
{
distance = radar_distance;
isHigher1020mBug = false;
}
}
}

View File

@ -983,7 +983,7 @@ void LLPanelPeople::updateNearbyList()
av->setAvatarName(avName); // maintain compatibility with underlying list, deprecated
U32 lastZOffsetTime = av->getLastZOffsetTime();
F32 avZOffset = av->getZOffset();
if (avPos[VZ] < 0.1) // if our official z position is 0.0, we need a correction.
if (avPos[VZ] < 0.1 || avPos[VZ] == 1020.f) // if our official z position is 0.0 (legacy) or 1020 (new), we need a correction.
{
// set correction if we have it
if (avZOffset > 0.1)

View File

@ -66,7 +66,7 @@ public:
protected:
LLSideTrayTab(const Params& params);
void dock(LLFloater* floater_tab);
void dock(bool app_quitting, LLFloater* floater_tab); // LO: Fix for FIRE-2613: sidebar tabs and floaters not remembering being open/torn off
void undock(LLFloater* floater_tab);
LLSideTray* getSideTray();
@ -87,7 +87,7 @@ public:
const std::string& getTabTitle() const { return mTabTitle;}
void onOpen (const LLSD& key);
void toggleTabDocked(bool toggle_floater = true);
void toggleTabDocked(bool app_quitting = false, bool toggle_floater = true); // LO: Fix for FIRE-2613: sidebar tabs and floaters not remembering being open/torn off
void setDocked(bool dock);
bool isDocked() const;
void minimizeTab();

View File

@ -1210,34 +1210,13 @@ void send_agent_resume()
LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin)
// [/SL:KB]
{
// Ansariel: The old way of unpacking does not work properly and
// sometimes wrong values.
/*
LLVector3d pos_global;
LLVector3 pos_local;
U8 bits;
LLVector3d pos_local;
bits = compact_local & 0xFF;
pos_local.mV[VZ] = F32(bits) * 4.f;
compact_local >>= 8;
pos_local.mdV[VZ] = (compact_local & 0xFFU) * 4;
pos_local.mdV[VY] = (compact_local >> 8) & 0xFFU;
pos_local.mdV[VX] = (compact_local >> 16) & 0xFFU;
bits = compact_local & 0xFF;
pos_local.mV[VY] = (F32)bits;
compact_local >>= 8;
bits = compact_local & 0xFF;
pos_local.mV[VX] = (F32)bits;
pos_global.setVec( pos_local );
pos_global += region_origin;
return pos_global;
*/
LLVector3d pos_global(region_origin);
pos_global.mdV[VZ] += F64(compact_local & 0xFF) * 4.f;
pos_global.mdV[VY] += F64((compact_local >> 8) & 0xFF);
pos_global.mdV[VX] += F64((compact_local >> 16) & 0xFF);
return pos_global;
return region_origin + pos_local;
}
void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const
@ -1258,24 +1237,17 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
iter != LLCharacter::sInstances.end(); ++iter)
{
LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
if(!pVOAvatar->isDead() && !pVOAvatar->isSelf())
LLVector3d pos_global = pVOAvatar->getPositionGlobal();
LLUUID uuid = pVOAvatar->getID();
if( !pVOAvatar->isDead() &&
!pVOAvatar->isSelf() &&
!uuid.isNull() &&
dist_vec_squared(pos_global, relative_to) <= radius_squared &&
positions != NULL &&
avatar_ids != NULL)
{
LLUUID uuid = pVOAvatar->getID();
if(!uuid.isNull())
{
LLVector3d pos_global = pVOAvatar->getPositionGlobal();
if(dist_vec_squared(pos_global, relative_to) <= radius_squared)
{
if(positions != NULL)
{
positions->push_back(pos_global);
}
if(avatar_ids !=NULL)
{
avatar_ids->push_back(uuid);
}
}
}
positions->push_back(pos_global);
avatar_ids->push_back(uuid);
}
}
// region avatars added for situations where radius is greater than RenderFarClip
@ -1292,13 +1264,13 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
{
LLUUID uuid = regionp->mMapAvatarIDs.get(i);
// if this avatar doesn't already exist in the list, add it
if(uuid.notNull() && avatar_ids!=NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end())
if(uuid.notNull() && avatar_ids != NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end())
{
if(positions != NULL)
{
positions->push_back(pos_global);
avatar_ids->push_back(uuid);
}
avatar_ids->push_back(uuid);
}
}
}

View File

@ -80,7 +80,7 @@ LLUIImagePtr LLWorldMapView::sAvatarYouLargeImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarLevelImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarHeightUnknownImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarUnknownImage = NULL;
LLUIImagePtr LLWorldMapView::sTelehubImage = NULL;
LLUIImagePtr LLWorldMapView::sInfohubImage = NULL;
@ -125,7 +125,9 @@ void LLWorldMapView::initClass()
sAvatarLevelImage = LLUI::getUIImage("map_avatar_32.tga");
sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_32.tga");
sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_32.tga");
sAvatarHeightUnknownImage = LLUI::getUIImage("map_avatar_unknown.tga");
// <FS:Ansariel> Use our own, established indicator
//sAvatarUnknownImage = LLUI::getUIImage("map_avatar_unknown_32.tga");
sAvatarUnknownImage = LLUI::getUIImage("map_avatar_unknown.tga");
sHomeImage = LLUI::getUIImage("map_home.tga");
sTelehubImage = LLUI::getUIImage("map_telehub.tga");
@ -158,7 +160,7 @@ void LLWorldMapView::cleanupClass()
sAvatarLevelImage = NULL;
sAvatarAboveImage = NULL;
sAvatarBelowImage = NULL;
sAvatarHeightUnknownImage = NULL;
sAvatarUnknownImage = NULL;
sTelehubImage = NULL;
sInfohubImage = NULL;
@ -1215,23 +1217,26 @@ void LLWorldMapView::drawAvatar(F32 x_pixels,
const LLColor4& color,
F32 relative_z,
F32 dot_radius,
bool heightUnknown) // Ansariel: For drawing unknown height indicator
bool unknown_relative_z)
{
const F32 HEIGHT_THRESHOLD = 7.f;
LLUIImagePtr dot_image = sAvatarLevelImage;
// Ansariel: If height is unknown, draw our special icon
if (heightUnknown)
if (unknown_relative_z)
{
dot_image = sAvatarHeightUnknownImage;
dot_image = sAvatarUnknownImage;
}
else if(relative_z < -HEIGHT_THRESHOLD)
else
{
dot_image = sAvatarBelowImage;
}
else if(relative_z > HEIGHT_THRESHOLD)
{
dot_image = sAvatarAboveImage;
if(relative_z < -HEIGHT_THRESHOLD)
{
dot_image = sAvatarBelowImage;
}
else if(relative_z > HEIGHT_THRESHOLD)
{
dot_image = sAvatarAboveImage;
}
}
S32 dot_width = llround(dot_radius * 2.f);
dot_image->draw(llround(x_pixels - dot_radius),

View File

@ -113,7 +113,7 @@ public:
const LLColor4& color,
F32 relative_z = 0.f,
F32 dot_radius = 3.f,
bool heightUnknown = false); // Ansariel: For drawing unknown height indicator
bool reached_max_z = false);
static void drawIconName(F32 x_pixels,
F32 y_pixels,
const LLColor4& color,
@ -139,7 +139,7 @@ public:
static LLUIImagePtr sAvatarLevelImage;
static LLUIImagePtr sAvatarAboveImage;
static LLUIImagePtr sAvatarBelowImage;
static LLUIImagePtr sAvatarHeightUnknownImage;
static LLUIImagePtr sAvatarUnknownImage;
static LLUIImagePtr sTelehubImage;
static LLUIImagePtr sInfohubImage;

View File

@ -240,7 +240,8 @@ void ParticleEditor::onParameterChange()
if(mTexture->getID()==IMG_DEFAULT || mTexture->getID().isNull())
mTexture=mDefaultParticleTexture;
mParticles.mBurstRate=mBurstRateSpinner->getValueF32();
// limit burst rate to 0.01 to avoid internal freeze, script still gets the real value
mParticles.mBurstRate=llmax(0.01f,mBurstRateSpinner->getValueF32());
mParticles.mBurstPartCount=mBurstCountSpinner->getValue().asInteger();
mParticles.mBurstRadius=mBurstRadiusSpinner->getValueF32();
mParticles.mInnerAngle=mAngleBeginSpinner->getValueF32();

View File

@ -1955,6 +1955,135 @@ llGetEnv(string name)
Returns a string with the requested data about the region
</string>
<!-- FS:Ansariel: LSL function tooltip help texts manually added -->
<string name="LSLTipText_llSetMemoryLimit" translate="false">
integer llSetMemoryLimit(integer limit)
Request limit bytes to be reserved for this script.
Returns a success/failure flag (STATUS_OK when sucessful, another of the STATUS_* flags on failure) for whether the memory limit was set.
Only relevant for Mono-compiled scripts.
</string>
<string name="LSLTipText_llGetMemoryLimit" translate="false">
integer llGetUsedMemory()
Get the maximum memory a script can use.
Returns the integer amount of memory the script can use in bytes.
</string>
<string name="LSLTipText_llSetLinkMedia" translate="false">
integer llSetLinkMedia(integer link, integer face, list params)
Set the media params for a particular face on the 'link'ed prim without a delay.
Returns an integer that is flag (STATUS_OK when sucessful, another of the STATUS_* flags on failure) which details the success/failure of the operation(s).
Takes the same parameters as llSetPrimMediaParams()
</string>
<string name="LSLTipText_llGetLinkMedia" translate="false">
list llGetLinkMedia(integer link, integer face, list params)
Get the media params for a particular face on a 'link'ed prim(s), given the desired list of named params.
Returns a list of values in the order requested (empty list if no media exists on the face).
Takes the same parameters as llGetPrimMediaParams()
</string>
<string name="LSLTipText_llClearLinkMedia" translate="false">
integer llClearLinkMedia(integer link, integer face)
Clears (deletes) the media and all params from the given face on the linked prim(s).
Returns an integer that is flag (STATUS_OK when sucessful, another of the STATUS_* flags on failure) which details the success/failure of the operation(s).
</string>
<string name="LSLTipText_llSetLinkCamera" translate="false">
llSetLinkCamera(integer link, vector eye, vector at)
Sets the camera eye offset, and the offset that camera is looking at, for avatars that sit on the linked prim.
The two vector parameters are offsets relative to the object's center and expressed in local coordinates.
</string>
<string name="LSLTipText_llSetContentType" translate="false">
llSetContentType(key request_id, integer content_type)
Set the Internet media type of an LSL HTTP server response.
content_type may be one of CONTENT_TYPE_TEXT (default) "text/plain", or CONTENT_TYPE_HTML "text/html", only valid for embedded browsers on content owned by the person viewing. Falls back to "text/plain" otherwise.
</string>
<string name="LSLTipText_llLinkSitTarget" translate="false">
llLinkSitTarget(integer link, vector offset, rotation rot)
Set the sit location for the 'link'ed prim(s). The sit location is relative to the prim's position and rotation.
Equivalent to calling llSitTarget on link prim(s) in the link set.
</string>
<string name="LSLTipText_llAvatarOnLinkSitTarget" translate="false">
key llAvatarOnLinkSitTarget(integer link)
Returns a key that is the UUID of the user seated on the 'link'ed prim.
Equivalent to calling llAvatarOnSitTarget on link prim in the link set.
</string>
<string name="LSLTipText_llSetVelocity" translate="false">
llSetVelocity(vector force, integer local)
Applies velocity with 'force' to object and 'local' a boolean (if TRUE, force is treated as a local directional vector instead of region directional vector).
</string>
<string name="LSLTipText_llSetAngularVelocity" translate="false">
llSetAngularVelocity(vector force, integer local)
Applies rotational velocity with 'force' to object and 'local' a boolean (if TRUE uses local axis, if FALSE uses region axis).
</string>
<string name="LSLTipText_llCastRay" translate="false">
list llCastRay(vector start, vector end, list options)
Cast a ray from start to end and report collision data for intersections with objects.
</string>
<string name="LSLTipText_llGetMassMKS" translate="false">
float llGetMassMKS()
Returns a float that is the mass in kilograms of the object the script is attached to.
</string>
<string name="LSLTipText_llSetPhysicsMaterial" translate="false">
llSetPhysicsMaterial(integer material_bits, float gravity_multiplier, float restitution, float friction, float density)
Sets the physics properties of the object the script is attached to.
material_bits is a bitwise combination of DENSITY, FRICTION, RESTITUTION and GRAVITY_MULTIPLIER, specifying which floats to actually apply.
</string>
<string name="LSLTipText_llGetPhysicsMaterial" translate="false">
list llGetPhysicsMaterial()
Returns a list of the object physics properties: [ float gravity_multiplier, float restitution, float friction, float density ]
</string>
<string name="LSLTipText_llManageEstateAccess" translate="false">
integer llManageEstateAccess(integer action, key id)
To add or remove agents from the estate's agent access or ban lists or groups from the estate's group access list.
Only works for objects owned by the Estate Owner or an Estate Manager.
Returns TRUE if successful and FALSE if throttled, on invalid action, on invalid or null id, or if object owner is not allowed to manage the estate.
'action' can be any of: ESTATE_ACCESS_ALLOWED_[AGENT/GROUP]_[ADD/REMOVE] or ESTATE_ACCESS_BANNED_AGENT_[ADD/REMOVE]
</string>
<string name="LSLTipText_llSetKeyframedMotion" translate="false">
llSetKeyframedMotion(list keyframes, list options)
Specify a list of times, positions, and orientations to be followed by an object.
The object will be smoothly moved between keyframes by the simulator.
list keyframes: strided keyframe list of the form:
- vector position (optional via KFM_TRANSLATION and KFM_DATA)
- rotation orientation (optional via KFM_ROTATION and KFM_DATA)
- float time
list options: modifiers among:
- KFM_COMMAND followed by one of KFM_CMD_PLAY, KFM_CMD_STOP, KFM_CMD_PAUSE.
- KFM_MODE followed by one of KFM_FORWARD, KFM_LOOP, KFM_PING_PONG, KFM_REVERSE.
- KFM_DATA followed by KFM_ROTATION or KFM_TRANSLATION.
Note that if KFM_COMMAND is provided in the options list, it must be the only option in the list, and cannot be specified in the same function call that sets the keyframes list.
</string>
<string name="LSLTipText_llTransferLindenDollars" translate="false">
key llTransferLindenDollars(key id, integer amount)
Attempt to transfer amount of L$ from the owner of the object to 'id'. Requires PERMISSION_DEBIT.
Returns a key used in a matching transaction_result() event for the success or failure of the transfer.
</string>
<string name="LSLTipText_llGetParcelMusicURL" translate="false">
string llGetParcelMusicURL()
Returns the music URL of the object's current parcel if the script owner also owns the parcel.
</string>
<string name="LSLTipText_llScriptProfiler" translate="false">
llScriptProfiler(integer flags)
Enables or disables the scripts profiling state.
Flags can be either of PROFILE_SCRIPT_NONE or PROFILE_SCRIPT_MEMORY.
Applies to Mono-compiled scripts only.
</string>
<string name="LSLTipText_llGetSPMaxMemory" translate="false">
integer llGetSPMaxMemory()
Returns the integer of the most bytes used while llScriptProfiler() was last active.
Only relevant for Mono-compiled scripts.
</string>
<string name="LSLTipText_llGetUsedMemory" translate="false">
integer llGetUsedMemory()
Returns the integer of the number of bytes of memory currently in use by the script.
Only relevant for Mono-compiled scripts.
</string>
<string name="LSLTipText_llSetAngularVelocity" translate="false">
llSetAngularVelocity(vector force, integer local)
Applies rotational velocity to object.
</string>
<string name="LSLTipText_llSetRegionPos" translate="false">
integer llSetRegionPos(vector position)
Tries to moves the entire object so that the root prim is within 0.1m of position.
</string>
<!-- END FS:Ansariel: LSL function tooltip help texts manually added -->
<!-- Avatar busy/away mode -->
<string name="AvatarSetNotAway">Not Away</string>