Difference between revisions of "DAMAGEABLE"
Jump to navigation
Jump to search
(Created page with "{{LSL Constant |name=DAMAGEABLE |type=integer |hvalue=0x20 |desc=If it is contained in the result of llDetectedType(), it means what was detected is either an agent th...") |
m (Formatting, added caveats) |
||
Line 3: | Line 3: | ||
|type=integer | |type=integer | ||
|hvalue=0x20 | |hvalue=0x20 | ||
|desc=If it is contained in the result of [[llDetectedType]] | |desc= | ||
If it is contained in the result of [[llDetectedType]], it means what was detected is either an [[agent]] that can take damage, or is an object containing a script with either [[on_damage]] or [[final_damage]] events (able to process damage). | |||
If it is used as a filter of [[llSensor]] or [[llSensorRepeat]], it will search for agents or objects which match the same criteria mentioned above. | |||
|caveats= | |||
* The sensor will detect nothing if [[DAMAGEABLE]] is used by itself. | |||
** It should be combined with other constants like [[SCRIPTED]] or [[AGENT]]. | |||
|constants={{LSL Constants Sensor|no_wrapper=true|examples=*}} | |constants={{LSL Constants Sensor|no_wrapper=true|examples=*}} | ||
|functions= | |functions= |
Latest revision as of 07:50, 7 November 2024
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Description
Constant: integer DAMAGEABLE = 0x20;The integer constant DAMAGEABLE has the value 0x20
If it is contained in the result of llDetectedType, it means what was detected is either an agent that can take damage, or is an object containing a script with either on_damage or final_damage events (able to process damage).
If it is used as a filter of llSensor or llSensorRepeat, it will search for agents or objects which match the same criteria mentioned above.
Caveats
- The sensor will detect nothing if DAMAGEABLE is used by itself.
Related Articles
Constants
|
Functions
• | llDetectedType | |||
• | llSensor | |||
• | llSensorRepeat |
Examples
Using llDetectedType in collision event:
integer type;
default
{
state_entry()
{
llVolumeDetect(TRUE);
}
collision_start(integer detected)
{
type = llDetectedType(0);
if (type == AGENT)// = 1
{
llSay(0, "This is impossible. Since there is no avatar who doesn't require the physical calculation.");
}
else if (type == ACTIVE)// = 2
{
llSay(0, "I have been struck by a physical object not containing any script.");
}
else if (type == PASSIVE)// = 4
{
llSay(0, "This is impossible. Non-physical objects cannot trigger this event.");
}
else if (type == SCRIPTED)// = 8
{
llSay(0, "This is impossible. Since there is no object which isn't physical nor non-physical.");
}
else if (type == (AGENT | ACTIVE) ) // 1 + 2
{
llSay(0, "I have been struck by an avatar.");
}
else if (type == (SCRIPTED | ACTIVE) ) // = 8 + 2
{
llSay(0, "I have been struck by a physical object containing any script.");
}
else if (type == (SCRIPTED | PASSIVE) ) // = 8 + 4
{
llSay(0, "This is impossible. Non-physical objects cannot trigger this event.");
}
}
}
Using llDetectedType in sensor event:
default
{
touch_start(integer numberDetected)
{
llSensor("", "", ACTIVE | PASSIVE | AGENT, 20.0, PI); // activates the sensor.
}
sensor (integer numberDetected)
{
integer i;
while(i < numberDetected)
{
integer type = llDetectedType(i);
string message;
message += (string)i + ", " + llDetectedName(i) + ", ";
list typeList;
if (type & AGENT)
{
typeList += "AGENT";
}
if (type & ACTIVE)
{
typeList += "ACTIVE";
}
if (type & PASSIVE)
{
typeList += "PASSIVE";
}
if (type & SCRIPTED)
{
typeList += "SCRIPTED";
}
message += llDumpList2String(typeList, "|");
llWhisper(0, message);
++i;
}
}
no_sensor()
{
// This is impossible if range = 20.0 and you are standing within 10m!
llWhisper(0, "Nothing is near me at present.");
}
}
Using filter in llSensor* functions:
// Report nearby sensed objects and avatars under sundry categories
list SenseTypes;
integer gIndex;
SenseNextType()
{
string text = llList2String( SenseTypes, gIndex);
integer tipe = llList2Integer(SenseTypes, gIndex + 1);
if (tipe)
{
llWhisper(0, text);
llSensor("", NULL_KEY, tipe, 20.0, PI);
gIndex += 2; // increment by stride
}
else
llWhisper(0, "--- Finished ---");
}
default
{
touch_start(integer detected)
{
// Make a Strided list of text and sensor type combinations
// (Can't use '|' in Global, unfortunately)
SenseTypes = [
"AGENT_BY_LEGACY_NAME", AGENT_BY_LEGACY_NAME,
"ACTIVE", ACTIVE,
"AGENT_BY_LEGACY_NAME|ACTIVE", AGENT_BY_LEGACY_NAME|ACTIVE,
"PASSIVE", PASSIVE,
"AGENT_BY_LEGACY_NAME|PASSIVE", AGENT_BY_LEGACY_NAME|PASSIVE,
"ACTIVE|PASSIVE", ACTIVE|PASSIVE,
"AGENT_BY_LEGACY_NAME|ACTIVE|PASSIVE", AGENT_BY_LEGACY_NAME|ACTIVE|PASSIVE,
"SCRIPTED", SCRIPTED,
"AGENT|SCRIPTED", AGENT|SCRIPTED,
"ACTIVE|SCRIPTED", ACTIVE|SCRIPTED,
"AGENT_BY_LEGACY_NAME|ACTIVE|SCRIPTED", AGENT_BY_LEGACY_NAME|ACTIVE|SCRIPTED,
"PASSIVE|SCRIPTED", PASSIVE|SCRIPTED,
"", 0 ];
gIndex = 0;
SenseNextType(); // Kick off the sensing sequence
}
sensor(integer detected)
{
integer x;
while (x < detected)
{
llWhisper(0, (string) (x+1) + ": " + llDetectedName(x) );
++x;
}
SenseNextType();
}
no_sensor()
{
llWhisper(0, "none");
SenseNextType();
}
}
Detecting damageable things with sensors:
default
{
state_entry()
{
llSensor("", "", SCRIPTED|AGENT|DAMAGEABLE, 20, PI);
}
no_sensor()
{
llOwnerSay("Nothing detected");
}
sensor(integer num_detected)
{
llOwnerSay("Detected " + (string)num_detected + " damageable thing(s)");
integer i;
for (i = 0; i < num_detected; ++i)
{
string name = llDetectedName(i);
integer isAgent = llDetectedType(i) & AGENT;
list types = ["Object", "Agent"];
llOwnerSay(llList2String(types, isAgent) + ": " + name);
}
}
}