Guest User

Перенос карты

a guest
Jan 30th, 2014
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.53 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. AttachObjectToObjectEx(objectid, attachoid, Float:off_x, Float:off_y, Float:off_z, Float:rot_x, Float:rot_y, Float:rot_z)
  4. //Автор: Stylock | http://forum.sa-mp.com/showpost.php?p=1921308&postcount=3262
  5. {
  6.     static
  7.         Float:sin[3],
  8.         Float:cos[3],
  9.         Float:pos[3],
  10.         Float:rot[3];
  11.     GetObjectPos(attachoid, pos[0], pos[1], pos[2]);
  12.     GetObjectRot(attachoid, rot[0], rot[1], rot[2]);
  13.     cos[0] = floatcos(rot[0], degrees); cos[1] = floatcos(rot[1], degrees); cos[2] = floatcos(rot[2], degrees); sin[0] = floatsin(rot[0], degrees); sin[1] = floatsin(rot[1], degrees); sin[2] = floatsin(rot[2], degrees);
  14.     pos[0] = pos[0] + off_x * cos[1] * cos[2] - off_x * sin[0] * sin[1] * sin[2] - off_y * cos[0] * sin[2] + off_z * sin[1] * cos[2] + off_z * sin[0] * cos[1] * sin[2];
  15.     pos[1] = pos[1] + off_x * cos[1] * sin[2] + off_x * sin[0] * sin[1] * cos[2] + off_y * cos[0] * cos[2] + off_z * sin[1] * sin[2] - off_z * sin[0] * cos[1] * cos[2];
  16.     pos[2] = pos[2] - off_x * cos[0] * sin[1] + off_y * sin[0] + off_z * cos[0] * cos[1];
  17.     rot[0] = asin(cos[0] * cos[1]); rot[1] = atan2(sin[0], cos[0] * sin[1]) + rot_z; rot[2] = atan2(cos[1] * cos[2] * sin[0] - sin[1] * sin[2], cos[2] * sin[1] - cos[1] * sin[0] * -sin[2]);
  18.     cos[0] = floatcos(rot[0], degrees); cos[1] = floatcos(rot[1], degrees); cos[2] = floatcos(rot[2], degrees); sin[0] = floatsin(rot[0], degrees); sin[1] = floatsin(rot[1], degrees); sin[2] = floatsin(rot[2], degrees);
  19.     rot[0] = asin(cos[0] * sin[1]); rot[1] = atan2(cos[0] * cos[1], sin[0]); rot[2] = atan2(cos[2] * sin[0] * sin[1] - cos[1] * sin[2], cos[1] * cos[2] + sin[0] * sin[1] * sin[2]);
  20.     cos[0] = floatcos(rot[0], degrees); cos[1] = floatcos(rot[1], degrees); cos[2] = floatcos(rot[2], degrees); sin[0] = floatsin(rot[0], degrees); sin[1] = floatsin(rot[1], degrees); sin[2] = floatsin(rot[2], degrees);
  21.     rot[0] = atan2(sin[0], cos[0] * cos[1]) + rot_x; rot[1] = asin(cos[0] * sin[1]); rot[2] = atan2(cos[2] * sin[0] * sin[1] + cos[1] * sin[2], cos[1] * cos[2] - sin[0] * sin[1] * sin[2]);
  22.     cos[0] = floatcos(rot[0], degrees); cos[1] = floatcos(rot[1], degrees); cos[2] = floatcos(rot[2], degrees); sin[0] = floatsin(rot[0], degrees); sin[1] = floatsin(rot[1], degrees); sin[2] = floatsin(rot[2], degrees);
  23.     rot[0] = asin(cos[1] * sin[0]); rot[1] = atan2(sin[1], cos[0] * cos[1]) + rot_y; rot[2] = atan2(cos[0] * sin[2] - cos[2] * sin[0] * sin[1], cos[0] * cos[2] + sin[0] * sin[1] * sin[2]);
  24.     SetObjectPos(objectid, pos[0], pos[1], pos[2]);
  25.     SetObjectRot(objectid, rot[0], rot[1], rot[2]);
  26. }
  27.  
  28. new W_K,
  29.     W_id[MAX_OBJECTS],
  30.     W_m[MAX_OBJECTS],
  31.     Float:W_x[MAX_OBJECTS],
  32.     Float:W_y[MAX_OBJECTS],
  33.     Float:W_z[MAX_OBJECTS],
  34.     Float:W_rx[MAX_OBJECTS],
  35.     Float:W_ry[MAX_OBJECTS],
  36.     Float:W_rz[MAX_OBJECTS],
  37.     Float:W_d[MAX_OBJECTS];
  38.  
  39. CreateObjectEx(m, Float:x=0.0, Float:y=0.0, Float:z=0.0, Float:rx=0.0, Float:ry=0.0, Float:rz=0.0, Float:d=300.0)
  40. //Ищет координаты относительно основного объекта.
  41. {
  42.     if(W_K == 0)
  43.     {
  44.         m=18980;
  45.         W_x[0]=x;
  46.         W_y[0]=y;
  47.         W_z[0]=z;
  48.         rx=0.001;//фикс погрешности float 0.9999999999
  49.         ry=0.0;
  50.         rz=0.0;
  51.     }
  52.     else
  53.     {
  54.         W_x[W_K]=x-W_x[0];
  55.         W_y[W_K]=y-W_y[0];
  56.         W_z[W_K]=z-W_z[0];
  57.         rx+=0.001;
  58.     }
  59.     W_m[W_K]=m;
  60.     W_d[W_K]=d;
  61.     W_rx[W_K]=rx;
  62.     W_ry[W_K]=ry;
  63.     W_rz[W_K]=rz;
  64.     m=W_id[W_K++]=CreateObject(m, x, y, z, rx, ry, rz, d);
  65.     return m;
  66. }
  67.  
  68. public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
  69. {
  70.     if(!IsValidObject(objectid)) return 0;//Объекта не смуществует - выйдем.
  71.     if(playerobject)return 0; //объект не глобальный - выйдем.
  72.     if(response == EDIT_RESPONSE_UPDATE)return 0;//Игрок подвинул объект - выйдем.
  73.     else if(response == EDIT_RESPONSE_FINAL)
  74.     {
  75.         //Сохраним координаты
  76.         W_x[0]=fX;
  77.         W_y[0]=fY;
  78.         W_z[0]=fZ;
  79.         W_rx[0]=fRotX;
  80.         W_ry[0]=fRotY;
  81.         W_rz[0]=fRotZ;
  82.         SetObjectPos(objectid, fX, fY, fZ);//Установим перемещение
  83.         SetObjectRot(objectid, fRotX, fRotY, fRotZ);//Установим поворот
  84.     }
  85.     else if(response == EDIT_RESPONSE_CANCEL)
  86.     {
  87.         SetObjectPos(objectid, W_x[0],  W_y[0], W_z[0]);//Отменим премещение
  88.         SetObjectRot(objectid, W_rx[0], W_ry[0],W_rz[0]);//Отменим поворот
  89.     }
  90.     for(new k=1; k < MAX_OBJECTS; k++)if(W_id[k])//Прогон по всем объектам.
  91.     {
  92.         AttachObjectToObject(W_id[k], W_id[k],0.0,0.0, 0.0, 0.0, 0.0, 0.0);//Отцепим объект.
  93.         AttachObjectToObjectEx(W_id[k], W_id[0], W_x[k], W_y[k], W_z[k], W_rx[k], W_ry[k], W_rz[k]);//Установим позицию и ротацию как при склеивании.
  94.     }
  95.     return 1;
  96. }
  97.  
  98. public OnPlayerCommandText(playerid, cmdtext[])
  99. {
  100.     if(strcmp(cmdtext, "/edit", true)==0)
  101.     {
  102.         for(new k=1; k < MAX_OBJECTS; k++)if(W_id[k])
  103.         AttachObjectToObject(W_id[k], W_id[0], W_x[k], W_y[k], W_z[k], W_rx[k], W_ry[k], W_rz[k]);//Приатачим все объекты к основному.
  104.         return EditObject(playerid,W_id[0]);//Войдём в режим редактирования.
  105.     }
  106.     if(strcmp(cmdtext, "/saveo", true)==0)
  107.     {
  108.         if(fexist("MovedObject.pwn"))fremove("MovedObject.pwn");//Удалим файл если он есть.
  109.         new File:example=fopen("MovedObject.pwn", io_append);//Создадим файл и откроем для записи.
  110.         if(example)//Если нет ошибок.
  111.         {
  112.             new str[128],Float:x=0.0, Float:y=0.0, Float:z=0.0, Float:rx=0.0, Float:ry=0.0, Float:rz=0.0;
  113.             for(new k=1; k < MAX_OBJECTS; k++)if(W_id[k])//Бежим по всем объектам.
  114.             {
  115.                 GetObjectPos(W_id[k], x,y,z);//Получим координаты.
  116.                 GetObjectRot(W_id[k], rx,ry,rz);//Получим ротацию.
  117.                 format(str,sizeof(str),"CreateObject(%d, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f);\r\n",W_m[k],x,y,z,rx,ry,rz,W_d[k]);
  118.                 fwrite(example, str);//Запишем строку.
  119.             }
  120.             fclose(example);//Закроем файл.
  121.         }
  122.         else return SendClientMessage(playerid,0xFF4444FF,"Файл не создан!");
  123.         return SendClientMessage(playerid,0xFF4444FF,"Объекты сохранены. srv/scriptfiles/MovedObject.pwn");
  124.     }
  125.     return 0;//Команнды небыли выполнены, бежим дальше.
  126. }
  127.  
  128. public OnFilterScriptExit()
  129. {
  130.     for(new k; k < MAX_OBJECTS; k++)if(W_id[k])DestroyObject(W_id[k]),W_id[k]=0;//Удалим все созданные объекты
  131.     return 1;
  132. }
  133. public OnFilterScriptInit()
  134. {
  135. /*============================================================================*\
  136.                         Системный объект!1!11!!!!1!
  137. \*============================================================================*/
  138.     //Можно изменить только координаты.
  139.     //Координаты дожны быть по середине группы объектов.
  140.     CreateObjectEx(18980,   2048.0,1336.0,10.0); //Основной объект.
  141. /*============================================================================*\
  142.                         Дальше вписываем ваши объекты
  143. \*============================================================================*/
  144.     CreateObjectEx(19057,2052.0,1340.0,10.0,45.0,-45.0,353.4901); //
  145.     CreateObjectEx(19057,2044.0,1340.0,10.0,45.0,45.0,5.3968); //
  146.     CreateObjectEx(19057,2044.0,1332.0,10.0,45.0,-45.0,178.9618); //
  147.     CreateObjectEx(19057,2052.0,1332.0,10.0,45.0,45.0,193.3753); //
  148.     return 1;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment