Advertisement
worstbull

Turret

Nov 1st, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Offsets und Werte der Child-Prims (Aufbau):
  2. integer iLinknumberPart1 = 2;
  3. vector vOffsetAvatar = <0.0, 0.0, 0.5>; //Avatar-Offset.
  4. integer iLinknumberPart2 = 3;
  5. float fWinkelMinimum = -30.0; //° Grad.
  6. float fWinkelMaximum = 45.0; //° Grad.
  7. rotation rRotationDefault1 = <0.0, 0.0, 0.0, 0.0>; //Ausgangsstellung
  8. rotation rRotationDefault2 = <0.0, 0.0, 0.0, 0.0>;
  9.  
  10.  
  11. float fSCAN_INTERVAL = 0.2; //Scannt alle 0.2 Sekunden nach dem nächsten Avatar.
  12. float fSCAN_RANGE = 5.0; //Sucht im Radius von 10 Metern nach Avataren.
  13. key scan()
  14. { //Scannt nach dem nächsten Avatar und gibt dessen UUID zurück, andernfalls NULL_KEY.
  15.     integer iCounter = 0;
  16.     vector vPosition;
  17.     float fDistance;
  18.     key kAvatar;
  19.     key kNearestAvatar = NULL_KEY;
  20.     float fNearestAvatarsDistance = fSCAN_RANGE; //Mit fSCAN_RANGE initialisieren für den Vergleich der Distanz.
  21.     list lAvatarsInRegion = llGetAgentList(AGENT_LIST_REGION, []);
  22.     integer iNumOfAvatars = llGetListLength(lAvatarsInRegion);
  23.     for (iCounter = 0; iCounter < iNumOfAvatars; iCounter++)
  24.     {
  25.         kAvatar = llList2Key(lAvatarsInRegion, iCounter);
  26.         vPosition = llList2Vector(llGetObjectDetails(kAvatar, [OBJECT_POS]), 0);
  27.         fDistance = llVecDist(llGetPos(), vPosition); //Distanz jedes Avatars.
  28.         if (fDistance < fNearestAvatarsDistance)
  29.         { //Dieser Avatar ist näher als alle anderen.
  30.             kNearestAvatar = kAvatar;
  31.             fNearestAvatarsDistance = fDistance; //Distanz und Avatar speichern.
  32.         }
  33.     }
  34.     return kNearestAvatar;
  35. }
  36.  
  37. start_scan()
  38. { //Starte Scan.
  39.     llSetTimerEvent(fSCAN_INTERVAL);
  40. }
  41.  
  42. stop_scan()
  43. { //Stoppe Scan.
  44.     llSetTimerEvent(0.0);
  45. }
  46.  
  47. integer iListIndexPos = 0;
  48. integer iListIndexRot = 1;
  49. list lGetRegionCoordsOfLinkPrim(integer iLinknumber)
  50. { //Erzeugt eine Liste mit Regions-Koordinaten und -Rotation des Childprims "iLinknumber".
  51.     list lReturn = [0,0]; //Liste für die Rückgabewerte.
  52.     //Lese lokale Koordinaten des Childprims aus.
  53.     vector vPosCHILDPRIM = llList2Vector(llGetLinkPrimitiveParams(iLinknumber, [PRIM_POS_LOCAL]), 0);
  54.     rotation rRotCHILDPRIM = llList2Rot(llGetLinkPrimitiveParams(iLinknumber, [PRIM_ROT_LOCAL]), 0);
  55.  
  56.     //Fall beachten, wenn iLinknumber das RootPrim ist.
  57.     if (iLinknumber <= 1)
  58.     {
  59.         vPosCHILDPRIM = ZERO_VECTOR;
  60.         rRotCHILDPRIM = ZERO_ROTATION;
  61.     }
  62.  
  63.     //Position und Rotation von Root-Prim auslesen.
  64.     vector vPosROOT = llGetRootPosition();
  65.     rotation rRotROOT = llGetRootRotation();
  66.  
  67.     //Konvertieren.
  68.     vector vRegionPosCHILDPRIM = vPosCHILDPRIM * rRotROOT + vPosROOT;
  69.     rotation rRegionRotCHILDPRIM = rRotCHILDPRIM * rRotROOT;
  70.  
  71.     //Rückgabeliste füllen und zurückgeben.
  72.     lReturn = llListReplaceList(lReturn, [vRegionPosCHILDPRIM], iListIndexPos, iListIndexPos);
  73.     lReturn = llListReplaceList(lReturn, [rRegionRotCHILDPRIM], iListIndexRot, iListIndexRot);
  74.  
  75.     return lReturn;
  76. }
  77.  
  78. aim(key kTarget)
  79. { //Ziele/schieße auf den Avatar kTarget.
  80.     vector vPosition;
  81.     vPosition = llList2Vector(llGetObjectDetails(kTarget, [OBJECT_POS]), 0) + vOffsetAvatar;
  82.     //Debug: //llSetText(llKey2Name(kTarget), <1.0, 1.0, 1.0>, 1.0);
  83.  
  84.     //Childprim 1:
  85.  
  86.     list lCoordsChildprim1 = lGetRegionCoordsOfLinkPrim(iLinknumberPart1); //Regionskoordinaten der Childprims ermitteln.
  87.     vector vRegionPosChildprim1 = llList2Vector(lCoordsChildprim1, iListIndexPos);
  88.     rotation rRegionRotChildprim1 = llList2Rot(lCoordsChildprim1, iListIndexRot);
  89.     //Debug: //llOwnerSay("Region coords: " + (string)vRegionPosChildprim1 + " / " + (string) rRegionRotChildprim1);
  90.  
  91.     //Target-Z-Position an die des Childprims anpassen:
  92.     vector vPosHelper = <vPosition.x, vPosition.y, vRegionPosChildprim1.z>;
  93.     //Neue Rotation von Childprim1 ausrechnen:
  94.     rotation rRotChildprim1 = llRotBetween( <1.0,0.0,0.0>, llVecNorm( vPosHelper - vRegionPosChildprim1 ) );
  95.     //Debug: //llOwnerSay((string)rRotChildprim1);
  96.  
  97.     llSetLinkPrimitiveParamsFast(iLinknumberPart1, [PRIM_ROT_LOCAL, rRotChildprim1]);
  98.  
  99.  
  100.     //Childprim 2:
  101.  
  102.     list lCoordsChildprim2 = lGetRegionCoordsOfLinkPrim(iLinknumberPart2); //Regionskoordinaten der Childprims ermitteln.
  103.     vector vRegionPosChildprim2 = llList2Vector(lCoordsChildprim2, iListIndexPos);
  104.     rotation rRegionRotChildprim2 = llList2Rot(lCoordsChildprim2, iListIndexRot);
  105.     //Debug: //llOwnerSay("Region coords: " + (string)vRegionPosChildprim2 + " / " + (string) rRegionRotChildprim2);
  106.  
  107.     //Target auf X-Achse projizieren für die weitere Berechnung:
  108.     vector vPosHelper_PointA1 = <vRegionPosChildprim2.x + llVecDist(<vPosition.x, vPosition.y, vRegionPosChildprim2.z>, vRegionPosChildprim2), vRegionPosChildprim2.y, vRegionPosChildprim2.z>;
  109.     vector vPosHelper_PointB1 = <vPosHelper_PointA1.x, vPosHelper_PointA1.y, vPosition.z>;
  110.     //Z-Winkel zwischen Childprim2 und Target ausrechnen:
  111.     vector vPosHelper_A = vPosHelper_PointA1 - vRegionPosChildprim2;
  112.     vector vPosHelper_B = vPosHelper_PointB1 - vRegionPosChildprim2;
  113.     float fAngle = llAtan2(llVecMag(vPosHelper_A % vPosHelper_B), vPosHelper_A * vPosHelper_B);
  114.     //Debug: //llOwnerSay((string)llAxisAngle2Rot(<1.0, 0.0, 0.0>, fAngle));return;
  115.  
  116.     //Herausfinden, ob der Winkel positiv oder negativ ist:
  117.     integer iPositiveAngle = TRUE;
  118.     if (vPosition.z < vRegionPosChildprim2.z)
  119.     { //Winkel ist negativ.
  120.         iPositiveAngle = FALSE;
  121.     }
  122.  
  123.     //Winkel umrechnen:
  124.     vector vDegrees = llRot2Euler(llAxisAngle2Rot(<-1.0, 0.0, 0.0>, fAngle)) * RAD_TO_DEG;
  125.     float fDegrees = vDegrees.x;
  126.     if (!iPositiveAngle)
  127.     {
  128.         fDegrees = -fDegrees;
  129.     }
  130.     //Minimum und Maximum anwenden.
  131.     if (fDegrees < fWinkelMinimum)
  132.     {
  133.         fDegrees = fWinkelMinimum;
  134.     }
  135.     if (fDegrees > fWinkelMaximum)
  136.     {
  137.         fDegrees = fWinkelMaximum;
  138.     }
  139.     //Debug: //llOwnerSay((string)fDegrees);
  140.  
  141.     //Target-Z-Position an die des Childprims anpassen:
  142.     vPosHelper = <vPosition.x, vPosition.y, vRegionPosChildprim2.z>;
  143.     //Neue Rotation von Childprim2 ausrechnen:
  144.     rotation rRotChildprim2 = llRotBetween( <1.0,0.0,0.0>, llVecNorm( vPosHelper - vRegionPosChildprim2 ) );
  145.     //Debug: //llOwnerSay((string)rRotChildprim2);
  146.  
  147.     llSetLinkPrimitiveParamsFast(iLinknumberPart2, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0, fDegrees, 0.0>*DEG_TO_RAD)*rRotChildprim2]);
  148. }
  149.  
  150. stop_aim()
  151. { //Kein Avatar in Reichweite, höre auf zu zielen.
  152.     //Debug: //llSetText("Niemand hier", <1.0, 1.0, 1.0>, 1.0);
  153.     llSetLinkPrimitiveParamsFast(iLinknumberPart1, [PRIM_ROT_LOCAL, rRotationDefault1]);
  154.     llSetLinkPrimitiveParamsFast(iLinknumberPart2, [PRIM_ROT_LOCAL, rRotationDefault2]);  
  155. }
  156.  
  157. fire()
  158. {
  159.     llWhisper(0, "Bam!");
  160. }
  161. default
  162. {
  163.     state_entry()
  164.     {
  165.         start_scan();
  166.     }
  167.  
  168.     timer()
  169.     {
  170.         key kAvatar = scan();
  171.         if (kAvatar != NULL_KEY)
  172.         { //Avatar gefunden.
  173.             aim(kAvatar); //Zielen
  174.             fire(); //Schießen.
  175.         }
  176.         else
  177.         {
  178.             stop_aim();
  179.         }
  180.     }
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement