FarmSystem/LSL/raw/basic_ingredient.lsl

245 lines
No EOL
8.3 KiB
Text

#include "Common.lsl"
key g_kID=NULL_KEY;
string g_sIngredientType = "none";
integer g_iQuantity = 0;
key g_kFollow = NULL_KEY;
integer g_iProdLink=3;
integer g_iDies=FALSE;
vector g_vScale;
integer g_iPreCraft;
rotation g_rRot;
vector g_vPreCraft;
setText() {
llSetText(g_sIngredientType + ": " + (string)g_iQuantity, <1,1,1>, 1);
}
setProductTexture(key kID) {
#ifdef PRODUCT_PRIM
if(g_iProdLink!=-99) {
#ifdef PRODUCT_FACE
llSetLinkTexture(PRODUCT_PRIM, kID, PRODUCT_FACE);
#else
llSetLinkTexture(PRODUCT_PRIM, kID, ALL_SIDES);
#endif
}
#endif
}
stopFollowing(float fOffset) {
if(g_kFollow == NULL_KEY)return;
g_kFollow = NULL_KEY;
llSetTimerEvent(0);
llSetPos(llGetPos() - <0,0,fOffset>);
}
follow(key kID) {
g_kFollow = kID;
llSetTimerEvent(1);
}
vector g_vParticleColor = ZERO_VECTOR;
particles(key kTarget) {
if(kTarget == NULL_KEY) llParticleSystem([]);
else {
llParticleSystem(
[
// texture parameters:
PSYS_SRC_TEXTURE , "",
PSYS_PART_START_SCALE , <0.67,0.58,0.00>, PSYS_PART_END_SCALE , <0.09,0.09,0.00>,
PSYS_PART_START_COLOR , g_vParticleColor, PSYS_PART_END_COLOR , <0.16,0.71,0.83>,
PSYS_PART_START_ALPHA , (float)1.00, PSYS_PART_END_ALPHA , (float)1.00,
// production parameters:
PSYS_SRC_BURST_PART_COUNT , 16,
PSYS_SRC_BURST_RATE , (float)0.10,
PSYS_PART_MAX_AGE , (float)6.54,
PSYS_SRC_MAX_AGE , (float)0.18,
// placement parameters:
PSYS_SRC_PATTERN , 2,
PSYS_SRC_BURST_SPEED_MIN , (float)1.00, PSYS_SRC_BURST_SPEED_MAX , (float)1.00,
PSYS_SRC_BURST_RADIUS , (float)0.00,
// placement parameters (for angles only):
PSYS_SRC_ANGLE_BEGIN , (float)0.00,
PSYS_SRC_ANGLE_END , (float)0.00,
PSYS_SRC_OMEGA , <0.00,0.00,0.00>,
// after-effects & influences:
PSYS_SRC_ACCEL , <0.00,0.00,0.00>,
PSYS_SRC_TARGET_KEY , kTarget,
PSYS_PART_FLAGS , ( 0 // texture & influence options:
// | PSYS_PART_INTERP_COLOR_MASK
| PSYS_PART_INTERP_SCALE_MASK
// | PSYS_PART_BOUNCE_MASK
// | PSYS_PART_WIND_MASK
// | PSYS_PART_FOLLOW_SRC_MASK
| PSYS_PART_FOLLOW_VELOCITY_MASK
| PSYS_PART_TARGET_POS_MASK
// | PSYS_PART_TARGET_LINEAR_MASK
| PSYS_PART_EMISSIVE_MASK
)] );
}
}
default
{
state_entry() {
llLinksetDataReset();
llSetText("Empty", <1,1,1>, 1);
llSay(0, "Freshly initialized");
PROTECT();
XteaKey(PSK);
global_ingredients = getIngredientChannel(NULL_KEY);
llListen(global_ingredients, "", "", "");
particles(NULL_KEY);
setProductTexture(TEXTURE_TRANSPARENT);
llSay(0, "Ready to package");
}
touch_start(integer num_detected)
{
llParticleSystem([]);
if(g_kFollow == NULL_KEY) {
follow(llDetectedKey(0));
}else {
stopFollowing(g_vScale.z-0.2);
}
}
timer () {
g_vScale = llGetAgentSize(g_kFollow);
if(g_vScale == ZERO_VECTOR) {
stopFollowing(g_vScale.z-0.2);
}else {
list lData = llGetObjectDetails(g_kFollow, [OBJECT_POS, OBJECT_ROT]);
vector vPos = llList2Vector(lData,0);
rotation rPos = llList2Rot(lData,1);
llSetRegionPos(vPos + <1.1, -1, 1> * rPos);
}
}
on_rez(integer n) {
llSetText("Empty", <1,1,1>, 1);
llListen(getIngredientChannel(llGetKey()), "", "", "");
setProductTexture(TEXTURE_TRANSPARENT);
// Check if ingredient type was already set. This is not a storage container.
if(g_sIngredientType != "none") {
llWhisper(0, "I spilled in your inventory, consider using a sealed storage container.");
if(g_iDies) llDie();
#ifdef DIES
llDie();
#endif
g_sIngredientType = "none";
g_iQuantity = 0;
g_vParticleColor = ZERO_VECTOR;
setProductTexture(NULL_KEY);
}else {
// Inform any nearby object that is waiting that we've been rezzed
llWhisper(global_ingredients, xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "alive", "type", INGREDIENT_HOLDER_TYPE])));
}
}
listen(integer c,string n,key i,string m) {
// Decode message
string params = xtea_decrypt_string(m);
// Get operation
if(c == global_ingredients) {
if(g_kID == NULL_KEY) return;
else {
if(llJsonGetValue(params, ["cmd"]) == "query" && !g_iPreCraft) {
llRegionSayTo(i,c,xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "reply", "ingredient", g_sIngredientType, "id", g_kID])));
}
}
}else {
if(llJsonGetValue(params, ["cmd"]) == "init") {
g_kID = llGenerateKey();
llSetText("Initializing...", <0.5,0,0>, 1);
} else if(llJsonGetValue(params, ["cmd"]) == "deposit") {
if(g_sIngredientType == "none" || g_sIngredientType == llJsonGetValue(params, ["type"])) {
g_sIngredientType = llJsonGetValue(params, ["type"]);
string sStatus = "fail";
if(g_iQuantity == 0) {
g_iQuantity += (integer)llJsonGetValue(params, ["amount"]);
sStatus = "ok";
setProductTexture(llJsonGetValue(params, ["texture"]));
g_vParticleColor = (vector)llJsonGetValue(params, ["particle"]);
g_iDies = (integer)llJsonGetValue(params, ["dies"]);
particles(llGetKey());
llMessageLinked(LINK_SET, 0, "", "");
}
setText();
llRegionSayTo(i, getIngredientChannel(NULL_KEY), xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "deposit_reply", "status", sStatus])));
particles(NULL_KEY);
}
} else if(llJsonGetValue(params, ["cmd"]) == "use" && llJsonGetValue(params, ["id"]) == g_kID) {
particles(i);
if(g_iQuantity==0) {
llRegionSayTo(i,global_ingredients,llList2Json(JSON_OBJECT, ["cmd", "use_reply", "id", NULL_KEY, "amount", 0]));
return;
}
g_iQuantity--;
llRegionSayTo(i,global_ingredients,llList2Json(JSON_OBJECT, ["cmd", "use_reply", "id", g_kID, "amount", 1, "ingredient", g_sIngredientType]));
setText();
if(g_iQuantity<=0) {
g_iQuantity=0;
setProductTexture(TEXTURE_TRANSPARENT);
g_sIngredientType = "none";
#ifdef DIES
llDie();
#endif
if(g_iDies) llDie();
else {
if(!g_iPreCraft)return;
llTargetOmega(ZERO_VECTOR, 0,0);
llSetRot(g_rRot);
llSetPos(g_vPreCraft);
g_iPreCraft=0;
llScaleByFactor(1);
}
}
} else if(llJsonGetValue(params, ["cmd"]) == "precraft") {
if(g_iPreCraft)return;
stopFollowing(g_vScale.z-0.2);
g_vRot = llGetRot();
g_iPreCraft=1;
llScaleByFactor(0.025);
llTargetOmega(<0,0.1,1>, 0.25, 1);
g_vPreCraft = llGetPos();
llSetPos((vector)llJsonGetValue(params, ["pos"]) + <0,0,0.05>);
particles(i);
} else if(llJsonGetValue(params, ["cmd"]) == "abortcraft") {
if(!g_iPreCraft)return;
g_iPreCraft = 0;
llScaleByFactor(1);
llTargetOmega(<0,0,0>, 0,0);
llSetRot(g_vRot);
llSetPos(g_vPreCraft);
particles(llGetKey());
}
}
}
}