toribio

toribio

May 15th, 2009
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 45.11 KB | None | 0 0
  1. /*
  2.  * ---- breadfishs object editor ----
  3.  * -- copyright (c) 2007 breadfish --
  4.  * ----- breadfish@breadfish.de -----
  5.  */
  6. #include <a_samp>
  7.  
  8. #pragma dynamic 8192
  9.  
  10. #define MAX_STRING 256
  11.  
  12. /* -- FARBEN -- */
  13. #define COLOR_RED 0xFF0000FF
  14. #define COLOR_YELLOW 0xFFFF00FF
  15. #define COLOR_GREEN 0x00FF00FF
  16. #define COLOR_WHITE 0xFFFFFFFF
  17. #define COLOR_BLUE 0x0000FFFF
  18.  
  19. /* -- LIMITS -- */
  20. //#define MAX_OBJECTS 150
  21.  
  22. /* -- OBJECT-EDITINGMODES -- */
  23. #define OED_NONE 0
  24. #define OED_MOVE 1
  25. #define OED_ROTATE 2
  26. #define OED_MOVE_XY 3
  27. #define OED_MOVE_Z 4
  28. #define OED_ROTATE_XY 5
  29. #define OED_ROTATE_Z 6
  30.  
  31. /* -- ACHSEN -- */
  32. #define AXIS_NONE 0
  33. #define AXIS_X 1
  34. #define AXIS_Y 2
  35. #define AXIS_Z 3
  36.  
  37. /* -- KEY FIXES -- */
  38. #undef KEY_UP
  39. #undef KEY_DOWN
  40. #undef KEY_LEFT
  41. #undef KEY_RIGHT
  42. #define KEY_UP 65408
  43. #define KEY_DOWN 128
  44. #define KEY_LEFT 65408
  45. #define KEY_RIGHT 128
  46.  
  47. /* -- VKEYS -- */
  48. #define VKEY_LEFT 32768
  49. #define VKEY_RIGHT 65536
  50. #define VKEY_UP 131072
  51. #define VKEY_DOWN 262144
  52.  
  53. /* -- MENUMODES -- */
  54. #define MM_SELECT_EDITMODE 1
  55. #define MM_SELECT_EDITMODE_DETACHONLY 2
  56. #define MM_SELECT_MULTIPLIER 3
  57. /* -- UMLAUTE FIX -- */
  58. #define fixchars(%1) for(new charfixloop=0;charfixloop<strlen(%1);charfixloop++)if(%1[charfixloop]<0)%1[charfixloop]+=256
  59.  
  60. /* -- FORWARDS -- */
  61. forward Float:strflt(string[]);
  62. forward Float:GetDistanceBetweenCoords(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2);
  63. forward Float:FloatBubbleSort(Float:lArray[MAX_OBJECTS][2], lArraySize);
  64. //Timer
  65. forward ObjectEditTimer(playerid, editmode, axis, Float:value);
  66. forward UpDownLeftRightAdditionTimer();
  67. forward SetObjectCoords(playerid, obj_id);
  68.  
  69. //objektdaten
  70. enum OBJECTDATA() {
  71.     ModelID,
  72.     Float:obj_x,
  73.     Float:obj_y,
  74.     Float:obj_z,
  75.     Float:rot_x,
  76.     Float:rot_y,
  77.     Float:rot_z,
  78.     Name[MAX_STRING],
  79.     bool:savetofile
  80. }
  81. //spielerdaten
  82. enum PLAYERDATA {
  83.     Name[25],
  84.     Level                                
  85. }
  86. //script-konfiguration
  87. enum SCRIPTDATA {
  88.     PLAYER_MAX_HOUSES,
  89.     PLAYER_MAX_JOBS,
  90.     CAR_STANDARD_TANKINHALT,
  91.     CAR_RESPAWN_DELAY,
  92.     PLAYER_DEFAULT_MONEY
  93. }
  94. //currently edited object
  95. enum EDITINGOBJECT {
  96.     object_id,
  97.     mode,
  98.     bool:domove,
  99.     Float:movestep,
  100.     Float:rotatestep,
  101.     Float:StickDistance,
  102.     Float:EditMultiplier,
  103.     bool:stuck
  104. }
  105.  
  106. //datenhaltung
  107. new gPlayer[MAX_PLAYERS][PLAYERDATA];   //player-infos
  108. new gObjects[150][OBJECTDATA];          //objekte
  109.  
  110. new gEditingObject[MAX_PLAYERS][EDITINGOBJECT];
  111. new gObjectEditTimer[MAX_PLAYERS];
  112. new gCameraSetTimer[MAX_PLAYERS];
  113. new gLastPlayerKeys[MAX_PLAYERS][2];
  114. new bool:gPlayerMenu[MAX_PLAYERS];
  115. new gSelectedMultiplier[MAX_PLAYERS];
  116. new Menu:gMenus[MAX_PLAYERS];
  117. new gMenuMode[MAX_PLAYERS];
  118. //limits
  119. new gObjectCount;
  120.  
  121. /*---------------------------------------------------------------------------------------------------*/
  122.  
  123. public OnFilterScriptInit() {
  124.     print("+---------------+");
  125.     print("| Object editor |");
  126.     print("|  Filterscript |");
  127.     print("|  by breadfish |");
  128.     print("+---------------+");
  129.  
  130.     ReadObjects();
  131.     SetTimer("UpDownLeftRightAdditionTimer", 50, 1);
  132.     return 1;
  133. }
  134.  
  135. /*---------------------------------------------------------------------------------------------------*/
  136.  
  137. public OnPlayerConnect(playerid) {
  138.     new name[25];
  139.  
  140.     if (!IsPlayerConnected(playerid)) return 0;
  141.    
  142.     GetPlayerName(playerid, name, sizeof name);
  143.  
  144.     //reset playerdata
  145.     gPlayer[playerid][Name] = name;
  146.     gSelectedMultiplier[playerid] = 3;
  147.    
  148.     return 1;
  149. }
  150.  
  151. /*---------------------------------------------------------------------------------------------------*/
  152.  
  153. public OnPlayerText(playerid, text[]) {
  154.     if (!IsPlayerConnected(playerid)) return 0;
  155.    
  156.     fixchars(text);
  157.     return 1;
  158. }
  159.  
  160. /*---------------------------------------------------------------------------------------------------*/
  161.  
  162. public OnPlayerCommandText(playerid, cmdtext[]) {
  163.     new cmd[MAX_STRING], idx;
  164.     new syntax[MAX_STRING];
  165.     new Float:x, Float:y, Float:z, Float:angle;
  166.     new msg[MAX_STRING];
  167.    
  168.     if (!IsPlayerConnected(playerid)) return 0;
  169.    
  170.     fixchars(cmdtext);
  171.    
  172.     //wird immer mal wieder gebraucht...
  173.     if (IsPlayerInAnyVehicle(playerid)) {
  174.         GetVehiclePos(GetPlayerVehicleID(playerid),x, y, z);
  175.         GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
  176.     } else {
  177.         GetPlayerPos(playerid, x, y, z);
  178.         GetPlayerFacingAngle(playerid, angle);
  179.     }
  180.    
  181.    
  182.     cmd = strtok(cmdtext, idx);
  183.    
  184.     if (IsPlayerAdmin(playerid)) {
  185.    
  186.         // objekte erzeugen
  187.         if (strcmp(cmd, "/oadd", true) == 0) {
  188.             new modelid, name[MAX_STRING], newoid;
  189.             syntax = "SYNTAX: /oadd [modelid] [name]";
  190.            
  191.             //modelid
  192.             cmd = strtok(cmdtext, idx);
  193.             if (!(strlen(cmd))) {
  194.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  195.                 return 1;
  196.             } else {
  197.                 modelid = strval(cmd);
  198.             }
  199.            
  200.             //name
  201.             cmd = strtok(cmdtext, idx);
  202.             if (!(strlen(cmd))) {
  203.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  204.                 return 1;
  205.             } else {
  206.                 name = cmd;
  207.             }
  208.            
  209.             if (!(gCameraSetTimer[playerid] == 0)) {
  210.                 KillTimer(gCameraSetTimer[playerid]);
  211.                 gCameraSetTimer[playerid] = 0;
  212.                 SetCameraBehindPlayer(playerid);
  213.             }
  214.            
  215.             TogglePlayerControllable(playerid, 1);
  216.            
  217.             newoid = AddNewObjectToScript(modelid, x, y + 2, z, 0, 0, 0, name);
  218.             gEditingObject[playerid][object_id] = newoid;
  219.             if (gEditingObject[playerid][mode] == OED_NONE) gEditingObject[playerid][mode] = OED_MOVE_XY;
  220.             gEditingObject[playerid][movestep] = 0.05;
  221.             gEditingObject[playerid][rotatestep] = 1.0;
  222.             gObjects[newoid][savetofile] = true;
  223.             if (gEditingObject[playerid][EditMultiplier] == 0) gEditingObject[playerid][EditMultiplier] = 1;
  224.            
  225.             SaveObjects();
  226.            
  227.             format(msg, sizeof msg, "Objekt: '%s' ModelID: %d ObjectID: %d", name, gObjects[newoid][ModelID], newoid);
  228.             SystemMessage(playerid, msg, COLOR_GREEN);
  229.            
  230.             return 1;
  231.         }
  232.        
  233.         // objekte kopieren
  234.         if (strcmp(cmd, "/ocopy", true) == 0) {
  235.             new name[MAX_STRING], newoid;
  236.             new Float:rx, Float:ry, Float:rz;
  237.             syntax = "SYNTAX: /ocopy [name]";
  238.            
  239.             //name
  240.             cmd = strtok(cmdtext, idx);
  241.             if (!(strlen(cmd))) {
  242.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  243.                 return 1;
  244.             } else {
  245.                 name = cmd;
  246.             }
  247.            
  248.             if (!(gCameraSetTimer[playerid] == 0)) {
  249.                 KillTimer(gCameraSetTimer[playerid]);
  250.                 gCameraSetTimer[playerid] = 0;
  251.                 SetCameraBehindPlayer(playerid);
  252.             }
  253.            
  254.             x = gObjects[gEditingObject[playerid][object_id]][obj_x];
  255.             y = gObjects[gEditingObject[playerid][object_id]][obj_y];
  256.             z = gObjects[gEditingObject[playerid][object_id]][obj_z];
  257.             rx = gObjects[gEditingObject[playerid][object_id]][rot_x];
  258.             ry = gObjects[gEditingObject[playerid][object_id]][rot_y];
  259.             rz = gObjects[gEditingObject[playerid][object_id]][rot_z];
  260.            
  261.             newoid = AddNewObjectToScript(gObjects[gEditingObject[playerid][object_id]][ModelID], x, y, z, rx, ry, rz, name);
  262.             gEditingObject[playerid][object_id] = newoid;
  263.             if (gEditingObject[playerid][mode] == OED_NONE) gEditingObject[playerid][mode] = OED_MOVE_XY;
  264.             gEditingObject[playerid][movestep] = 0.05;
  265.             gEditingObject[playerid][rotatestep] = 1.0;
  266.             gObjects[newoid][savetofile] = true;
  267.             if (gEditingObject[playerid][EditMultiplier] == 0) gEditingObject[playerid][EditMultiplier] = 1;
  268.            
  269.             SaveObjects();
  270.            
  271.             format(msg, sizeof msg, "Created copy: '%s' ModelID: %d ObjectID: %d", name, gObjects[newoid][ModelID], newoid);
  272.             SystemMessage(playerid, msg, COLOR_GREEN);
  273.            
  274.             return 1;
  275.         }
  276.        
  277.         // objekt lschen
  278.         if (strcmp(cmd, "/odel", true) == 0) {
  279.             if (!(gEditingObject[playerid][object_id] == 0)) {
  280.                 new oid = gEditingObject[playerid][object_id];
  281.                 new empty[MAX_STRING];
  282.                
  283.                 DestroyObject(oid);
  284.                 gObjects[oid][savetofile] = false;
  285.                 gEditingObject[playerid][object_id] = 0;
  286.                 gObjects[oid][Name] = empty;
  287.                 gObjectCount--;
  288.                
  289.                 if (!(gCameraSetTimer[playerid] == 0)) {
  290.                     KillTimer(gCameraSetTimer[playerid]);
  291.                     gCameraSetTimer[playerid] = 0;
  292.                     SetCameraBehindPlayer(playerid);
  293.                 }
  294.                
  295.                 SaveObjects();
  296.                 TogglePlayerControllable(playerid, 1);
  297.                
  298.                 format(msg, sizeof msg, "Objekt '%s' (ModelID:%d ObjectID:%d) deleted",  gObjects[oid][Name], gObjects[oid][ModelID], oid);
  299.                 SystemMessage(playerid, msg, COLOR_GREEN);
  300.             } else {
  301.                 SystemMessage(playerid, "No object selected", COLOR_YELLOW);
  302.             }
  303.             return 1;
  304.         }
  305.        
  306.         // bearbeitungsmodus setzen
  307.         if (strcmp(cmd, "/omode", true) == 0) {
  308.             if (!(gEditingObject[playerid][object_id] == 0)) {
  309.                 new newmode;
  310.                 syntax = "SYNTAX: /omode [m_xy|m_z|r_xy|r_z]";
  311.                
  312.                 //mode
  313.                 cmd = strtok(cmdtext, idx);
  314.                 if (!(strlen(cmd))) {
  315.                     SystemMessage(playerid, syntax, COLOR_YELLOW);
  316.                     return 1;
  317.                 } else {
  318.                     if (strcmp(cmd, "m_xy", true) == 0) newmode = OED_MOVE_XY;
  319.                     if (strcmp(cmd, "m_z", true) == 0) newmode = OED_MOVE_Z;
  320.                     if (strcmp(cmd, "r_xy", true) == 0) newmode = OED_ROTATE_XY;
  321.                     if (strcmp(cmd, "r_z", true) == 0) newmode = OED_ROTATE_Z;
  322.                 }
  323.                
  324.                 if (!(newmode == 0)) {
  325.                     gEditingObject[playerid][mode] = newmode;
  326.                
  327.                     SystemMessage(playerid, "New edit-mode set", COLOR_GREEN);
  328.                     return 1;
  329.                 } else {
  330.                     SystemMessage(playerid, syntax, COLOR_YELLOW);
  331.                     return 1;
  332.                 }
  333.             } else {
  334.                 SystemMessage(playerid, "No object selected", COLOR_YELLOW);
  335.             }
  336.         }
  337.        
  338.         // objekte in der umgebung zeigen
  339.         if (strcmp(cmd, "/onext", true) == 0) {
  340.             new objects[24], oid, objnames[MAX_STRING];
  341.             objects = GetPlayerNearestObjects(playerid);
  342.            
  343.             for (new i=1;(i<=gObjectCount) && (i<24);i++) {
  344.                 oid = objects[i];
  345.                
  346.                 strcat(objnames, gObjects[oid][Name]);
  347.                 strcat(objnames, ", ");
  348.             }
  349.            
  350.             if (strlen(objnames)) {
  351.                 strmid(objnames, objnames, 0, strlen(objnames) - 2);
  352.             }
  353.            
  354.             format(objnames, sizeof objnames, "Nearest objects: %s", objnames);
  355.             SystemMessage(playerid, objnames, COLOR_YELLOW);
  356.             return 1;
  357.         }
  358.        
  359.         //objekt zum bearbeiten auswhlen
  360.         if (strcmp(cmd, "/osel", true) == 0) {
  361.             new name[MAX_STRING], oid;
  362.             syntax = "SYNTAX: /osel [Objektname]";
  363.            
  364.             //name
  365.             cmd = strtok(cmdtext, idx);
  366.             if (!(strlen(cmd))) {
  367.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  368.                 return 1;
  369.             } else {
  370.                 name = cmd;
  371.             }
  372.            
  373.             for (new i=1;i<=gObjectCount;i++) {
  374.                 if (strcmp(gObjects[i][Name], name, true) == 0) {
  375.                     oid = i;
  376.                     break;
  377.                 }
  378.             }
  379.            
  380.             if (oid) {
  381.                 if (!(gCameraSetTimer[playerid] == 0)) {
  382.                     KillTimer(gCameraSetTimer[playerid]);
  383.                     gCameraSetTimer[playerid] = 0;
  384.                     SetCameraBehindPlayer(playerid);
  385.                 }
  386.            
  387.                 gEditingObject[playerid][object_id] = oid;
  388.                 if (gEditingObject[playerid][mode] == OED_NONE) gEditingObject[playerid][mode] = OED_MOVE_XY;
  389.                 gEditingObject[playerid][movestep] = 0.05;
  390.                 gEditingObject[playerid][rotatestep] = 1.0;
  391.                
  392.                 format(msg, sizeof msg, "Object '%s' (ModelID: %d ObjectID: %d) selected", gObjects[oid][Name], gObjects[oid][ModelID], oid);
  393.                 SystemMessage(playerid, msg, COLOR_YELLOW);
  394.                 return 1;
  395.             } else {
  396.                 format(msg, sizeof msg, "Objekt '%s' not found", name);
  397.                 SystemMessage(playerid, msg, COLOR_YELLOW);
  398.                 return 1;
  399.             }
  400.         }
  401.        
  402.         //objekt an player pappen
  403.         if (strcmp(cmd, "/ostick", true) == 0) {
  404.             new Float:distance;
  405.             syntax = "SYNTAX: /ostick <distance>";
  406.            
  407.             //distance
  408.             cmd = strtok(cmdtext, idx);
  409.             if (!(strlen(cmd))) {
  410.                 distance = 2;
  411.             } else {
  412.                 distance = strflt(cmd);
  413.             }
  414.            
  415.             if (!(gCameraSetTimer[playerid] == 0)) {
  416.                 KillTimer(gCameraSetTimer[playerid]);
  417.                 gCameraSetTimer[playerid] = 0;
  418.                 SetCameraBehindPlayer(playerid);
  419.             }
  420.            
  421.             TogglePlayerControllable(playerid, 1);
  422.            
  423.             gEditingObject[playerid][StickDistance] = distance;
  424.             gEditingObject[playerid][stuck] = true;
  425.            
  426.             AttachObjectToPlayer(gEditingObject[playerid][object_id],playerid, 0, gEditingObject[playerid][StickDistance], 0, 0, 0, 0);
  427.             return 1;
  428.         }
  429.        
  430.         //objeckt lsen
  431.         if (strcmp(cmd, "/orelease", true) == 0) {
  432.             new oid;
  433.             new model_id;
  434.             new Float:x2, Float:y2;
  435.             new objname[MAX_STRING];
  436.            
  437.             if (gEditingObject[playerid][stuck]) {
  438.                 gEditingObject[playerid][stuck] = false;
  439.                
  440.                 oid = gEditingObject[playerid][object_id];
  441.                 model_id = gObjects[oid][ModelID];
  442.                 format(objname, sizeof objname, "%s", gObjects[oid][Name]);
  443.                
  444.                 x2 = x + (gEditingObject[playerid][StickDistance] * floatsin(-angle, degrees));
  445.                 y2 = y + (gEditingObject[playerid][StickDistance] * floatcos(-angle, degrees));
  446.                
  447.                 DestroyObject(oid);
  448.                
  449.                 oid = AddNewObjectToScript(model_id, x2, y2, z, 0, 0, angle, objname);
  450.                 gEditingObject[playerid][object_id] = oid;
  451.                 gEditingObject[playerid][mode] = OED_MOVE_XY;
  452.                 gEditingObject[playerid][movestep] = 0.05;
  453.                 gEditingObject[playerid][rotatestep] = 1.0;
  454.                 gObjects[oid][savetofile] = true;
  455.                
  456.                 SaveObjects();
  457.             }
  458.             return 1;
  459.         }
  460.        
  461.         //multiplikator setzen
  462.         if (strcmp(cmd, "/ofaktor", true) == 0) {
  463.             syntax = "SYNTAX:  /ofaktor [faktor]";
  464.             new Float:mul;
  465.            
  466.             //mul
  467.             cmd = strtok(cmdtext, idx);
  468.             if (!(strlen(cmd))) {
  469.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  470.                 return 1;
  471.             } else {
  472.                 mul = strflt(cmd);
  473.             }
  474.            
  475.             gEditingObject[playerid][EditMultiplier] = mul;
  476.             format(msg, sizeof msg, "New multiplier set: %f", mul);
  477.             SystemMessage(playerid, msg, COLOR_GREEN);
  478.             return 1;
  479.         }
  480.     }
  481.    
  482.     return 0;
  483. }
  484.  
  485. /*---------------------------------------------------------------------------------------------------*/
  486.  
  487. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
  488.     new msg[MAX_STRING];
  489.     new axis_updown, axis_leftright;
  490.     new editmode;
  491.     new Float:value;    
  492.     new Float:x, Float:y, Float:z, Float:angle;
  493.    
  494.     new obj_id = gEditingObject[playerid][object_id];
  495.    
  496.     if (IsPlayerInAnyVehicle(playerid)) {
  497.         GetVehiclePos(GetPlayerVehicleID(playerid),x, y, z);
  498.         GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
  499.     } else {
  500.         GetPlayerPos(playerid, x, y, z);
  501.         GetPlayerFacingAngle(playerid, angle);
  502.     }
  503.    
  504.     if (IsPlayerAdmin(playerid)) {
  505.         if (!(IsPlayerInAnyVehicle(playerid))) {
  506.             if (!(gEditingObject[playerid][object_id] == 0)) {
  507.                 new oid = gEditingObject[playerid][object_id];
  508.                
  509.                 if ((gEditingObject[playerid][domove]) && (!gPlayerMenu[playerid]))  {
  510.                     switch(gEditingObject[playerid][mode]) {
  511.                     case OED_MOVE_XY:
  512.                         {
  513.                             editmode = OED_MOVE;
  514.                             axis_updown = AXIS_Y;
  515.                             axis_leftright = AXIS_X;
  516.                             value = gEditingObject[playerid][movestep];
  517.                         }
  518.                     case OED_MOVE_Z:
  519.                         {
  520.                             editmode = OED_MOVE;
  521.                             axis_updown = AXIS_Z;
  522.                             axis_leftright = AXIS_NONE;
  523.                             value = gEditingObject[playerid][movestep];
  524.                         }
  525.                     case OED_ROTATE_XY:
  526.                         {
  527.                             editmode = OED_ROTATE;
  528.                             axis_updown = AXIS_X;
  529.                             axis_leftright = AXIS_Y;
  530.                             value = gEditingObject[playerid][rotatestep];
  531.                         }
  532.                     case OED_ROTATE_Z:
  533.                         {
  534.                             editmode = OED_ROTATE;
  535.                             axis_updown = AXIS_NONE;
  536.                             axis_leftright = AXIS_Z;
  537.                             value = gEditingObject[playerid][rotatestep];
  538.                         }
  539.                     }
  540.                    
  541.                     if (!(gObjectEditTimer[playerid] == 0)) {
  542.                         axis_updown = AXIS_NONE;
  543.                         axis_leftright = AXIS_NONE;
  544.                     }
  545.                    
  546.                     //hoch+runter
  547.                     if (newkeys & VKEY_UP) {
  548.                         if (editmode == OED_ROTATE) {
  549.                             if (!(axis_updown == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_updown, value);
  550.                         } else if (editmode == OED_MOVE) {
  551.                             switch (axis_updown) {
  552.                             case AXIS_Y: MoveObject(oid, gObjects[oid][obj_x],gObjects[oid][obj_y]+2000,gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  553.                             case AXIS_Z: MoveObject(oid, gObjects[oid][obj_x],gObjects[oid][obj_y],gObjects[oid][obj_z]+2000,value*gEditingObject[playerid][EditMultiplier]*10);
  554.                             }
  555.                         }
  556.                     }
  557.                     if (newkeys & VKEY_DOWN) {
  558.                         if (editmode == OED_ROTATE) {
  559.                             if (!(axis_updown == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_updown, -value);
  560.                         } else if (editmode == OED_MOVE) {
  561.                             switch (axis_updown) {
  562.                             case AXIS_Y: MoveObject(oid, gObjects[oid][obj_x],gObjects[oid][obj_y]-2000,gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  563.                             case AXIS_Z: MoveObject(oid, gObjects[oid][obj_x],gObjects[oid][obj_y],gObjects[oid][obj_z]-2000,value*gEditingObject[playerid][EditMultiplier]*10);
  564.                             }
  565.                         }
  566.                     }
  567.                     //links+rechts
  568.                     if (newkeys & VKEY_LEFT) {
  569.                         if (editmode == OED_ROTATE) {
  570.                             if (!(axis_leftright == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_leftright, -value);
  571.                         } else if (editmode == OED_MOVE) {
  572.                             switch (axis_leftright) {
  573.                             case AXIS_X: MoveObject(oid, gObjects[oid][obj_x]-2000,gObjects[oid][obj_y],gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  574.                             }
  575.                         }
  576.                     }
  577.                     if (newkeys & VKEY_RIGHT) {
  578.                         if (editmode == OED_ROTATE) {
  579.                             if (!(axis_leftright == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_leftright, value);
  580.                         } else if (editmode == OED_MOVE) {
  581.                             switch (axis_leftright) {
  582.                             case AXIS_X: MoveObject(oid, gObjects[oid][obj_x]+2000,gObjects[oid][obj_y],gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  583.                             }
  584.                         }
  585.                     }
  586.                    
  587.                    
  588.                     if ((oldkeys & VKEY_UP) |
  589.                         (oldkeys & VKEY_DOWN) |
  590.                         (oldkeys & VKEY_LEFT) |
  591.                         (oldkeys & VKEY_RIGHT))  {
  592.                        
  593.                         if (!(gObjectEditTimer[playerid] == 0)) {
  594.                             KillTimer(gObjectEditTimer[playerid]);
  595.                             gObjectEditTimer[playerid] = 0;
  596.                         }
  597.                        
  598.                         StopObject(oid);
  599.                         SaveObjects();
  600.                     }
  601.                 }
  602.  
  603.                 if (newkeys & KEY_WALK) {
  604.                     if (!(obj_id == 0)) {
  605.                         format(msg, sizeof msg, "- %s -", gObjects[obj_id][Name]);
  606.                         gMenus[playerid] = CreateMenu(msg, 1, 350, 200, 250, 0);
  607.                         if (gEditingObject[playerid][stuck]) {
  608.                             AddMenuItem(gMenus[playerid], 0, "Detach from player");
  609.                             gMenuMode[playerid] = MM_SELECT_EDITMODE_DETACHONLY;
  610.                         } else {
  611.                             AddMenuItem(gMenus[playerid], 0, "Attach to player");
  612.                             AddMenuItem(gMenus[playerid], 0, "Move on X/Y Axis");
  613.                             AddMenuItem(gMenus[playerid], 0, "Move on Z Axis");
  614.                             AddMenuItem(gMenus[playerid], 0, "Rotate on X/Y Axis");
  615.                             AddMenuItem(gMenus[playerid], 0, "Rotate on Z Axis");
  616.                             AddMenuItem(gMenus[playerid], 0, "Copy");
  617.                             AddMenuItem(gMenus[playerid], 0, "Delete");
  618.                             AddMenuItem(gMenus[playerid], 0, "Multiplier");
  619.                             AddMenuItem(gMenus[playerid], 0, "Cancel");
  620.                            
  621.                             gMenuMode[playerid] = MM_SELECT_EDITMODE;
  622.                         }
  623.                         if (!(gObjectEditTimer[playerid] == 0)) {
  624.                             KillTimer(gObjectEditTimer[playerid]);
  625.                             gObjectEditTimer[playerid] = 0;
  626.                         }
  627.                        
  628.                         StopObject(oid);
  629.                         SaveObjects();
  630.                        
  631.                         TogglePlayerControllable(playerid, 0);
  632.                         ShowMenuForPlayer(gMenus[playerid], playerid);
  633.                         gPlayerMenu[playerid] = true;
  634.                     }
  635.                 }
  636.                
  637.                 if (newkeys & KEY_CROUCH) {
  638.                     gEditingObject[playerid][domove] = !gEditingObject[playerid][domove];
  639.                     if (gEditingObject[playerid][domove]) {
  640.                         format(msg, sizeof msg, "Movement enabled: %s", gObjects[gEditingObject[playerid][object_id]][Name]);
  641.                         OnPlayerCommandText(playerid, "/orelease");
  642.                         TogglePlayerControllable(playerid, 0);
  643.                         if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, oid);
  644.                     } else {
  645.                         if (!(gObjectEditTimer[playerid] == 0)) {
  646.                             KillTimer(gObjectEditTimer[playerid]);
  647.                             gObjectEditTimer[playerid] = 0;
  648.                         }
  649.                        
  650.                         if (!(gCameraSetTimer[playerid] == 0)) {
  651.                             KillTimer(gCameraSetTimer[playerid]);
  652.                             gCameraSetTimer[playerid] = 0;
  653.                             SetCameraBehindPlayer(playerid);
  654.                         }
  655.                        
  656.                         StopObject(oid);
  657.                         SaveObjects();
  658.                        
  659.                         format(msg, sizeof msg, "Movement disabled: %s", gObjects[gEditingObject[playerid][object_id]][Name]);
  660.                         TogglePlayerControllable(playerid, 1);
  661.                     }
  662.                     SystemMessage(playerid, msg, COLOR_YELLOW);
  663.                 }  
  664.             }
  665.         }
  666.     }
  667.    
  668.     return 1;
  669. }
  670.  
  671. /*---------------------------------------------------------------------------------------------------*/
  672.  
  673. public OnPlayerExitedMenu(playerid) {
  674.     DestroyMenu(gMenus[playerid]);
  675.     gPlayerMenu[playerid] = false;
  676.    
  677.     TogglePlayerControllable(playerid, !(gEditingObject[playerid][domove]) * true);
  678.     return 1;
  679. }
  680.  
  681. /*---------------------------------------------------------------------------------------------------*/
  682.  
  683. public OnPlayerSelectedMenuRow(playerid, row) {
  684.     TogglePlayerControllable(playerid, !(gEditingObject[playerid][domove]) * true);
  685.     new obj_id = gEditingObject[playerid][object_id];
  686.    
  687.     DestroyMenu(gMenus[playerid]);
  688.     gPlayerMenu[playerid] = false;
  689.    
  690.     switch (gMenuMode[playerid]) {
  691.     case MM_SELECT_EDITMODE:
  692.         {
  693.             switch (row) {
  694.             case 0: //"Attach to player",
  695.                 {
  696.                     OnPlayerCommandText(playerid, "/ostick");
  697.                 }
  698.             case 1: //"Move on X/Y Axis"
  699.                 {
  700.                     gEditingObject[playerid][domove] = true;
  701.                     TogglePlayerControllable(playerid, 0);
  702.                     if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  703.                     OnPlayerCommandText(playerid, "/omode m_xy");
  704.                 }
  705.             case 2: //"Move on Z Axis"
  706.                 {
  707.                     gEditingObject[playerid][domove] = true;
  708.                     TogglePlayerControllable(playerid, 0);
  709.                     if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  710.                     OnPlayerCommandText(playerid, "/omode m_z");
  711.                 }
  712.             case 3: //"Rotate on X/Y Axis"
  713.                 {
  714.                     gEditingObject[playerid][domove] = true;
  715.                     TogglePlayerControllable(playerid, 0);
  716.                     if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  717.                     OnPlayerCommandText(playerid, "/omode r_xy");
  718.                 }
  719.             case 4: //"Rotate on Z Axis"
  720.                 {
  721.                     gEditingObject[playerid][domove] = true;
  722.                     TogglePlayerControllable(playerid, 0);
  723.                     if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  724.                     OnPlayerCommandText(playerid, "/omode r_z");
  725.                 }
  726.             case 5: //"Copy"
  727.                 {
  728.                     new objname[MAX_STRING];
  729.                     format(objname, sizeof objname, "/ocopy cpy_%s", gObjects[obj_id][Name]);
  730.                     OnPlayerCommandText(playerid, objname);
  731.                 }
  732.             case 6: //"Delete"
  733.                 {
  734.                     OnPlayerCommandText(playerid, "/odel");
  735.                 }
  736.             case 7: //"Multiplier"
  737.                 {
  738.                     gMenus[playerid] = CreateMenu("Multipliers", 1, 350,180, 250, 0);
  739.                     new temp[MAX_STRING];
  740.                     new items[10][MAX_STRING] = {
  741.                     "0.005x",
  742.                     "0.05x",
  743.                     "0.5x",
  744.                     "1x",
  745.                     "2x",
  746.                     "5x",
  747.                     "10x",
  748.                     "20x",
  749.                     "25x",
  750.                     "45x"
  751.                     };
  752.                    
  753.                     temp = "~w~";
  754.                     strcat(temp, items[gSelectedMultiplier[playerid]]);
  755.                     items[gSelectedMultiplier[playerid]] = temp;
  756.                    
  757.                     for(new i=0;i<=9;i++) {
  758.                         AddMenuItem(gMenus[playerid], 0, items[i]);
  759.                     }
  760.                    
  761.                     gMenuMode[playerid] = MM_SELECT_MULTIPLIER;
  762.                     TogglePlayerControllable(playerid, 0);
  763.                     ShowMenuForPlayer(gMenus[playerid], playerid);
  764.                     gPlayerMenu[playerid] = true;
  765.                 }
  766.             case 8: //"Cancel"
  767.                 {
  768.                     if (!(gObjectEditTimer[playerid] == 0)) {
  769.                         KillTimer(gObjectEditTimer[playerid]);
  770.                         gObjectEditTimer[playerid] = 0;
  771.                     }
  772.                    
  773.                     if (!(gCameraSetTimer[playerid] == 0)) {
  774.                         KillTimer(gCameraSetTimer[playerid]);
  775.                         gCameraSetTimer[playerid] = 0;
  776.                         SetCameraBehindPlayer(playerid);
  777.                     }
  778.                    
  779.                     StopObject(obj_id);
  780.                     SaveObjects();
  781.                 }
  782.             }
  783.         }
  784.     case MM_SELECT_EDITMODE_DETACHONLY:
  785.         {
  786.             switch (row) {
  787.             case 0: //"Detach from player",
  788.                 {
  789.                     OnPlayerCommandText(playerid, "/orelease");
  790.                 }
  791.             }    
  792.         }
  793.     case MM_SELECT_MULTIPLIER:
  794.         {
  795.             switch (row) {
  796.             case 0: gEditingObject[playerid][EditMultiplier]  = 0.005;       //"0.005x",
  797.             case 1: gEditingObject[playerid][EditMultiplier]  = 0.050;       //"0.05x",
  798.             case 2: gEditingObject[playerid][EditMultiplier]  = 0.5;       //"0.5x",
  799.             case 3: gEditingObject[playerid][EditMultiplier]  = 1;       //"1x",
  800.             case 4: gEditingObject[playerid][EditMultiplier]  = 2;       //"2x",
  801.             case 5: gEditingObject[playerid][EditMultiplier]  = 5;       //"5x",
  802.             case 6: gEditingObject[playerid][EditMultiplier]  = 10;       //"10x",
  803.             case 7: gEditingObject[playerid][EditMultiplier]  = 20;       //"20x",
  804.             case 8: gEditingObject[playerid][EditMultiplier]  = 25;       //"25x",
  805.             case 9: gEditingObject[playerid][EditMultiplier]  = 45;       //"45x"
  806.             }
  807.            
  808.             gSelectedMultiplier[playerid] = row;
  809.             TogglePlayerControllable(playerid, !gEditingObject[playerid][domove]);
  810.         }
  811.     }
  812.    
  813.     DestroyMenu(gMenus[playerid]);
  814.    
  815.     return 1;
  816. }
  817.  
  818. /*---------------------------------------------------------------------------------------------------*/
  819.  
  820. stock SystemMessage (playerid, text[], color) {
  821.     new msg[MAX_STRING];
  822.    
  823.     format(msg, sizeof msg, "* %s", text);
  824.    
  825.     if (playerid == -1) {   //an alle
  826.         SendClientMessageToAll(color, msg);
  827.     } else {
  828.         if (IsPlayerConnected(playerid)) {
  829.             SendClientMessage(playerid, color, msg);
  830.         }
  831.     }
  832.    
  833.     return 1;
  834. }
  835.  
  836. /*---------------------------------------------------------------------------------------------------*/
  837.  
  838. stock PrintError(text[], type) {
  839.     switch(type) {
  840.     case 0: printf("* ERROR:    %s", text);
  841.     case 1: printf("* WARNING:  %s", text);
  842.     }
  843.    
  844.     return 1;
  845. }
  846.  
  847. /*===================================================================================================*/
  848. /* Objektfunktionen */
  849. stock ReadObjects() {
  850.     new File:hFile;
  851.     new line[MAX_STRING];
  852.     new commentpos;
  853.     new values[8][MAX_STRING];
  854.    
  855.     new newoid;
  856.    
  857.     new modelid;
  858.     new Float:x;
  859.     new Float:y;
  860.     new Float:z;
  861.     new Float:rotx;
  862.     new Float:roty;
  863.     new Float:rotz;
  864.     new ObjectName[MAX_STRING];
  865.    
  866.     if (!(fexist("BREAD_OED.TXT"))) {
  867.         PrintError("'scriptfiles/BREAD_OED.TXT' not found; skipping objects", 1);
  868.         return 0;
  869.     }
  870.    
  871.     hFile = fopen("BREAD_OED.TXT", io_read);
  872.    
  873.     while (fread(hFile, line)) {
  874.         strmid(line,line,0,strlen(line)-2);
  875.        
  876.         commentpos = strfind(line,";",true);
  877.         if (commentpos!=-1) {
  878.             strmid(line,line,0,commentpos);
  879.         }
  880.        
  881.         if (strlen(line) > 0) {
  882.             split(line, values, ',', sizeof values);
  883.            
  884.             //modelid
  885.             modelid = strval(values[0]);
  886.             //spawn X
  887.             x = strflt(values[1]);
  888.             //spawn Y
  889.             y = strflt(values[2]);
  890.             //spawn Z
  891.             z = strflt(values[3]);
  892.             //rotation x
  893.             rotx = strflt(values[4]);
  894.             //rotation y
  895.             roty = strflt(values[5]);
  896.             //rotation z
  897.             rotz = strflt(values[6]);
  898.             //name
  899.             ObjectName = values[7];
  900.            
  901.             if (gObjectCount < MAX_OBJECTS) {
  902.                 newoid = CreateObject(modelid, x, y, z, rotx, roty, rotz);
  903.                
  904.                 gObjects[newoid][ModelID] = modelid;
  905.                 gObjects[newoid][obj_x] = x;
  906.                 gObjects[newoid][obj_y] = y;
  907.                 gObjects[newoid][obj_z] = z;
  908.                 gObjects[newoid][rot_x] = rotx;
  909.                 gObjects[newoid][rot_y] = roty;
  910.                 gObjects[newoid][rot_z] = rotz;
  911.                 gObjects[newoid][Name] = ObjectName;
  912.                
  913.                 gObjects[newoid][savetofile] = true;
  914.                 gObjectCount++;
  915.             }
  916.         }
  917.     }
  918.    
  919.     fclose(hFile);
  920.    
  921.     return 1;
  922. }
  923.  
  924.  
  925. /*---------------------------------------------------------------------------------------------------*/
  926.  
  927. stock SaveObjects() {
  928.     new File:hFile;
  929.     new line[MAX_STRING];
  930.    
  931.     hFile = fopen("BREAD_OED.TXT", io_write);
  932.    
  933.     fwrite(hFile,";ModelID,x,y,z,rotx,roty,rotz,name\r\n");
  934.     for (new i=1;i<=gObjectCount;i++) {
  935.         if (gObjects[i][savetofile]) {
  936.             format(line, sizeof line, "%d,%f,%f,%f,%f,%f,%f,%s\r\n", gObjects[i][ModelID], gObjects[i][obj_x], gObjects[i][obj_y], gObjects[i][obj_z], gObjects[i][rot_x], gObjects[i][rot_y], gObjects[i][rot_z], gObjects[i][Name]);
  937.            
  938.             fwrite(hFile, line);
  939.         }
  940.     }
  941.    
  942.     fclose(hFile);
  943.  
  944.     return 1;
  945. }
  946.  
  947. /*---------------------------------------------------------------------------------------------------*/
  948.  
  949. stock AddNewObjectToScript(modelid,Float:x,Float:y,Float:z,Float:rotx,Float:roty,Float:rotz,ObjectName[MAX_STRING]) {
  950.     new newoid;
  951.    
  952.     if (gObjectCount < MAX_OBJECTS) {
  953.         newoid = CreateObject(modelid, x, y, z, rotx, roty, rotz);
  954.        
  955.         gObjects[newoid][ModelID] = modelid;
  956.         gObjects[newoid][obj_x] = x;
  957.         gObjects[newoid][obj_y] = y;
  958.         gObjects[newoid][obj_z] = z;
  959.         gObjects[newoid][rot_x] = rotx;
  960.         gObjects[newoid][rot_y] = roty;
  961.         gObjects[newoid][rot_z] = rotz;
  962.         gObjects[newoid][Name] = ObjectName;
  963.        
  964.         gObjectCount++;
  965.        
  966.         return newoid;
  967.     } else {
  968.         return 0;
  969.     }
  970. }
  971.  
  972. /*===================================================================================================*/
  973. /* Stringfunktionen */
  974. stock strtok(const string[], &index) {
  975.     new length = strlen(string);
  976.     while ((index < length) && (string[index] <= ' '))
  977.     {
  978.         index++;
  979.     }
  980.     new offset = index;
  981.     new result[20];
  982.     while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
  983.     {
  984.         result[index - offset] = string[index];
  985.         index++;
  986.     }
  987.     result[index - offset] = EOS;
  988.     return result;
  989. }
  990.  
  991. /*---------------------------------------------------------------------------------------------------*/
  992.  
  993. stock Float:strflt(string[]) {
  994.     new dotpos,absval,decval;
  995.     new abs[255],dec[255];
  996.     new Float:value;
  997.  
  998.     dotpos = strfind(string,".");
  999.     if (dotpos != -1) {
  1000.         strmid(abs,string,0,dotpos);
  1001.         strmid(dec,string,dotpos+1,strlen(string));
  1002.  
  1003.         absval = strval(abs);
  1004.         decval = strval(dec);
  1005.  
  1006.         value = float(absval);
  1007.         value = floatadd(value,(floatdiv(float(decval),float(power(10, strlen(dec))))));
  1008.     } else {
  1009.         absval = strval(string);
  1010.         value = float(absval);
  1011.     }
  1012.     return value;
  1013. }
  1014.  
  1015. /*---------------------------------------------------------------------------------------------------*/
  1016.  
  1017. stock power(base, exp) {
  1018.     new i,value;
  1019.     value = base;
  1020.     for (i=1;i<exp;i++) {
  1021.         value = value * base;
  1022.     }
  1023.     return value;
  1024. }
  1025.  
  1026. /*---------------------------------------------------------------------------------------------------*/
  1027.  
  1028. stock split(const strsrc[], strdest[][], delimiter, maxitems) {
  1029.     new i, li;
  1030.     new aNum;
  1031.     new len;
  1032.     new remdel;
  1033.    
  1034.     while((i <= strlen(strsrc)) && (aNum < maxitems)){
  1035.         if(strsrc[i]==0x22){    // 0x22 = "
  1036.             if(delimiter != 0x22){
  1037.                 remdel = delimiter;
  1038.                 delimiter = 0x22;
  1039.                 i++;
  1040.                 li++;  
  1041.             }
  1042.         }
  1043.         if((strsrc[i]==delimiter) || (i==strlen(strsrc))){
  1044.             len = strmid(strdest[aNum], strsrc, li, i, 128);
  1045.             strdest[aNum][len] = 0; // zero terminate string
  1046.             li = i+1;
  1047.             aNum++;
  1048.             if(delimiter==0x22){
  1049.                 delimiter = remdel;
  1050.                 li++;
  1051.                 i++;
  1052.             }
  1053.         }
  1054.         i++;
  1055.     }
  1056.    
  1057.     return 1;
  1058. }
  1059.  
  1060. /*---------------------------------------------------------------------------------------------------*/
  1061.  
  1062. stock GetPlayerNearestObjects(playerid) {
  1063.     new Float:x1, Float:y1, Float:z1;
  1064.     new Float:x2, Float:y2, Float:z2;
  1065.     new Float:distances[MAX_OBJECTS][2];
  1066.     new j;
  1067.     new objects[24];
  1068.    
  1069.     GetPlayerPos(playerid, x1, y1, z1);
  1070.    
  1071.     for (new i=1;i<=gObjectCount;i++) {
  1072.         GetObjectPos(i, x2, y2, z2);
  1073.         distances[i][0] = GetDistanceBetweenCoords(x1, y1, z1, x2, y2, z2);
  1074.         distances[i][1] = float(i);
  1075.     }
  1076.    
  1077.     distances = FloatBubbleSort(distances, MAX_OBJECTS);
  1078.    
  1079.     for (new i=0;i<MAX_OBJECTS;i++) {
  1080.         if (!(floatround(distances[i][1]) == 0)) {
  1081.             if (j < 24) {
  1082.                 j++;
  1083.                 objects[j] = floatround(distances[i][1]);
  1084.             }
  1085.         }
  1086.     }
  1087.    
  1088.     return objects;
  1089. }
  1090.  
  1091. /*---------------------------------------------------------------------------------------------------*/
  1092.  
  1093. stock Float:GetDistanceBetweenCoords(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
  1094.     return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
  1095. }
  1096.  
  1097. /*---------------------------------------------------------------------------------------------------*/
  1098.  
  1099. stock Float:FloatBubbleSort(Float:lArray[MAX_OBJECTS][2], lArraySize) {
  1100.     new Float:lSwap;
  1101.     new bool:bSwapped = true;
  1102.     new I;
  1103.    
  1104.     while(bSwapped) {
  1105.         bSwapped = false;
  1106.         for(I = 0; I < lArraySize - 1; I++) {
  1107.             if(lArray[I+1][0] < lArray[I][0]) {            
  1108.                 lSwap = lArray[I][0];
  1109.                 lArray[I][0] = lArray[I+1][0];
  1110.                 lArray[I+1][0] = lSwap;
  1111.                
  1112.                 lSwap = lArray[I][1];
  1113.                 lArray[I][1] = lArray[I+1][1];
  1114.                 lArray[I+1][1] = lSwap;
  1115.                
  1116.                 bSwapped = true;
  1117.             }
  1118.         }
  1119.     }
  1120.    
  1121.     return lArray;
  1122. }
  1123.  
  1124. /*---------------------------------------------------------------------------------------------------*/
  1125.  
  1126. public ObjectEditTimer(playerid, editmode, axis, Float:value){
  1127.     new Float:x, Float:y, Float:z;
  1128.     new Float:rotx, Float:roty, Float:rotz;
  1129.     new oid;
  1130.        
  1131.     if ((gEditingObject[playerid][domove]) && (gEditingObject[playerid][object_id] > 0)) {
  1132.         value = floatmul(value, gEditingObject[playerid][EditMultiplier]);
  1133.        
  1134.         oid = gEditingObject[playerid][object_id];
  1135.        
  1136.         GetObjectPos(oid, x, y, z);
  1137.         GetObjectRot(oid, rotx, roty, rotz);
  1138.        
  1139.         switch(axis) {
  1140.         case AXIS_X:
  1141.             {
  1142.                 x = floatadd(x, value);
  1143.                 rotx = floatadd(rotx, value);
  1144.             }
  1145.         case AXIS_Y:
  1146.             {
  1147.                 y = floatadd(y, value);
  1148.                 roty = floatadd(roty, value);
  1149.             }
  1150.         case AXIS_Z:
  1151.             {
  1152.                 z = floatadd(z, value);
  1153.                 rotz = floatadd(rotz, value);
  1154.             }
  1155.         }
  1156.        
  1157.         switch (editmode) {
  1158.         case OED_MOVE:
  1159.             {
  1160.                 SetObjectPos(oid, x, y, z);
  1161.                 gObjects[oid][obj_x] = x;
  1162.                 gObjects[oid][obj_y] = y;
  1163.                 gObjects[oid][obj_z] = z;
  1164.             }
  1165.         case OED_ROTATE:
  1166.             {
  1167.                 SetObjectRot(oid, rotx, roty, rotz);
  1168.                 gObjects[oid][rot_x] = rotx;
  1169.                 gObjects[oid][rot_y] = roty;
  1170.                 gObjects[oid][rot_z] = rotz;
  1171.             }
  1172.         }
  1173.     }
  1174.    
  1175.     return 1;
  1176. }
  1177.  
  1178. /*---------------------------------------------------------------------------------------------------*/
  1179.  
  1180. public UpDownLeftRightAdditionTimer() {
  1181.     new keys, leftright, updown;
  1182.     new oldkeys;
  1183.    
  1184.     for (new i=0;i<MAX_PLAYERS;i++) {
  1185.         if (IsPlayerConnected(i)) {
  1186.             GetPlayerKeys(i, keys, updown, leftright);
  1187.            
  1188.             //links+rechts
  1189.             if (leftright == KEY_LEFT) {
  1190.                 if (!(gLastPlayerKeys[i][0] == leftright)) OnPlayerKeyStateChange(i, VKEY_LEFT, 0);
  1191.             } else if (leftright == KEY_RIGHT) {
  1192.                 if (!(gLastPlayerKeys[i][0] == leftright)) OnPlayerKeyStateChange(i, VKEY_RIGHT, 0);
  1193.             } else {
  1194.                 if (gLastPlayerKeys[i][0] == KEY_LEFT) {
  1195.                     oldkeys = VKEY_LEFT;
  1196.                 } else if (gLastPlayerKeys[i][0] == KEY_RIGHT) {
  1197.                     oldkeys = VKEY_DOWN;
  1198.                 }
  1199.                 if (!(gLastPlayerKeys[i][0] == leftright)) OnPlayerKeyStateChange(i, 0, oldkeys);
  1200.             }
  1201.            
  1202.             //hoch+runter
  1203.             if (updown == KEY_UP) {
  1204.                 if (!(gLastPlayerKeys[i][1] == updown)) OnPlayerKeyStateChange(i, VKEY_UP, 0);
  1205.             } else if (updown == KEY_DOWN) {
  1206.                 if (!(gLastPlayerKeys[i][1] == updown)) OnPlayerKeyStateChange(i, VKEY_DOWN, 0);
  1207.             } else {
  1208.                 if (gLastPlayerKeys[i][1] == KEY_UP) {
  1209.                     oldkeys = VKEY_UP;
  1210.                 } else if (gLastPlayerKeys[i][1] == KEY_DOWN){
  1211.                     oldkeys = VKEY_DOWN;
  1212.                 }
  1213.                 if (!(gLastPlayerKeys[i][1] == updown)) OnPlayerKeyStateChange(i, 0, oldkeys);
  1214.             }
  1215.            
  1216.             gLastPlayerKeys[i][0] = leftright;
  1217.             gLastPlayerKeys[i][1] = updown;
  1218.         }    
  1219.     }
  1220.    
  1221.     return 1;
  1222. }
  1223.  
  1224. /*---------------------------------------------------------------------------------------------------*/
  1225.  
  1226. public SetObjectCoords(playerid, obj_id) {            
  1227.     new Float:x, Float:y, Float:z;
  1228.    
  1229.     GetObjectPos(obj_id, x, y, z);
  1230.    
  1231.     if (!((x == gObjects[obj_id][obj_x]) &&
  1232.           (y == gObjects[obj_id][obj_y]) &&
  1233.           (z == gObjects[obj_id][obj_z]))) {
  1234.          
  1235.         gObjects[obj_id][obj_x] = x;
  1236.         gObjects[obj_id][obj_y] = y;
  1237.         gObjects[obj_id][obj_z] = z;
  1238.     }
  1239.    
  1240.     GetPlayerPos(playerid, x, y, z);
  1241.     SetPlayerCameraPos(playerid, x, y, z);
  1242.     SetPlayerCameraLookAt(playerid, gObjects[obj_id][obj_x], gObjects[obj_id][obj_y], gObjects[obj_id][obj_z]);
  1243.    
  1244.     return 1;
  1245. }
Add Comment
Please, Sign In to add comment