X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=huffware%2Fhuffotronic_tools_n_testers_v6.5%2Ftester_for_inventory_exchanger_v1.0.txt;fp=huffware%2Fhuffotronic_tools_n_testers_v6.5%2Ftester_for_inventory_exchanger_v1.0.txt;h=688a3a9c6b9c3698849122b936f662a292112293;hb=ef90e9104684f535e8a5edef643f008592254019;hp=0000000000000000000000000000000000000000;hpb=8bca8b4404ce2236359f100b97b1d10abb1b94bb;p=feisty_meow.git diff --git a/huffware/huffotronic_tools_n_testers_v6.5/tester_for_inventory_exchanger_v1.0.txt b/huffware/huffotronic_tools_n_testers_v6.5/tester_for_inventory_exchanger_v1.0.txt new file mode 100755 index 00000000..688a3a9c --- /dev/null +++ b/huffware/huffotronic_tools_n_testers_v6.5/tester_for_inventory_exchanger_v1.0.txt @@ -0,0 +1,146 @@ + +// huffware script: tester for inventory exchanger, by fred huffhines. +// +// makes sure that the inventory exchanger is working, although this currently +// needs some manual inspection to be sure that the items are properly exchanged +// with the child prims. +// +// this script is licensed by the GPL v3 which is documented at: http://www.gnu.org/licenses/gpl.html +// do not use it in objects without fully realizing you are implicitly accepting that license. +// + +// requires inventory exchanger version 2.0 or better. +////////////// +// do not redefine these constants. +integer INVENTORY_EXCHANGER_HUFFWARE_ID = 10021; + // the unique id within the huffware system for the jaunt script to + // accept commands on. this is used in llMessageLinked as the num parameter. +string HUFFWARE_PARM_SEPARATOR = "{~~~}"; + // this pattern is an uncommon thing to see in text, so we use it to separate + // our commands in link messages. +//string HUFFWARE_ITEM_SEPARATOR = "{|||}"; + // used to separate lists of items from each other when stored inside a parameter. + // this allows lists to be passed as single string parameters if needed. +integer REPLY_DISTANCE = 100008; // offset added to service's huffware id in reply IDs. +// commands available via the library: +string REGISTER_ASSETS_COMMAND = "#regis#"; + // makes the root prim's inventory exchanger track a set of items which each participating + // child prim should have. this command is only available to the root prim; child prims + // cannot register any assets but instead can get updates on the assets. the parameter + // required is a list of asset definitions, wrapped by the huffware item separator. each + // asset definition is in turn a two part list wrapped with the asset field separator. +string ASSET_FIELD_SEPARATOR = "&&"; // separates the type from the name in our list. +string WILDCARD_INVENTORY_NAME = "ALL"; + // this keyword can be used to register all of the inventory items available of the + // specified type. this should be passed as the inventory item name in the second half of + // an asset definition list. +string WHACK_INVENTORY_SIGNAL = "DEL*"; + // ensures that the child prim doesn't maintain *any* of the inventory of the type specified. +string AVAILABLE_ASSETS_EVENT = "#gotz#"; + // the root prim publishes this event to list out what items it has available. the child + // prims need to ask for anything that they're currently missing. the included parameters + // are in the same format as the register assets command, but no wildcards will be present; + // all asset names will be fully expanded. +string REQUEST_UPDATES = "#nupd#"; + // used by the child prim to request an updated version of an asset or assets. the parameters + // should follow the register assets command. +string FINISHED_UPDATING = "#donq#"; + // a signal sent from the root prim to the child prim when the root has finished updating + // the assets requested. this lets the child know that it can clean out any outdated versions + // of items which got an update. there are no parameters to this, because the child prim + // should have at most one update outstanding at a time. +////////////// + +// looks for an inventory item with the same prefix as the "basename_to_seek". +integer find_basename_in_inventory(string basename_to_seek, integer inv_type) +{ + integer num_inv = llGetInventoryNumber(inv_type); + if (num_inv == 0) return -1; // nothing there! + integer indy; + for (indy = 0; indy < num_inv; indy++) { + if (is_prefix(llGetInventoryName(inv_type, indy), basename_to_seek)) + return indy; + } + return -2; // failed to find it. +} + +// returns the name of the inventory exchange script, if one is present. we don't worry +// about there being more than one present; that's a different script's problem rather +// than one from the inventory exchanger. +string get_exchangers_name() +{ + integer found = find_basename_in_inventory("inventory exchanger", INVENTORY_SCRIPT); + if (found < 0) { + return ""; + } + return llGetInventoryName(INVENTORY_SCRIPT, found); +} + +// tell the root prim's inventory exchanger what to monitor. +post_exchangeable_assets() +{ + llMessageLinked(LINK_THIS, INVENTORY_EXCHANGER_HUFFWARE_ID, REGISTER_ASSETS_COMMAND, + wrap_parameters([ + (string)INVENTORY_LANDMARK + ASSET_FIELD_SEPARATOR + "ALL", + (string)INVENTORY_SOUND + ASSET_FIELD_SEPARATOR + "ALL", + (string)INVENTORY_SCRIPT + ASSET_FIELD_SEPARATOR + get_exchangers_name(), + (string)INVENTORY_TEXTURE + ASSET_FIELD_SEPARATOR + "ALL" + ])); +} + +////////////// +// from hufflets... + +integer debug_num = 0; +// a debugging output method. can be disabled entirely in one place. +log_it(string to_say) +{ + debug_num++; + // tell this to the owner. + llOwnerSay(llGetScriptName() + "[" + (string)debug_num + "] " + to_say); + // say this on an unusual channel for chat if it's not intended for general public. +// llSay(108, llGetScriptName() + "[" + (string)debug_num + "] " + to_say); + // say this on open chat that anyone can hear. we take off the bling for this one. +// llSay(0, to_say); +} + +// joins a list of parameters using the parameter sentinel for the library. +string wrap_parameters(list to_flatten) +{ return llDumpList2String(to_flatten, HUFFWARE_PARM_SEPARATOR); } + +// returns the index of the first occurrence of "pattern" inside +// the "full_string". if it is not found, then a negative number is returned. +integer find_substring(string full_string, string pattern) +{ return llSubStringIndex(llToLower(full_string), llToLower(pattern)); } + +// returns TRUE if the "prefix" string is the first part of "compare_with". +integer is_prefix(string compare_with, string prefix) +{ return find_substring(compare_with, prefix) == 0; } + +// end hufflets. +////////////// + +default { + state_entry() { if (llSubStringIndex(llGetObjectName(), "huffotronic") < 0) state real_default; } + on_rez(integer parm) { state rerun; } +} +state rerun { state_entry() { state default; } } + +state real_default { + state_entry() + { + llSetTimerEvent(14); // pretty fast update cycle will push the exchange events. + post_exchangeable_assets(); + } + + // this tester has no link message responsibilities. once it tells the root prim's + // inventory exchanger what to do, that's all it needs to say. +// link_message(integer link_num, integer service, string cmd, key parms) {} + + timer() { + // repost all the assets we care about. this ensures that we're up to date if the + // inventory changes. + post_exchangeable_assets(); + } +} +