// // The line above should be left blank to avoid script errors in OpenSim. /* * Part of the Sloodle project (www.sloodle.org) * * Copyright (c) 2011-06 contributors (see below) * Released under the GNU GPL v3 * ------------------------------------------- * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * All scripts must maintain this copyrite information, including the contributer information listed * * Contributers: * Originally Written by Tdub Dowler * Modified by Awsoonn Rawley * Refactored by Strife Onizuka * Modified by Paul Preibisch and Edmund Edgar for Sloodle and Opensim to eliminate the need for a sepearate script in each zztext prim, and to be independant of texture UUIDS * */ list decode=[]; // to handle special characters from CP850 page for european countries integer SLOODLE_CHANNEL_SCOREBOARD_UPDATE_COMPLETE = 1639271140; integer SLOODLE_CHANNEL_SCOREBOARD_SCORES = 1639272100; integer SLOODLE_CHANNEL_SCOREBOARD_SCORES_CONFIG = -1639272000; integer SLOODLE_CHANNEL_SCOREBOARD_SCORES_SET_CELL_INFO=-1639272001; //this is set on the zztext prims cell description integer SLOODLE_CHANNEL_SCOREBOARD_SCORES_REMAP_INDICIES=-1639272002; integer SLOODLE_CHANNEL_SCOREBOARD_SCORES_RESET_INDICIES=-1639272003; integer SLOODLE_CHANNEL_SCOREBOARD_SCORES_SET_THICKNESS=-1639272004; integer SLOODLE_CHANNEL_SCOREBOARD_SCORES_SET_COLOR=-1639272005; integer SLOODLE_CHANNEL_SCOREBOARD_TEAM_CONFIG = -1639273000; integer SLOODLE_CHANNEL_SCOREBOARD_TEAM_SET_CELL_INFO = -1639273001; integer SLOODLE_CHANNEL_SCOREBOARD_TEAM_REMAP_INDICIES = -1639273002; integer SLOODLE_CHANNEL_SCOREBOARD_TEAM_RESET_INDICIES = -1639273003; integer SLOODLE_CHANNEL_SCOREBOARD_TEAM_SET_THICKNESS = -1639273004; integer SLOODLE_CHANNEL_SCOREBOARD_TEAM_SET_COLOR = -1639273005; integer SLOODLE_CHANNEL_SCOREBOARD_TEAM = 1639273100; integer SLOODLE_CHANNEL_SCOREBOARD_CURRENCY_CONFIG = -1639274000; integer SLOODLE_CHANNEL_SCOREBOARD_CURRENCY_SET_CELL_INFO = -1639274001; integer SLOODLE_CHANNEL_SCOREBOARD_CURRENCY_REMAP_INDICIES = -1639274002; integer SLOODLE_CHANNEL_SCOREBOARD_CURRENCY_RESET_INDICIES = -1639274003; integer SLOODLE_CHANNEL_SCOREBOARD_CURRENCY_SET_THICKNESS = -1639274004; integer SLOODLE_CHANNEL_SCOREBOARD_CURRENCY_SET_COLOR = -1639274005; integer SLOODLE_CHANNEL_SCOREBOARD_CURRENCY = 1639274100; integer SLOODLE_CHANNEL_SCOREBOARD_TITLE_CONFIG = -1639275000; integer SLOODLE_CHANNEL_SCOREBOARD_TITLE_SET_CELL_INFO = -1639275001; integer SLOODLE_CHANNEL_SCOREBOARD_TITLE_REMAP_INDICIES = -1639275002; integer SLOODLE_CHANNEL_SCOREBOARD_TITLE_RESET_INDICIES = -1639275003; integer SLOODLE_CHANNEL_SCOREBOARD_TITLE_SET_THICKNESS = -1639275004; integer SLOODLE_CHANNEL_SCOREBOARD_TITLE_SET_COLOR = -1639275005; integer SLOODLE_CHANNEL_SCOREBOARD_TITLE= 1639275100; integer SLOODLE_CHANNEL_ZZTEXT_TEXTURE_CONFIG= -1639276000; list CHARACTER_GRID; integer FACE_1 = 3; integer FACE_2 = 7; integer FACE_3 = 4; integer FACE_4 = 6; integer FACE_5 = 1; /* FUNCTION debug(string message) debugging function - use the prim material setting as a toggle for debug messages. if material is flesh (means a human needs to read message) then debugging is on, of material is not flesh debugging is off */ debug (string message){ list params = llGetPrimitiveParams ([PRIM_MATERIAL ]); if (llList2Integer (params ,0)==PRIM_MATERIAL_FLESH){ llOwnerSay(llGetObjectName()+"."+llGetScriptName()+": "+message); } } vector GetGridOffset(vector grid_pos) { // Zoom in on the texture showing our character pair. integer Col = llRound(grid_pos.x) % 40; // PK was 20 integer Row = llRound(grid_pos.y) % 20; // PK was 10 // Return the offset in the texture. return <-0.45 + 0.025 * Col, 0.45 - 0.05 * Row, 0.0>; // PK was 0.05 and 0.1 } /* * renderString will render the string to all the zzTextprims having the name which is set via the zzTextPrimNames * make sure to name each zztextprim the same name, and also in their description field to number each prim from 1 - your max number of zztextprims, * So if your display has 50 prims, put in their description 1, then the next zzprim description 2 etc */ renderString(string str,string zzTextPrimNames){ integer prims = llGetNumberOfPrims(); vector GridPos1;vector GridPos2;vector GridPos3;vector GridPos4;vector GridPos5; integer currentLink=0; integer currentCellCharPosition=0; string linkDescription; string textToRender; do{ if (llList2String(llGetLinkPrimitiveParams(currentLink, [PRIM_NAME]),0)==zzTextPrimNames){ currentCellCharPosition=llList2Integer(llGetLinkPrimitiveParams(currentLink, [PRIM_DESC]),0)*10; //get the part of the text between the cells start and end position textToRender = llGetSubString(str, currentCellCharPosition, currentCellCharPosition+ 9); // Get the grid positions for each pair of characters. GridPos1 = GetGridPos( GetIndex(llGetSubString(textToRender, 0, 0)),GetIndex(llGetSubString(textToRender, 1, 1)) ); GridPos2 = GetGridPos( GetIndex(llGetSubString(textToRender, 2, 2)),GetIndex(llGetSubString(textToRender, 3, 3)) ); GridPos3 = GetGridPos( GetIndex(llGetSubString(textToRender, 4, 4)),GetIndex(llGetSubString(textToRender, 5, 5)) ); GridPos4 = GetGridPos( GetIndex(llGetSubString(textToRender, 6, 6)),GetIndex(llGetSubString(textToRender, 7, 7)) ); GridPos5 = GetGridPos( GetIndex(llGetSubString(textToRender, 8, 8)),GetIndex(llGetSubString(textToRender, 9, 9)) ); key gridTexture1= GetGridTexture(GridPos1);key gridTexture2= GetGridTexture(GridPos2);key gridTexture3= GetGridTexture(GridPos3);key gridTexture4= GetGridTexture(GridPos4);key gridTexture5= GetGridTexture(GridPos5); llSetLinkPrimitiveParamsFast(currentLink, [ PRIM_TEXTURE, FACE_1, gridTexture1, <0.125, 0.05, 0>, GetGridOffset(GridPos1) + <0.0375-0.025-0.002, 0.025, 0>, 0.0, PRIM_TEXTURE, FACE_2, gridTexture2, <0.05, 0.05, 0>, GetGridOffset(GridPos2)+<-0.025-0.002, 0.025,0>, 0.0, PRIM_TEXTURE, FACE_3, gridTexture3, <-0.74, 0.05, 0>, GetGridOffset(GridPos3)+ <-.34-0.002, 0.025, 0>, 0.0, PRIM_TEXTURE, FACE_4,gridTexture4, <0.05, 0.05, 0>, GetGridOffset(GridPos4)+<-0.025-0.002, 0.025,0>, 0.0, PRIM_TEXTURE, FACE_5, gridTexture5, <0.125, 0.05, 0>, GetGridOffset(GridPos5) + <0.0375-0.025-0.077-0.002, 0.025, 0>, 0.0 ] ); } }while(++currentLink < prims); } loadTextures(){ CHARACTER_GRID=[]; integer numTextures; numTextures = llGetInventoryNumber(INVENTORY_TEXTURE); integer i=0; for (i=0;i= index2) { // In this case, the row is the index of the first character: Row = index1; // And the col is the index of the second character (x2) Col = index2 * 2; } else { // Index1 < Index2 // In this case, the row is the index of the second character: Row = index2; // And the col is the index of the first character, x2, offset by 1. Col = index1 * 2 + 1; } return ; } // All displayable characters. Default to ASCII order. string gCharIndex; ResetCharIndex() { gCharIndex = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`"; // \" <-- Fixes LSL syntax highlighting bug. gCharIndex += "abcdefghijklmnopqrstuvwxyz{|}~"; // cap cedille u: e/ a^ a: a/ a ring cedille e^ e: decode= ["%C3%87", "%C3%BC", "%C3%A9", "%C3%A2", "%C3%A4", "%C3%A0", "%C3%A5", "%C3%A7", "%C3%AA", "%C3%AB", // e\ i: i^ i\ A: A ring E/ ae AE marker > "%C3%A8", "%C3%AF", "%C3%AE", "%C3%AC", "%C3%84", "%C3%85", "%C3%89", "%C3%A6", "%C3%86", "%E2%96%B6" , // o: o/ u^ u\ y: O: U: cent pound yen "%C3%B6", "%C3%B2", "%C3%BB", "%C3%B9", "%C3%BF", "%C3%96", "%C3%9C", "%C2%A2", "%C2%A3", "%C2%A5", // A^ a/ i/ o/ u/ n~ E: y/ inv ? O^ "%C3%82", "%C3%A1", "%C3%AD", "%C3%B3", "%C3%BA", "%C3%B1", "%C3%8B", "%C3%BD", "%C2%BF", "%C3%94", // inv ! I\ I/ degree E^ I^ o^ U^ "%C2%A1", "%C3%8C", "%C3%8D", "%C2%B0", "%C3%8A", "%C3%8E", "%C3%B4", "%C3%9B", // Y: euro german ss E\ A\ A/ U\ U/ O\ O/ "%C3%9D", "%E2%82%AC", "%C3%9F", "%C3%88", "%C3%80", "%C3%81", "%C3%99", "%C3%9A", "%C3%92", "%C3%93", // Sv sv zv Zv Y: I: "%C5%A0", "%C5%A1", "%C5%BE", "%C5%BD", "%C3%9D", "%C3%8C" ]; } integer GetIndex(string char) { integer ret=llSubStringIndex(gCharIndex, char); if(ret>=0) return ret; // special char do nice trick :) string escaped=llEscapeURL(char); if(escaped=="%E2%80%99") return 7; // remap ’ //llSay(0,"Looking for "+escaped); integer found=llListFindList(decode, [escaped]); // not found if(found<0) return 0; // return correct index return llStringLength(gCharIndex)+found; } XytstOrder() { // Fills each cell of the board with it's number. string str = ""; integer i = 0; do { str += llGetSubString(" " + (string)i,-10,-1); llSetText("Generating Pattern: " + (string)i, <0,1,0>, 1.0); }while(++i < prims); llSetText("Displaying Order Test...", <0,1,0>, 1.0); // Send the message llMessageLinked(LINK_SET, SLOODLE_CHANNEL_SCOREBOARD_SCORES_CONFIG, str, ""); llSetText("", <0,1,0>, 0); } default { on_rez(integer start) { llResetScript(); } state_entry() { // Determin the number of prims. prims = llGetNumberOfPrims(); ResetCharIndex(); loadTextures(); // Clear the screen. set_scoreboard_score_text(""); set_scoreboard_score_text(""); set_scoreboard_team_text(""); set_scoreboard_currency_text(""); set_scoreboard_title_text(LOAD_MSG); integer StartLink = llGetLinkNumber() + 1; // Configure the board. integer i = 0; // set_scoreboard_score_text("THIS IS A TEST 123"); } link_message(integer sender_num, integer num, string str, key id) { if (num==SLOODLE_CHANNEL_SCOREBOARD_UPDATE_COMPLETE){ list lines = llParseString2List(str, ["\n"], []); list status = llParseString2List(llList2String(lines,1), ["|"], []); //status|page_num|num_page|scoreboard_name|team|currency integer pageNum = llList2Integer(status,1); integer numPages = llList2Integer(status,2); string scoreboardName= llList2String(status,3); string teamName= llList2String(status,4); string currency= llList2String(status,5); list users; integer numLines = llGetListLength(lines); debug("****************numLines: "+(string)numLines); integer numUsers= llGetListLength(lines)-2; integer i=0; list scores; string scoreboardText=""; //the first two lines are our status and info lines //the remaining lines is our userdata for (i=2;i