diff --git a/Meter v0.7.0 b/Meter v0.7.0 new file mode 100644 index 0000000..3c0103a --- /dev/null +++ b/Meter v0.7.0 @@ -0,0 +1,217 @@ +// 4CGS - Meter [v0.7.0] + +// ► ◄ █ ▄ ■ ▲ ▼ © ▓ ░ ─ ↑ ↓ ▲ ▼ ✔ ✘ • ♫ « » + +string PRGNAME = "4CGS - Meter"; +string VERSION = "0.7.0"; +string name = ""; +integer hp = 0; +integer level = 0; +integer regchan = -1; +integer show_meter = TRUE; +integer meter_delay = 10; // Zeit, wie lange der Text sichtbar ist. +string MSG_DROPPED = "Du hast Dein 4cGS Meter auf der Region an Position {0} fallen lassen. Es wird in 15 Minuten automatisch gelöscht."; +string MSG_WRONGATTACH = "Du musst das Meter an den Kopf Deines Avatars anlegen, damit es korrekt funktionieren kann."; +string MSG_LEVELUP = "{0} hat level {1} erreicht."; + + +default +{ + state_entry() + { + getregionchannel(); + name = llList2String(llParseString2List(llKey2Name(llGetOwner()), [" "], []), 0); + llSetAlpha(1, ALL_SIDES); + check(); + llParticleSystem([]); + llPreloadSound("Level_Up"); + llResetTime(); + llSetTimerEvent(5); + } + + timer() + { + if(llGetTime() > meter_delay) + { + llSetText("", <0,0,0>, 0); + llResetTime(); + } + } + + attach(key id) + { + if(id != llGetOwner()) + check(); + } + + on_rez(integer x) + { + llResetScript(); + } + + changed(integer change) + { + if(change & (CHANGED_REGION | CHANGED_OWNER)) + llResetScript(); + } + + dataserver(key id, string msg) + { + if(llSubStringIndex(llKey2Name(id), "4CGS") == 0) + { + if(msg == "HIDE") + { + llSetText("", <0,0,0>, 0); + return; + } + + if(llSubStringIndex(msg, "NAME:") == 0 && llStringLength(msg) > 5) + name = llGetSubString(msg, 5, -1); + + if(llSubStringIndex(msg, "LEVEL:") == 0 && llStringLength(msg) > 6) + { + level = (integer)llGetSubString(msg, 6, -1); + if(level > (integer)llGetObjectDesc()) + { + llSetObjectDesc((string)level); + if(llGetTime() > meter_delay) + state level_up; + } + else if (level < (integer)llGetObjectDesc()) + level = (integer)llGetObjectDesc(); + } + + if(llSubStringIndex(msg, "HP:") == 0 && llStringLength(msg) > 3) + { + set_hud_text(); + hp = (integer)llGetSubString(msg, 3, -1); + if(hp < 0) hp = 0; + } + } + } +} + + +state inworld +{ + state_entry() + { + llOwnerSay(osFormatString(MSG_WRONGATTACH, [(string)llGetPos()])); + llSetAlpha(1, ALL_SIDES); + llSetTimerEvent(900); + } + + timer() + { + llDie(); + } +} + + +state level_up +{ + state_entry() + { + string n = llGetObjectName(); + llSetObjectName(name); + llRegionSay(regchan, osFormatString(MSG_LEVELUP, [name, (string)level])); + llSetObjectName(n); + llSetTimerEvent(12); + llSetText("► LEVEL UP! ◄", <1,1,0>, 1); + osAvatarPlayAnimation(llGetOwner(), "level_up"); + llPlaySound("Level_Up", 1); + } + + timer() + { + llSetTimerEvent(0); + llStopSound(); + llParticleSystem([]); + osAvatarStopAnimation(llGetOwner(), "level_up"); + llSetText("", <0,0,0>, 0); + state default; + } +} + +set_hud_text() +{ + if(show_meter == TRUE) + { + vector color = <0, 1, 0>; + if(hp == 0) color = <0,0,0>; + if (hp > 0) color = <0.8,0,0>; + if (hp > 24) color = <1,1,0>; + if (hp > 49) color = <0,1,0>; + llSetText("4CGS [v" + VERSION + "]\n────────────────────\n• " + name + " •\nLevel: " + level + "\n" + bar((float)hp, 100.0, 15), color, 1); + } + else + llSetText("", <0,0,0>,0); +} + +check() +{ + if(llGetAttached() == 0) + state inworld; + + if(llGetAttached() != 2) + { + llOwnerSay(MSG_WRONGATTACH); + osForceDetachFromAvatar(); + } + else + llSetAlpha(0, ALL_SIDES); +} + +string bar(float val, float max, integer len) +{ + integer pro = llFloor((len / max) * val); + integer y; + string txt = ""; + for(y = 0; y < len; y++) + txt += "░"; + txt = osReplaceString(txt, "░", "█", pro, 0); + return txt; +} + +particle_level_up() +{ + //float prims = llRound(((float)llGetParcelPrimCount(llGetPos(), PARCEL_COUNT_TOTAL, TRUE) / 500) / 10) * 10; + +//llOwnerSay((string)prims); + llParticleSystem([ + PSYS_PART_FLAGS,( 0 + |PSYS_PART_INTERP_COLOR_MASK + |PSYS_PART_INTERP_SCALE_MASK + |PSYS_PART_FOLLOW_SRC_MASK + |PSYS_PART_FOLLOW_VELOCITY_MASK + |PSYS_PART_EMISSIVE_MASK ), + PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE , + PSYS_PART_START_ALPHA,1, + PSYS_PART_END_ALPHA,0.3, + PSYS_PART_START_COLOR,<1.0, 0.95, 0.3> , + PSYS_PART_END_COLOR ,<1.0, 0.2, 0.5> , + PSYS_PART_START_SCALE,<0.2, 0.2, 0>, + PSYS_PART_END_SCALE,<1, 1, 0>, + PSYS_PART_MAX_AGE,3, + PSYS_SRC_MAX_AGE,8.5, + PSYS_SRC_ACCEL,<0,0,-0.3>, + PSYS_SRC_BURST_PART_COUNT, 5, //(integer)prims, + PSYS_SRC_BURST_RADIUS, 10, + PSYS_SRC_BURST_RATE,0.05, + PSYS_SRC_BURST_SPEED_MIN,0.1, + PSYS_SRC_BURST_SPEED_MAX,0.7, + PSYS_SRC_ANGLE_BEGIN,1.5625, + PSYS_SRC_ANGLE_END,1.5625, + PSYS_SRC_OMEGA,<0,0,0>, + PSYS_SRC_TEXTURE, "star", + PSYS_SRC_TARGET_KEY, (key)llGetOwner() + ]); +} + +getregionchannel() +{ + list lstParcelDetails = llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_ID, PARCEL_DETAILS_AREA]); + regchan = (integer)("0x" + llGetSubString(llList2String(lstParcelDetails, 0), 0, 7)); + if(regchan > 0) + regchan = -regchan; +} \ No newline at end of file