User:Allen Kerensky/Myriad Lite Preview 5/Meter
From OpenSimulator
< User:Allen Kerensky | Myriad Lite Preview 5(Redirected from User:Allen Kerensky:Myriad Lite Preview 5:Meter)
Myriad Lite Meter
Many people prefer a hovertext meter to let others see the in-character alias name of the player and see the relative damage or health of their opponents during combat.
Setup
- Create a cylinder 0.025m for X and Y, and 0.5 meters for Z
- Set the texture to "Default Transparent" and set the transparency to at least 2%
- Drag and Drop the Myriad Lite Meter script (below) from inventory into the object
- Take the meter into inventory.
- Attach the meter object from inventory to a convenient spot, such as an ear or eye.
- Press CTRL-ALT-T to "Show Transparent"
- Edit the position and rotation of the meter attachment.
- Detach the meter back into inventory to "save" the new default attachment point.
- Attach or wear the meter when designed.
You should see "waiting for update" at first, which gets replaced with your character sheet alias and health on the next meter update event.
Myriad_Lite_Meter-v0.0.5-20120202.lsl
//============================================================================
// Myriad_Lite_Meter-v0.0.5-20120202.lsl
// Copyright (c) 2012 By Allen Kerensky (OSG/SL)
// The Myriad RPG System was designed, written, and illustrated by Ashok Desai
// Myriad RPG licensed under the Creative Commons Attribution 2.0 UK: England and Wales
// http://creativecommons.org/licenses/by/2.0/uk/
// Myriad Lite software Copyright (c) 2011 by Allen Kerensky (OSG/SL)
// Baroun's Adventure Machine Copyright (c) 2008-2011 by Baroun Tardis (SL)
// Myriad Lite and Baroun's Adventure Machine licensed under the
// Creative Commons Attribution-Share Alike-Non-Commercial 3.0 Unported
// http://creativecommons.org/licenses/by-nc-sa/3.0/
// You must agree to the terms of this license before making any use of this software.
// If you do not agree to this license, simply delete these materials.
// There is no warranty, express or implied, for your use of these materials.
//============================================================================
//============================================================================
// MESSAGE FORMAT REFERENCE
//============================================================================
// CHANPLAYER IN - METER|str PLAYER NAME|str GAMENAME|int CURWOUNDS|int MAXWOUNDS|int CURCRITICAL|int MAXCRITICAL|int ISDEAD|int ISINCAPACITATED
//============================================================================
// GLOBAL VARIABLES
//============================================================================
integer CHANATTACH; // dynamic channel for player attachments
integer HANDATTACH; // attach channel handle for llRemove
string CHAN_PREFIX = "0x"; // prefix to convert to hexadecimal
string DIV = "|"; // Myriad message field divider
string STATUS; // settext message
integer NAME_FORMAT; // 1 = Alias only, 2 = First "Alias" Last, 3 = Alias (First Last)
integer SHOW_HEALTH; // show the health percentage or not?
vector COLOR = <0,1,0>; // set text color
float ALPHA = 1.0; // set text alpha 0.0 = clear, 1.0 = solid
vector GREEN = <0,1,0>; // color constant for convenience
vector YELLOW = <1,1,0>; // color constant for convenience
vector RED = <1,0,0>; // color constant for convencience
vector BLACK = <0,0,0>; // color constant for convenience
//============================================================================
// GLOBAL SETUP()
//============================================================================
SETUP() {
llSetText("--- Waiting for Myriad Update ---",<1,0,0>,1); // set a default banner to show we haven't been updated yet
NAME_FORMAT = 1; // 1 = Alias only, 2 = First "Alias" Last, 3 = Alias (First Last)
SHOW_HEALTH = TRUE; // show the health percentage or not?
CHANATTACH = (integer)(CHAN_PREFIX+llGetSubString((string)llGetOwner(),1,7)); // calculate wearer's dynamic attachment channel
if ( HANDATTACH != 0 ) llListenRemove(HANDATTACH); // remove previously open channel
HANDATTACH = llListen(CHANATTACH,"",NULL_KEY,""); // start a listener on the dynamic channel
llWhisper(CHANATTACH,"ATTACHMETER"); // tell HUD we're attached
}
//============================================================================
// DEFAULT STATE
//============================================================================
default {
//------------------------------------------------------------------------
// STATE_ENTRY EVENT
//------------------------------------------------------------------------
state_entry() {
SETUP(); // setup the hovertext meter
}
//------------------------------------------------------------------------
// ON_REZ EVENT
//------------------------------------------------------------------------
on_rez(integer param) {
param = 0; // LSLINT
SETUP(); // setup the hovertext meter
}
//------------------------------------------------------------------------
// ATTACH EVENT
//------------------------------------------------------------------------
attach(key id) { //
if ( id != NULL_KEY ) {
SETUP(); // wearing, let's setup
return;
}
if ( id == NULL_KEY ) { // detach, drop, derezzed to inventory - NOT ON LOGOUT
if ( HANDATTACH != 0 ) llListenRemove(HANDATTACH);
llWhisper(CHANATTACH,"DETACHMETER");
return;
}
}
//------------------------------------------------------------------------
// CHANGED EVENT
//------------------------------------------------------------------------
changed(integer changes) {
if ( changes & CHANGED_OWNER ) { // if owner has changed, we need to recalculate the dynamic channel
SETUP(); // setup the hovertext meter
return;
}
if ( changes & CHANGED_REGION || changes & CHANGED_TELEPORT ) { // owner jumped to new location? restart
SETUP(); // setup hovertext and channel
return;
}
}
//------------------------------------------------------------------------
// LISTEN EVENT
//------------------------------------------------------------------------
listen(integer channel,string name,key id,string message) {
name = ""; // LSLINT
id = NULL_KEY; // LSLINT
if ( channel == CHANATTACH ) { // did this message come in on attachment channel?
list fields = llParseString2List(message,[DIV],[]); // break message down into list separated by |
string command = llList2String(fields,0); // read first item in list to get the Myriad command
if ( command == "METER") { // if this is the METER command, let's update the meter status
string playername = llList2String(fields,1); // get the full player name from the list of METER values
list name2 = llParseString2List(playername,[" "],[]); // separate first and last name by space
string firstname = llList2String(name2,0); // get the firstname from the name2
string lastname = llList2String(name2,1); // get the lastname, if any, from the name2
string gamename = llList2String(fields,2); // get player's alias/game name (originally set in their character sheet)
integer curwounds = llList2Integer(fields,3); // what is player's current wound value?
integer maxwounds = llList2Integer(fields,4); // what is player's maximum healed wounds allowed by level/stats?
integer curcritical = llList2Integer(fields,5); // what is player's current critical wounds value?
integer maxcritical = llList2Integer(fields,6); // what is player's maximum healed critical wounds value?
integer isdead = llList2Integer(fields,7); // is player dead?
integer isincap = llList2Integer(fields,8); // is player incapacitated?
// okay, we've broken down status, lets create a banner from that using colors
STATUS = ""; // start with an empty string
COLOR = GREEN; // start with fully healthy color
if ( NAME_FORMAT == 1 ) { // what name format do we want to see?
STATUS = gamename; // 1 == just Alias name from character sheet
} else if ( NAME_FORMAT == 2 ) { // not format 1, so format 2?
STATUS = firstname + "\"" + gamename + "\"" + lastname; // firstname "alias" lastname
} else if ( NAME_FORMAT == 3 ) { // not format 1, or 2, so...
STATUS = gamename + "("+playername+")"; // alias (firstname lastname)
}
if ( SHOW_HEALTH == TRUE ) { // do we want a health number (unrealistic)
float currentpoints = (float)curwounds + (float)curcritical; // add up noncritical and critical wounds boxes remaining
float maxpoints = (float)maxwounds + (float)maxcritical; // add up total wounds boxes player should have
if ( currentpoints > 0.0 ) { // if player has some wounds left
float health = ( ( currentpoints / maxpoints ) * 100.0 ); // get a percentage
STATUS += "\nHealth: "+(string)llRound(health)+"%"; // add the percentage health to the status
} else { // oops all resilience gone
STATUS += "\nHealth; 0%"; // so add a zero% to status
}
}
if ( curwounds == maxwounds && curcritical == maxcritical ) { // are all health boxes full?
COLOR = GREEN; // fully healthy
}
if ( curwounds < maxwounds && curwounds >= 1 ) { // we've lost some wounds, but not incapacitated
COLOR = YELLOW; // set a warning that we've been wounded and not fully healty
}
if ( curwounds < 1 ) { // if we're out of non-critical wounds, we're in trouble
COLOR = RED; // we're incapacitated but not dead, bleeding out here
}
if ( isincap == 1 && isdead == 0 ) {
STATUS += " ! INCAPACITATED !";
COLOR = RED; // set color to warning that we're down but not dead yet
}
if ( isdead == 1 ) { // if we're dead
STATUS += " !!! DEAD !!!"; // add a notice to status
COLOR = BLACK; // set color to color of death
}
llSetText(STATUS,COLOR,ALPHA); // show the new status text over the meter
return; // we're done with this command, exit entire listen event
} // end if command meter
if ( command == "REGISTERATTACHMENTS" ) { // HUD asking for attachments attached?
SETUP(); // just setup
}
} // end if chanattach
}
} // end default
//============================================================================
// END
//============================================================================