// ╔══════════════════════════════════ // ║ IMAGE UNPC ASSEMBLER — Self-Building NPC Machine // ║ Drop into a fresh 4-prim linkset, touch root to build. // ║ Script self-deletes after successful build. // ║ Built from OXP source with full per-face fidelity. // ║ OpenSim 0.9.2.1 Yeti / Mono / XEngine / BulletSim / OSSL // ║ Engine: IMAGE — Dirty Helga & Spax Orion // ╚═══════════════════════════════════ // ┌─────────────────────────────┐ // │ INSTRUCTIONS │ // │ 1. Rez 4 default cube prims │ // │ 2. Link them (last selected = root) │ // │ 3. Drop this script into the root prim │ // │ 4. Touch the linkset │ // │ 5. Script builds the machine, then self-deletes │ // │ 6. Drop in standing poses + Image-NPC-Machine.lsl in root prim │ // │ │ // │ Final layout: │ // │ Link 1: IMAGE-NPC-Machine (root, model stand) │ // │ Link 2: NPC sorter (yellow marker) │ // │ Link 3: NPC Gen (red marker) │ // │ Link 4: NPC Mgr (cyan marker) │ // └──────────────────────────────┘ // ─── LINK 1: IMAGE-NPC-Machine (root) ─────────────────────────────── buildLink1Root() { // Geometry: tapered cylinder, scale <0.572, 1.584, 0.101> llSetLinkPrimitiveParamsFast(1, [ PRIM_NAME, "IMAGE-NPC-Machine", PRIM_DESC, "Unified NPC Creation, Sorting and Management", PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_DEFAULT, <0.0, 1.0, 0.0>, // profile cut 0.0, // hollow <0.0, 0.0, 0.0>, // twist <0.85, 0.85, 0.0>, // top size (path scale) <0.0, 0.0, 0.0>, // top shear PRIM_SIZE, <0.5724607, 1.5837040, 0.1013823>, PRIM_MATERIAL, PRIM_MATERIAL_WOOD ]); // ── Face 0: gray, bump 4 (Bricks), shiny LOW, repeats 3x1, rot 90° ── llSetLinkPrimitiveParamsFast(1, [ PRIM_COLOR, 0, <0.2275, 0.2275, 0.2275>, 1.0, PRIM_BUMP_SHINY, 0, PRIM_SHINY_LOW, 4, PRIM_FULLBRIGHT, 0, FALSE, PRIM_GLOW, 0, 0.0, PRIM_TEXTURE, 0, TEXTURE_BLANK, <3.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 1.5707963, PRIM_TEXGEN, 0, PRIM_TEXGEN_DEFAULT ]); // ── Face 1: black, bump 1 (Brightness), no shine, repeats 3.01x4.36 planar ── llSetLinkPrimitiveParamsFast(1, [ PRIM_COLOR, 1, <0.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 1, PRIM_SHINY_NONE, 1, PRIM_FULLBRIGHT, 1, FALSE, PRIM_GLOW, 1, 0.0, PRIM_TEXTURE, 1, TEXTURE_BLANK, <3.0118, 4.3576, 0.0>, <0.0, 0.0500, 0.0>, 0.0, PRIM_TEXGEN, 1, PRIM_TEXGEN_PLANAR ]); // ── Face 2: dark green, bump 12 (Concrete), shiny LOW, planar ── llSetLinkPrimitiveParamsFast(1, [ PRIM_COLOR, 2, <0.0, 0.2118, 0.0>, 1.0, PRIM_BUMP_SHINY, 2, PRIM_SHINY_LOW, 12, PRIM_FULLBRIGHT, 2, FALSE, PRIM_GLOW, 2, 0.0, PRIM_TEXTURE, 2, TEXTURE_BLANK, <2.5, 2.5, 0.0>, <0.0, 0.0500, 0.0>, 0.0, PRIM_TEXGEN, 2, PRIM_TEXGEN_PLANAR ]); // ── Face 3: black, bump 1, no shine, planar ── llSetLinkPrimitiveParamsFast(1, [ PRIM_COLOR, 3, <0.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 3, PRIM_SHINY_NONE, 1, PRIM_FULLBRIGHT, 3, FALSE, PRIM_GLOW, 3, 0.0, PRIM_TEXTURE, 3, TEXTURE_BLANK, <3.0118, 4.3576, 0.0>, <0.0, 0.0500, 0.0>, 0.0, PRIM_TEXGEN, 3, PRIM_TEXGEN_PLANAR ]); // ── Face 4: black, bump 1, no shine, planar (different repeats) ── llSetLinkPrimitiveParamsFast(1, [ PRIM_COLOR, 4, <0.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 4, PRIM_SHINY_NONE, 1, PRIM_FULLBRIGHT, 4, FALSE, PRIM_GLOW, 4, 0.0, PRIM_TEXTURE, 4, TEXTURE_BLANK, <0.3306, 1.5166, 0.0>, <0.0, 0.1500, 0.0>, 0.0, PRIM_TEXGEN, 4, PRIM_TEXGEN_PLANAR ]); // ── Face 5: black, bump 1, no shine, default ── llSetLinkPrimitiveParamsFast(1, [ PRIM_COLOR, 5, <0.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 5, PRIM_SHINY_NONE, 1, PRIM_FULLBRIGHT, 5, FALSE, PRIM_GLOW, 5, 0.0, PRIM_TEXTURE, 5, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 5, PRIM_TEXGEN_DEFAULT ]); } // ─── LINK 2: NPC sorter ───────────────────────────────────────────── buildLink2Sorter() { // Geometry: cylinder with circular hole, hollow 0.30 llSetLinkPrimitiveParamsFast(2, [ PRIM_NAME, "NPC sorter", PRIM_DESC, "Sorter prim — touch for NPC preview menu", PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_CIRCLE, <0.0, 1.0, 0.0>, // profile cut 0.30, // hollow <0.0, 0.0, 0.0>, // twist <1.2, 1.2, 0.0>, // top size <0.0, 0.0, 0.0>, // top shear PRIM_SIZE, <0.3780626, 0.3780626, 0.0239355>, PRIM_POS_LOCAL, <-0.0074071, 0.0052611, 0.0511575>, PRIM_ROT_LOCAL, <0.0, 1.0, 0.0, 0.0>, PRIM_MATERIAL, PRIM_MATERIAL_WOOD ]); // ── Face 0: black, 0.5 ── llSetLinkPrimitiveParamsFast(2, [ PRIM_COLOR, 0, <0.0, 0.0, 0.0>, 0.5020, PRIM_BUMP_SHINY, 0, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 0, FALSE, PRIM_GLOW, 0, 0.0, PRIM_TEXTURE, 0, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 0, PRIM_TEXGEN_DEFAULT ]); // ── Face 1: black, opaque ── llSetLinkPrimitiveParamsFast(2, [ PRIM_COLOR, 1, <0.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 1, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 1, FALSE, PRIM_GLOW, 1, 0.0, PRIM_TEXTURE, 1, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 1, PRIM_TEXGEN_DEFAULT ]); // ── Face 2: black, 0.5 ── llSetLinkPrimitiveParamsFast(2, [ PRIM_COLOR, 2, <0.0, 0.0, 0.0>, 0.5020, PRIM_BUMP_SHINY, 2, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 2, FALSE, PRIM_GLOW, 2, 0.0, PRIM_TEXTURE, 2, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 2, PRIM_TEXGEN_DEFAULT ]); // ── Face 3: YELLOW marker, bump 10 (Tile), shiny LOW ── llSetLinkPrimitiveParamsFast(2, [ PRIM_COLOR, 3, <1.0, 1.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 3, PRIM_SHINY_LOW, 10, PRIM_FULLBRIGHT, 3, FALSE, PRIM_GLOW, 3, 0.0, PRIM_TEXTURE, 3, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 3, PRIM_TEXGEN_DEFAULT ]); } // ─── LINK 3: NPC Gen ──────────────────────────────────────────────── buildLink3Gen() { // Geometry: cylinder with circular hole, hollow 0.35 llSetLinkPrimitiveParamsFast(3, [ PRIM_NAME, "NPC Gen", PRIM_DESC, "Generator prim — touch to snapshot appearance", PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_CIRCLE, <0.0, 1.0, 0.0>, // profile cut 0.35, // hollow <0.0, 0.0, 0.0>, // twist <1.2, 1.2, 0.0>, // top size <0.0, 0.0, 0.0>, // top shear PRIM_SIZE, <0.25, 0.25, 0.0239355>, PRIM_POS_LOCAL, <-0.0074071, 0.4243050, 0.0509470>, PRIM_ROT_LOCAL, <0.0, 1.0, 0.0, 0.0>, PRIM_MATERIAL, PRIM_MATERIAL_WOOD ]); // ── Face 0: black, 0.5 ── llSetLinkPrimitiveParamsFast(3, [ PRIM_COLOR, 0, <0.0, 0.0, 0.0>, 0.5020, PRIM_BUMP_SHINY, 0, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 0, FALSE, PRIM_GLOW, 0, 0.0, PRIM_TEXTURE, 0, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 0, PRIM_TEXGEN_DEFAULT ]); // ── Face 1: black, opaque ── llSetLinkPrimitiveParamsFast(3, [ PRIM_COLOR, 1, <0.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 1, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 1, FALSE, PRIM_GLOW, 1, 0.0, PRIM_TEXTURE, 1, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 1, PRIM_TEXGEN_DEFAULT ]); // ── Face 2: black, 0.5 ── llSetLinkPrimitiveParamsFast(3, [ PRIM_COLOR, 2, <0.0, 0.0, 0.0>, 0.5020, PRIM_BUMP_SHINY, 2, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 2, FALSE, PRIM_GLOW, 2, 0.0, PRIM_TEXTURE, 2, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 2, PRIM_TEXGEN_DEFAULT ]); // ── Face 3: RED marker, bump 10 (Tile), shiny LOW ── llSetLinkPrimitiveParamsFast(3, [ PRIM_COLOR, 3, <1.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 3, PRIM_SHINY_LOW, 10, PRIM_FULLBRIGHT, 3, FALSE, PRIM_GLOW, 3, 0.0, PRIM_TEXTURE, 3, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 3, PRIM_TEXGEN_DEFAULT ]); } // ─── LINK 4: NPC Mgr ──────────────────────────────────────────────── buildLink4Mgr() { // Geometry: cylinder with circular hole, hollow 0.35 llSetLinkPrimitiveParamsFast(4, [ PRIM_NAME, "NPC Mgr", PRIM_DESC, "Manager prim — touch for region NPC kill menu", PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_CIRCLE, <0.0, 1.0, 0.0>, // profile cut 0.35, // hollow <0.0, 0.0, 0.0>, // twist <1.2, 1.2, 0.0>, // top size <0.0, 0.0, 0.0>, // top shear PRIM_SIZE, <0.25, 0.25, 0.0239355>, PRIM_POS_LOCAL, <-0.0074071, -0.4091220, 0.0511575>, PRIM_ROT_LOCAL, <0.0, 1.0, 0.0, 0.0>, PRIM_MATERIAL, PRIM_MATERIAL_WOOD ]); // ── Face 0: black, 0.5 ── llSetLinkPrimitiveParamsFast(4, [ PRIM_COLOR, 0, <0.0, 0.0, 0.0>, 0.5020, PRIM_BUMP_SHINY, 0, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 0, FALSE, PRIM_GLOW, 0, 0.0, PRIM_TEXTURE, 0, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 0, PRIM_TEXGEN_DEFAULT ]); // ── Face 1: black, opaque ── llSetLinkPrimitiveParamsFast(4, [ PRIM_COLOR, 1, <0.0, 0.0, 0.0>, 1.0, PRIM_BUMP_SHINY, 1, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 1, FALSE, PRIM_GLOW, 1, 0.0, PRIM_TEXTURE, 1, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 1, PRIM_TEXGEN_DEFAULT ]); // ── Face 2: black, 0.5 ── llSetLinkPrimitiveParamsFast(4, [ PRIM_COLOR, 2, <0.0, 0.0, 0.0>, 0.5020, PRIM_BUMP_SHINY, 2, PRIM_SHINY_NONE, 0, PRIM_FULLBRIGHT, 2, FALSE, PRIM_GLOW, 2, 0.0, PRIM_TEXTURE, 2, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 2, PRIM_TEXGEN_DEFAULT ]); // ── Face 3: CYAN marker, bump 10 (Tile), shiny LOW ── llSetLinkPrimitiveParamsFast(4, [ PRIM_COLOR, 3, <0.0, 0.5020, 1.0>, 1.0, PRIM_BUMP_SHINY, 3, PRIM_SHINY_LOW, 10, PRIM_FULLBRIGHT, 3, FALSE, PRIM_GLOW, 3, 0.0, PRIM_TEXTURE, 3, TEXTURE_BLANK, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0, PRIM_TEXGEN, 3, PRIM_TEXGEN_DEFAULT ]); } default { state_entry() { llOwnerSay("Image-NPC-Machine Assembler ready. Touch to build."); llSetObjectName("Image-NPC-Machine Assembler"); } touch_start(integer num) { if (llDetectedKey(0) != llGetOwner()) return; // verify we have 4 prims integer count = llGetNumberOfPrims(); if (count != 4) { llOwnerSay("ERROR: Expected 4 prims, found " + (string)count + ". Aborting."); return; } llOwnerSay("Building Image-NPC-Machine..."); buildLink1Root(); buildLink2Sorter(); buildLink3Gen(); buildLink4Mgr(); // set linkset name llSetObjectName("Image-NPC-Machine"); llSetObjectDesc("IMAGE NPC modeling machine"); llOwnerSay("Build complete. Drop in the Image-NPC-Machine unified script."); llOwnerSay("Self-deleting in 3 seconds..."); llSleep(3.0); llRemoveInventory(llGetScriptName()); } }