Advertisement
avs_009

OED - In game Object Editor by [BR]Allan

Mar 4th, 2011
4,277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 60.34 KB | None | 0 0
  1. /*
  2.  * ---- breadfishs object editor ----
  3.  * -- copyright (c) 2011 breadfish and [BR]Allan --
  4.  * ----- breadfish@breadfish.de -----
  5.  *----- avs.009@gmail.com -----
  6.  */
  7. #include <a_samp>
  8. #include <dutils>
  9.  
  10. // Edit this value for up or down stack size
  11. #pragma dynamic 9216
  12.  
  13. #define OBJECT_DISTANCE 300.0
  14.  
  15. /* -- COLORS -- */
  16. #define COLOR_RED       0xFF0000FF
  17. #define COLOR_YELLOW    0xFFFF00FF
  18. #define COLOR_GREEN     0x00FF00FF
  19. #define COLOR_WHITE     0xFFFFFFFF
  20. #define COLOR_BLUE      0x0000FFFF
  21.  
  22. #define menu_add        (2565)  // Anything number unsed into other menus
  23. #define INVALID_OBJECT  (-1)    // Please don't edit this value
  24.  
  25. /* -- OBJECT-EDITINGMODES -- */
  26. #define OED_NONE        0
  27. #define OED_MOVE        1
  28. #define OED_ROTATE      2
  29. #define OED_MOVE_XY     3
  30. #define OED_MOVE_Z      4
  31. #define OED_ROTATE_XY   5
  32. #define OED_ROTATE_Z    6
  33.  
  34. /* -- EIXOS -- */
  35. #define AXIS_NONE       0
  36. #define AXIS_X          1
  37. #define AXIS_Y          2
  38. #define AXIS_Z          3
  39.  
  40. /* -- VKEYS -- */
  41. #define VKEY_LEFT       32768
  42. #define VKEY_RIGHT      65536
  43. #define VKEY_UP         131072
  44. #define VKEY_DOWN       262144
  45.  
  46. /* -- MENUMODES -- */
  47. #define MM_SELECT_EDITMODE              1
  48. #define MM_SELECT_EDITMODE_DETACHONLY   2
  49. #define MM_SELECT_MULTIPLIER            3
  50. #define MM_SELECT_ADDMODE               4
  51.  
  52.  
  53. /* -- Directory of files -- */
  54.  
  55. #define F_DIRECTORY "oed/"
  56.  
  57. /* -- Multi-Language variables -- */
  58.  
  59. #define MAX_LANGS   100
  60.  
  61. new plang[MAX_PLAYERS][256];
  62.  
  63. new Langs[MAX_LANGS][256];
  64.  
  65. new Langs_Imp=0;
  66.  
  67. enum ELANG
  68. {
  69.     DESC_ADD,
  70.     DESC_COPY,
  71.     DESC_DEL,
  72.     DESC_DESEL,
  73.     DESC_FAKTOR,
  74.     DESC_GOTO,
  75.     DESC_LANG,
  76.     DESC_LISTLANG,
  77.     DESC_MODE,
  78.     DESC_NEXT,
  79.     DESC_RELEASE,
  80.     DESC_SEL,
  81.     DESC_STICK,
  82.     M_ADD,
  83.     M_ATTACH,
  84.     M_CANCEL,
  85.     M_COPY,
  86.     M_DEL,
  87.     M_DESC_ADD_CATEGORY,
  88.     M_DESC_ADD_MODELID,
  89.     M_DESC_ONAME,
  90.     M_DETACH,
  91.     M_GOTO,
  92.     M_MOVEXY,
  93.     M_MOVEZ,
  94.     M_MULT,
  95.     M_NEXTPAGE,
  96.     M_NEXT,
  97.     M_ONAME_TITLE,
  98.     M_RELOADALL,
  99.     M_ROTXY,
  100.     M_ROTZ,
  101.     M_SELECT,
  102.     M_VIEW,
  103.     MSG_ADD_OPEN,
  104.     MSG_ADDED,
  105.     MSG_CANCELED,
  106.     MSG_COPY,
  107.     MSG_COMMANDS,
  108.     MSG_DELETED,
  109.     MSG_DESELECTED,
  110.     MSG_EXISTS,
  111.     MSG_FNOTFOUND,
  112.     MSG_LANG,
  113.     MSG_LANGDEF,
  114.     MSG_LANGSEL,
  115.     MSG_LANGINV,
  116.     MSG_MOVEENABLED,
  117.     MSG_MOVEDISABLED,
  118.     MSG_MULTIPLER,
  119.     MSG_NOSELECTED,
  120.     MSG_NEWMODE,
  121.     MSG_NEAREST,
  122.     MSG_NOTFOUND,
  123.     MSG_PAGE,
  124.     MSG_RELEASE,
  125.     MSG_SAVEDALL,
  126.     MSG_SELECTED,
  127.     MSG_STICK,
  128.     MSG_SYNTAX
  129. };
  130.  
  131. /* -- FORWARDS -- */
  132. forward Float:strflt(string[]);
  133. forward Float:GetDistanceBetweenCoords(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2);
  134. forward Float:FloatBubbleSort(Float:lArray[MAX_OBJECTS][2], lArraySize);
  135. //Timer
  136. forward ObjectEditTimer(playerid, editmode, axis, Float:value);
  137. forward UpDownLeftRightAdditionTimer();
  138. forward SetObjectCoords(playerid, obj_id);
  139.  
  140. //Objectdaten
  141. enum OBJECTDATA() {
  142.     id_o,
  143.     ModelID,
  144.     Float:obj_x,
  145.     Float:obj_y,
  146.     Float:obj_z,
  147.     Float:rot_x,
  148.     Float:rot_y,
  149.     Float:rot_z,
  150.     Name[MAX_STRING],
  151.     bool:savetofile
  152. }
  153. //Player data
  154. enum PLAYERDATA {
  155.     Name[25],
  156.     //Level,
  157.     vfile[256],
  158.     vindex,
  159.     id_sel
  160. }
  161.  
  162. //currently edited object
  163. enum EDITINGOBJECT {
  164.     object_id,
  165.     mode,
  166.     bool:domove,
  167.     Float:movestep,
  168.     Float:rotatestep,
  169.     Float:StickDistance,
  170.     Float:EditMultiplier,
  171.     bool:stuck
  172. }
  173.  
  174. // Vars used into menu objects
  175. new listcat[4096], lista[MAX_PLAYERS][4096];
  176.  
  177. //datenhaltung
  178. new gPlayer[MAX_PLAYERS][PLAYERDATA];   //player-infos
  179. new gObjects[150][OBJECTDATA];          //Objecte
  180.  
  181. new gEditingObject[MAX_PLAYERS][EDITINGOBJECT];
  182. new gObjectEditTimer[MAX_PLAYERS];
  183. new gCameraSetTimer[MAX_PLAYERS];
  184. new gLastPlayerKeys[MAX_PLAYERS][2];
  185. new bool:gPlayerMenu[MAX_PLAYERS];
  186. new gSelectedMultiplier[MAX_PLAYERS];
  187. new Menu:gMenus[MAX_PLAYERS];
  188. new gMenuMode[MAX_PLAYERS];
  189.  
  190. //limits
  191. new gObjectCount=0;
  192. //Timer ids
  193. new Timer;
  194.  
  195. /*---------------------------------------------------------------------------------------------------*/
  196.  
  197. public OnFilterScriptInit() {
  198.     ReadLangs();
  199.     ReadListObjetects(listcat);
  200.     ReadObjects();
  201.     Timer = SetTimer("UpDownLeftRightAdditionTimer", 50, 1);
  202.     for(new playerid=0; playerid<MAX_PLAYERS; playerid++)
  203.         OnPlayerConnect(playerid);
  204.     print("+----------------------------+");
  205.     print("| Object Editor Filterscript |");
  206.     print("|       by breadfish and     |");
  207.     print("|     Edited by [BR]Allan    |");
  208.     print("|         Revision  8        |");
  209.     print("|           LOADED!          |");
  210.     print("+----------------------------+");
  211.     return 1;
  212. }
  213. /*---------------------------------------------------------------------------------------------------*/
  214.  
  215. public OnFilterScriptExit() {
  216.     for(new playerid=0; playerid<MAX_PLAYERS; playerid++)
  217.         CancelEditObject(playerid);
  218.     SaveObjects();
  219.     DestroyObjects();
  220.     KillTimer(Timer);
  221.     print("+----------------------------+");
  222.     print("| Object Editor Filterscript |");
  223.     print("|       by breadfish and     |");
  224.     print("|     Edited by [BR]Allan    |");
  225.     print("|         Revision  8        |");
  226.     print("|          UNLOADED!         |");
  227.     print("+----------------------------+");
  228. }    
  229.  
  230. /*---------------------------------------------------------------------------------------------------*/
  231.  
  232. public OnPlayerConnect(playerid) {
  233.     new name[25];
  234.  
  235.     GetPlayerName(playerid, name, sizeof name);
  236.  
  237.     //reset playerdata
  238.     gPlayer[playerid][Name] = name;
  239.     gEditingObject[playerid][domove] = false;
  240.     gPlayerMenu[playerid] = false;
  241.     gEditingObject[playerid][EditMultiplier]  = 1;
  242.     gSelectedMultiplier[playerid] = 3;
  243.     gEditingObject[playerid][object_id] = INVALID_OBJECT;
  244.     set(plang[playerid],Langs[0]);
  245.     return 1;
  246. }
  247.  
  248. /*---------------------------------------------------------------------------------------------------*/
  249.  
  250. public OnPlayerText(playerid, text[]) {
  251.     return 1;
  252. }
  253.  
  254. /*---------------------------------------------------------------------------------------------------*/
  255.  
  256. public OnPlayerCommandText(playerid, cmdtext[]) {
  257.     new cmd[MAX_STRING], idx;
  258.     new syntax[MAX_STRING];
  259.     new Float:x, Float:y, Float:z, Float:angle;
  260.     new msg[MAX_STRING];
  261.  
  262.     //wird immer mal wieder gebraucht...
  263.     if (IsPlayerInAnyVehicle(playerid)) {
  264.         GetVehiclePos(GetPlayerVehicleID(playerid),x, y, z);
  265.         GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
  266.     }
  267.     else {
  268.         GetPlayerPos(playerid, x, y, z);
  269.         GetPlayerFacingAngle(playerid, angle);
  270.     }
  271.  
  272.     cmd = strtok(cmdtext, idx);
  273.  
  274.     if (IsPlayerAdmin(playerid)) {
  275.  
  276.         // Objecte erzeugen
  277.         if (strcmp(cmd, "/oadd", true) == 0) {
  278.             new modelid, name[MAX_STRING], newoid;
  279.             set(syntax,GetLMsg(playerid,MSG_SYNTAX));
  280.             strcat(syntax,"/oadd ");
  281.             strcat(syntax,GetLMsg(playerid,DESC_ADD));
  282.  
  283.             //modelid
  284.             cmd = strtok(cmdtext, idx);
  285.             if (!(strlen(cmd))) {
  286.                 SystemMessage(playerid, GetLMsg(playerid,MSG_ADD_OPEN), COLOR_YELLOW);
  287.                 ShowPlayerDialog(playerid, menu_add, DIALOG_STYLE_LIST, GetLMsg(playerid,M_DESC_ADD_CATEGORY), listcat, GetLMsg(playerid,M_VIEW), GetLMsg(playerid,M_CANCEL));
  288.                 return 1;
  289.             } else {
  290.                 modelid = strval(cmd);
  291.             }
  292.  
  293.             //name
  294.             strmid(cmd, cmdtext, idx, strlen(cmdtext));
  295.             if (!(strlen(cmd))) {
  296.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  297.                 return 1;
  298.             } else {
  299.                 name = cmd;
  300.             }
  301.            
  302.             for (new i=0;i<gObjectCount;i++) {
  303.                 if (strlen(gObjects[i][Name]) != 0 && strcmp(gObjects[i][Name], name, true) == 0){
  304.                     SystemMessage(playerid, GetLMsg(playerid,MSG_EXISTS), COLOR_RED);
  305.                     return 1;
  306.                 }
  307.             }
  308.  
  309.             CancelEditObject(playerid);
  310.  
  311.             newoid = AddNewObjectToScript(modelid, x, y + 2, z, 0, 0, 0, name);
  312.             gEditingObject[playerid][object_id] = newoid;
  313.             if (gEditingObject[playerid][mode] == OED_NONE) gEditingObject[playerid][mode] = OED_MOVE_XY;
  314.             gEditingObject[playerid][EditMultiplier]  = 1;
  315.             gSelectedMultiplier[playerid] = 3;
  316.             gEditingObject[playerid][movestep] = 0.05;
  317.             gEditingObject[playerid][rotatestep] = 1.0;
  318.             gObjects[newoid][savetofile] = true;
  319.             if (gEditingObject[playerid][EditMultiplier] == 0) gEditingObject[playerid][EditMultiplier] = 1;
  320.  
  321.             SaveObjects();
  322.  
  323.             format(msg, sizeof msg, "'%s' ModelID: %d - %s ", name, gObjects[newoid][ModelID], GetLMsg(playerid,MSG_ADDED));
  324.             SystemMessage(playerid, msg, COLOR_GREEN);
  325.  
  326.             return 1;
  327.         }
  328.        
  329.         else if (strcmp(cmd, "/olang", true) == 0) {
  330.             new id;
  331.             set(syntax, GetLMsg(playerid,MSG_SYNTAX));
  332.             strcat(syntax, ": /olang ");
  333.             strcat(syntax, GetLMsg(playerid,DESC_LANG));
  334.  
  335.             //name
  336.             cmd = strtok(cmdtext, idx);
  337.             if (!(strlen(cmd))) {
  338.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  339.                 return 1;
  340.             } else {
  341.                 id = strval(cmd);
  342.                 if(id < Langs_Imp)
  343.                 {
  344.                     set(plang[playerid], Langs[id]);
  345.                     SystemMessage(playerid, GetLMsg(playerid, MSG_LANGSEL), COLOR_YELLOW);
  346.                 }
  347.                 else
  348.                     SystemMessage(playerid, GetLMsg(playerid, MSG_LANGINV), COLOR_RED);
  349.             }
  350.             return 1;
  351.         }
  352.        
  353.         else if (strcmp(cmd, "/olistlangs", true) == 0) {
  354.             new str[256];
  355.             SystemMessage(playerid, GetLMsg(playerid,MSG_LANG), COLOR_GREEN);
  356.             format(str, sizeof(str), "0 - %s - %s", Langs[0], GetLMsg(playerid,MSG_LANGDEF));
  357.             SystemMessage(playerid, str, COLOR_YELLOW);
  358.             for(new i=1; i<Langs_Imp; i++)
  359.             {
  360.                 format(str, sizeof(str), "%d - %s", i, Langs[i]);
  361.                 SystemMessage(playerid, str, COLOR_YELLOW);
  362.             }
  363.             return 1;
  364.         }
  365.  
  366.         // Objecte kopieren
  367.         else if (strcmp(cmd, "/ocopy", true) == 0) {
  368.             new name[MAX_STRING], newoid;
  369.             new Float:rx, Float:ry, Float:rz;
  370.             set(syntax, GetLMsg(playerid,MSG_SYNTAX));
  371.             strcat(syntax, ": /ocopy ");
  372.             strcat(syntax, GetLMsg(playerid,DESC_COPY));
  373.  
  374.             //name
  375.             strmid(cmd, cmdtext, 7, strlen(cmdtext));
  376.             if (!(strlen(cmd))) {
  377.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  378.                 return 1;
  379.             } else {
  380.                 name = cmd;
  381.             }
  382.  
  383.             CancelEditObject(playerid);
  384.  
  385.             x = gObjects[gEditingObject[playerid][object_id]][obj_x];
  386.             y = gObjects[gEditingObject[playerid][object_id]][obj_y];
  387.             z = gObjects[gEditingObject[playerid][object_id]][obj_z];
  388.             rx = gObjects[gEditingObject[playerid][object_id]][rot_x];
  389.             ry = gObjects[gEditingObject[playerid][object_id]][rot_y];
  390.             rz = gObjects[gEditingObject[playerid][object_id]][rot_z];
  391.  
  392.             newoid = AddNewObjectToScript(gObjects[gEditingObject[playerid][object_id]][ModelID], x, y, z, rx, ry, rz, name);
  393.             gEditingObject[playerid][object_id] = newoid;
  394.             if (gEditingObject[playerid][mode] == OED_NONE) gEditingObject[playerid][mode] = OED_MOVE_XY;
  395.             gEditingObject[playerid][movestep] = 0.05;
  396.             gEditingObject[playerid][rotatestep] = 1.0;
  397.            
  398.             gEditingObject[playerid][EditMultiplier]  = 1;
  399.             gSelectedMultiplier[playerid] = 3;
  400.            
  401.             gObjects[newoid][savetofile] = true;
  402.             if (gEditingObject[playerid][EditMultiplier] == 0) gEditingObject[playerid][EditMultiplier] = 1;
  403.  
  404.             SaveObjects();
  405.  
  406.             format(msg, sizeof msg, "'%s' ModelID: %d - %s", name, gObjects[newoid][ModelID], GetLMsg(playerid,MSG_COPY));
  407.             SystemMessage(playerid, msg, COLOR_GREEN);
  408.  
  409.             return 1;
  410.         }
  411.  
  412.         // Object löschen
  413.         else if (strcmp(cmd, "/odel", true) == 0) {
  414.             if (gEditingObject[playerid][object_id] > INVALID_OBJECT) {
  415.                 new oid = gEditingObject[playerid][object_id];
  416.                 format(msg, sizeof msg, "'%s' (ModelID:%d) - %s",  gObjects[oid][Name], gObjects[oid][ModelID], GetLMsg(playerid,MSG_DELETED));
  417.                 gObjects[oid][savetofile] = false;
  418.                 gEditingObject[playerid][object_id] = INVALID_OBJECT;
  419.  
  420.                 CancelEditObject(playerid);
  421.  
  422.                 DestroyObjects();
  423.                 ReadObjects();
  424.                 SystemMessage(playerid, msg, COLOR_GREEN);
  425.                 return 1;
  426.             } else {
  427.                 SystemMessage(playerid, GetLMsg(playerid,MSG_NOSELECTED), COLOR_YELLOW);
  428.                 return 1;
  429.             }
  430.         }
  431.  
  432.         // bearbeitungsmodus setzen
  433.         else if (strcmp(cmd, "/omode", true) == 0) {
  434.             if (gEditingObject[playerid][object_id] > INVALID_OBJECT) {
  435.                 new newmode;
  436.                 set(syntax, GetLMsg(playerid,MSG_SYNTAX));
  437.                 strcat(syntax, ": /omode [m_xy|m_z|r_xy|r_z]: ");
  438.                 strcat(syntax, GetLMsg(playerid,DESC_MODE));
  439.  
  440.                 //mode
  441.                 cmd = strtok(cmdtext, idx);
  442.                 if (!(strlen(cmd))) {
  443.                     SystemMessage(playerid, syntax, COLOR_YELLOW);
  444.                     return 1;
  445.                 } else {
  446.                     if (strcmp(cmd, "m_xy", true) == 0) newmode = OED_MOVE_XY;
  447.                     if (strcmp(cmd, "m_z", true) == 0) newmode = OED_MOVE_Z;
  448.                     if (strcmp(cmd, "r_xy", true) == 0) newmode = OED_ROTATE_XY;
  449.                     if (strcmp(cmd, "r_z", true) == 0) newmode = OED_ROTATE_Z;
  450.                 }
  451.  
  452.                 if (!(newmode == 0)) {
  453.                     gEditingObject[playerid][mode] = newmode;
  454.  
  455.                     SystemMessage(playerid, GetLMsg(playerid,MSG_NEWMODE), COLOR_GREEN);
  456.                     return 1;
  457.                 } else {
  458.                     SystemMessage(playerid, syntax, COLOR_YELLOW);
  459.                     return 1;
  460.                 }
  461.             } else {
  462.                 SystemMessage(playerid, GetLMsg(playerid,MSG_NOSELECTED), COLOR_YELLOW);
  463.             }
  464.         }
  465.  
  466.         // Objecte in der umgebung zeigen
  467.         else if (strcmp(cmd, "/onext", true) == 0) {
  468.             new objects[24], oid, objnames[MAX_STRING];
  469.             objects = GetPlayerNearestObjects(playerid);
  470.  
  471.             for (new i=0;(i<gObjectCount) && (i<24);i++) {
  472.                 oid = objects[i];
  473.  
  474.                 strcat(objnames, gObjects[oid][Name]);
  475.                 strcat(objnames, ", ");
  476.             }
  477.  
  478.             if (strlen(objnames)) {
  479.                 strmid(objnames, objnames, 0, strlen(objnames) - 2);
  480.             }
  481.  
  482.             format(objnames, sizeof objnames, "%s %s", objnames, GetLMsg(playerid,MSG_NEAREST));
  483.             SystemMessage(playerid, objnames, COLOR_YELLOW);
  484.             return 1;
  485.         }
  486.  
  487.         //Object zum bearbeiten auswählen
  488.         else if (strcmp(cmd, "/osel", true) == 0) {
  489.             new name[MAX_STRING], oid;
  490.             set(syntax, GetLMsg(playerid,MSG_SYNTAX));
  491.             strcat(syntax, ": /osel ");
  492.             strcat(syntax, GetLMsg(playerid,DESC_SEL));
  493.  
  494.             //name
  495.             strmid(cmd, cmdtext, 6, strlen(cmdtext));
  496.             if (!(strlen(cmd))) {
  497.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  498.                 return 1;
  499.             } else {
  500.                 name = cmd;
  501.             }
  502.            
  503.             new i;
  504.             for (i=0;i<gObjectCount;i++) {
  505.                 if (strlen(gObjects[i][Name]) != 0 && strcmp(gObjects[i][Name], name, true) == 0){
  506.                     oid = i;
  507.                     break;
  508.                 }
  509.             }
  510.  
  511.             if (i < gObjectCount) {
  512.                 CancelEditObject(playerid);
  513.  
  514.                 gEditingObject[playerid][object_id] = oid;
  515.                 if (gEditingObject[playerid][mode] == OED_NONE) gEditingObject[playerid][mode] = OED_MOVE_XY;
  516.                 gEditingObject[playerid][movestep] = 0.05;
  517.                 gEditingObject[playerid][rotatestep] = 1.0;
  518.                
  519.                 gEditingObject[playerid][EditMultiplier]  = 1;
  520.                 gSelectedMultiplier[playerid] = 3;
  521.  
  522.                 format(msg, sizeof msg, "'%s' (ModelID: %d) - %s", name, gObjects[oid][ModelID], GetLMsg(playerid,MSG_SELECTED));
  523.                 SystemMessage(playerid, msg, COLOR_GREEN);
  524.                 return 1;
  525.             } else {
  526.                 format(msg, sizeof msg, "'%s' %s", name, GetLMsg(playerid,MSG_NOTFOUND));
  527.                 SystemMessage(playerid, msg, COLOR_YELLOW);
  528.                 return 1;
  529.             }
  530.         }
  531.        
  532.         //deselect a object
  533.         else if (strcmp(cmd, "/odesel",true) == 0){
  534.             new oid = gEditingObject[playerid][object_id];
  535.             if(oid > INVALID_OBJECT)
  536.             {
  537.                 format(msg, sizeof msg, "'%s' (ModelID:%d) - ",  gObjects[oid][Name], gObjects[oid][ModelID], GetLMsg(playerid,MSG_DESELECTED));
  538.                 gEditingObject[playerid][object_id] = INVALID_OBJECT;
  539.                 gEditingObject[playerid][mode] = OED_NONE;
  540.                
  541.                 CancelEditObject(playerid);
  542.             }
  543.             else
  544.                 format(msg, sizeof msg,GetLMsg(playerid,MSG_NOSELECTED));
  545.             SystemMessage(playerid, msg, COLOR_YELLOW);
  546.             return 1;
  547.         }
  548.        
  549.         //goto to a objeckt by name
  550.         else if (strcmp(cmd, "/ogoto", true) == 0) {
  551.             new name[MAX_STRING], oid;
  552.             set(syntax, GetLMsg(playerid,MSG_SYNTAX));
  553.             strcat(syntax, ": /ogoto ");
  554.             strcat(syntax, GetLMsg(playerid,DESC_GOTO));
  555.  
  556.             //name
  557.             strmid(cmd, cmdtext, 7, strlen(cmdtext));
  558.             if (!(strlen(cmd))) {
  559.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  560.                 return 1;
  561.             } else {
  562.                 name = cmd;
  563.             }
  564.            
  565.             new i;
  566.             for (i=0;i<gObjectCount;i++) {
  567.                 if (strlen(gObjects[i][Name]) && strcmp(gObjects[i][Name], name, true) == 0){
  568.                     oid = i;
  569.                     break;
  570.                 }
  571.             }
  572.  
  573.             if (i < gObjectCount) {
  574.            
  575.                 CancelEditObject(playerid);
  576.  
  577.                 gEditingObject[playerid][object_id] = oid;
  578.                 if (gEditingObject[playerid][mode] == OED_NONE) gEditingObject[playerid][mode] = OED_MOVE_XY;
  579.                 gEditingObject[playerid][movestep] = 0.05;
  580.                 gEditingObject[playerid][rotatestep] = 1.0;
  581.                
  582.                 gEditingObject[playerid][EditMultiplier]  = 1;
  583.                 gSelectedMultiplier[playerid] = 3;
  584.            
  585.                 new Float:lx,Float:ly,Float:lz;
  586.                 lx = gObjects[gEditingObject[playerid][object_id]][obj_x];
  587.                 ly = gObjects[gEditingObject[playerid][object_id]][obj_y];
  588.                 lz = gObjects[gEditingObject[playerid][object_id]][obj_z];
  589.                 SetPlayerPos(playerid,lx,ly,lz);
  590.  
  591.                 format(msg, sizeof msg, "'%s' (ModelID: %d) - %s", name, gObjects[oid][ModelID], GetLMsg(playerid,MSG_SELECTED));
  592.                 SystemMessage(playerid, msg, COLOR_GREEN);
  593.                 return 1;
  594.             } else {
  595.                 format(msg, sizeof msg, "'%s' %s", name, GetLMsg(playerid,MSG_NOTFOUND));
  596.                 SystemMessage(playerid, msg, COLOR_YELLOW);
  597.                 return 1;
  598.             }
  599.         }        
  600.  
  601.         //Object an player pappen
  602.         else if (strcmp(cmd, "/ostick", true) == 0) {
  603.             new Float:distance;
  604.             set(syntax, GetLMsg(playerid,MSG_SYNTAX));
  605.             strcat(syntax, ": /ostick ");
  606.             strcat(syntax, GetLMsg(playerid,DESC_STICK));
  607.             //distance
  608.             cmd = strtok(cmdtext, idx);
  609.             if (!(strlen(cmd))) {
  610.                 distance = 2;
  611.             } else {
  612.                 distance = floatstr(cmd);
  613.             }
  614.  
  615.             CancelEditObject(playerid);
  616.  
  617.             gEditingObject[playerid][StickDistance] = distance;
  618.             gEditingObject[playerid][stuck] = true;
  619.  
  620.             AttachObjectToPlayer(gObjects[gEditingObject[playerid][object_id]][id_o],playerid, 0, gEditingObject[playerid][StickDistance], 0, 0, 0, 0);
  621.            
  622.             SystemMessage(playerid, GetLMsg(playerid,MSG_STICK), COLOR_YELLOW);
  623.             return 1;
  624.         }
  625.  
  626.         //objeckt lösen
  627.         else if (strcmp(cmd, "/orelease", true) == 0) {
  628.             new oid;
  629.             new model_id;
  630.             new Float:x2, Float:y2;
  631.             new objname[MAX_STRING];
  632.  
  633.             if (gEditingObject[playerid][stuck]) {
  634.                 gEditingObject[playerid][stuck] = false;
  635.  
  636.                 oid = gEditingObject[playerid][object_id];
  637.                 model_id = gObjects[oid][ModelID];
  638.                 format(objname, sizeof objname, "%s", gObjects[oid][Name]);
  639.  
  640.                 x2 = x + (gEditingObject[playerid][StickDistance] * floatsin(-angle, degrees));
  641.                 y2 = y + (gEditingObject[playerid][StickDistance] * floatcos(-angle, degrees));
  642.  
  643.                 DestroyObject(gObjects[oid][id_o]);
  644.  
  645.                 oid = AddNewObjectToScript(model_id, x2, y2, z, 0, 0, angle, objname, oid);
  646.                 gEditingObject[playerid][mode] = OED_MOVE_XY;
  647.                 gEditingObject[playerid][movestep] = 0.05;
  648.                 gEditingObject[playerid][rotatestep] = 1.0;
  649.                 gObjects[oid][savetofile] = true;
  650.  
  651.                 SaveObjects();
  652.                
  653.                 SystemMessage(playerid, GetLMsg(playerid,MSG_RELEASE), COLOR_YELLOW);
  654.             }
  655.             return 1;
  656.         }
  657.  
  658.         //multiplikator setzen
  659.         else if (strcmp(cmd, "/ofaktor", true) == 0) {
  660.             set(syntax, GetLMsg(playerid,MSG_SYNTAX));
  661.             strcat(syntax, ": /ofaktor ");
  662.             strcat(syntax, GetLMsg(playerid,DESC_FAKTOR));
  663.             new Float:mul;
  664.  
  665.             //mul
  666.             cmd = strtok(cmdtext, idx);
  667.             if (!(strlen(cmd))) {
  668.                 SystemMessage(playerid, syntax, COLOR_YELLOW);
  669.                 return 1;
  670.             } else {
  671.                 mul = floatstr(cmd);
  672.             }
  673.  
  674.             gEditingObject[playerid][EditMultiplier] = mul;
  675.             format(msg, sizeof msg, "%f %s", mul, GetLMsg(playerid,MSG_MULTIPLER));
  676.             SystemMessage(playerid, msg, COLOR_GREEN);
  677.             return 1;
  678.         }
  679.         //help command
  680.         else if (strcmp(cmd, "/ohelp", true) == 0) {
  681.             SystemMessage(playerid, GetLMsg(playerid,MSG_COMMANDS), COLOR_YELLOW);
  682.            
  683.             format(msg, sizeof(msg), "/oadd %s", GetLMsg(playerid,DESC_ADD));
  684.             SystemMessage(playerid, msg, COLOR_YELLOW);
  685.            
  686.             format(msg, sizeof(msg), "/ocopy %s", GetLMsg(playerid,DESC_ADD));
  687.             SystemMessage(playerid, msg, COLOR_YELLOW);
  688.            
  689.             format(msg, sizeof(msg), "/odel %s", GetLMsg(playerid,DESC_DEL));
  690.             SystemMessage(playerid, msg, COLOR_YELLOW);
  691.            
  692.             format(msg, sizeof(msg), "/olang [id] %s", GetLMsg(playerid,DESC_LANG));
  693.             SystemMessage(playerid, msg, COLOR_YELLOW);
  694.            
  695.             format(msg, sizeof(msg), "/olistlangs %s", GetLMsg(playerid,DESC_LISTLANG));
  696.             SystemMessage(playerid, msg, COLOR_YELLOW);
  697.            
  698.             format(msg, sizeof(msg), "/omode [m_xy|m_z|r_xy|r_z] %s", GetLMsg(playerid,DESC_MODE));
  699.             SystemMessage(playerid, msg, COLOR_YELLOW);
  700.            
  701.             format(msg, sizeof(msg), "/onext %s", GetLMsg(playerid,DESC_NEXT));
  702.             SystemMessage(playerid, msg, COLOR_YELLOW);
  703.            
  704.             format(msg, sizeof(msg), "/osel %s", GetLMsg(playerid,DESC_SEL));
  705.             SystemMessage(playerid, msg, COLOR_YELLOW);
  706.            
  707.             format(msg, sizeof(msg), "/odesel %s", GetLMsg(playerid,DESC_DESEL));
  708.             SystemMessage(playerid, msg, COLOR_YELLOW);
  709.            
  710.             format(msg, sizeof(msg), "/ostick %s", GetLMsg(playerid,DESC_STICK));
  711.             SystemMessage(playerid, msg, COLOR_YELLOW);
  712.            
  713.             format(msg, sizeof(msg), "/orelease %s", GetLMsg(playerid,DESC_RELEASE));
  714.             SystemMessage(playerid, msg, COLOR_YELLOW);
  715.            
  716.             format(msg, sizeof(msg), "/ofaktor %s", GetLMsg(playerid,DESC_FAKTOR));
  717.             SystemMessage(playerid, msg, COLOR_YELLOW);
  718.            
  719.             format(msg, sizeof(msg), "/ogoto %s", GetLMsg(playerid,DESC_GOTO));
  720.             SystemMessage(playerid, msg, COLOR_YELLOW);
  721.             return 1;
  722.         }
  723.         //save all objects in memory
  724.         else if (strcmp(cmd, "/osaveall", true) == 0) {
  725.             SaveObjects();          
  726.             format(msg, sizeof msg, "%d %s", gObjectCount, GetLMsg(playerid,MSG_SAVEDALL));
  727.             SystemMessage(playerid, msg, COLOR_GREEN);
  728.             return 1;
  729.         }        
  730.     }
  731.  
  732.     return 0;
  733. }
  734.  
  735. /*---------------------------------------------------------------------------------------------------*/
  736.  
  737. stock CancelEditObject(playerid)
  738. {
  739.     if(!IsPlayerConnected(playerid))
  740.         return;
  741.     new oid = gEditingObject[playerid][object_id];
  742.     if (!(gObjectEditTimer[playerid] == 0)) {
  743.         KillTimer(gObjectEditTimer[playerid]);
  744.         gObjectEditTimer[playerid] = 0;
  745.     }
  746.     if (!(gCameraSetTimer[playerid] == 0)) {
  747.         KillTimer(gCameraSetTimer[playerid]);
  748.         gCameraSetTimer[playerid] = 0;
  749.         SetCameraBehindPlayer(playerid);
  750.     }
  751.     if(oid > INVALID_OBJECT)
  752.         StopObject(gObjects[oid][id_o]);
  753.        
  754.     if(gEditingObject[playerid][domove])
  755.         gEditingObject[playerid][domove] = false;
  756.    
  757.     if (gEditingObject[playerid][stuck]) {
  758.         new Float:x, Float:y, Float:z, Float:angle;
  759.  
  760.         if (IsPlayerInAnyVehicle(playerid)) {
  761.             GetVehiclePos(GetPlayerVehicleID(playerid),x, y, z);
  762.             GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
  763.         }
  764.         else {
  765.             GetPlayerPos(playerid, x, y, z);
  766.             GetPlayerFacingAngle(playerid, angle);
  767.         }
  768.        
  769.         new model_id;
  770.         new Float:x2, Float:y2;
  771.         new objname[MAX_STRING];
  772.  
  773.         gEditingObject[playerid][stuck] = false;
  774.  
  775.         model_id = gObjects[oid][ModelID];
  776.        
  777.         set(objname, gObjects[oid][Name]);
  778.  
  779.         x2 = x + (gEditingObject[playerid][StickDistance] * floatsin(-angle, degrees));
  780.         y2 = y + (gEditingObject[playerid][StickDistance] * floatcos(-angle, degrees));
  781.  
  782.         DestroyObject(gObjects[oid][id_o]);
  783.  
  784.         oid = AddNewObjectToScript(model_id, x2, y2, z, 0, 0, angle, objname, oid);
  785.         gEditingObject[playerid][mode] = OED_MOVE_XY;
  786.         gEditingObject[playerid][movestep] = 0.05;
  787.         gEditingObject[playerid][rotatestep] = 1.0;
  788.         gObjects[oid][savetofile] = true;
  789.     }
  790.    
  791.     TogglePlayerControllable(playerid, 1);
  792.    
  793.     SaveObjects();
  794. }
  795.  
  796. /*---------------------------------------------------------------------------------------------------*/
  797.  
  798. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
  799.  
  800.     new msg[MAX_STRING];
  801.     new axis_updown, axis_leftright;
  802.     new editmode;
  803.     new Float:value;
  804.     new Float:x, Float:y, Float:z, Float:angle;
  805.  
  806.     if (IsPlayerInAnyVehicle(playerid)) {
  807.         GetVehiclePos(GetPlayerVehicleID(playerid),x, y, z);
  808.         GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
  809.     } else {
  810.         GetPlayerPos(playerid, x, y, z);
  811.         GetPlayerFacingAngle(playerid, angle);
  812.     }
  813.  
  814.     if (IsPlayerAdmin(playerid))
  815.     {
  816.             if ((gEditingObject[playerid][object_id]) > INVALID_OBJECT)
  817.             {
  818.                 new oid = gEditingObject[playerid][object_id];
  819.  
  820.                 if ((gEditingObject[playerid][domove]) && (!gPlayerMenu[playerid]))  {
  821.                     switch(gEditingObject[playerid][mode]) {
  822.                     case OED_MOVE_XY:
  823.                         {
  824.                             editmode = OED_MOVE;
  825.                             axis_updown = AXIS_Y;
  826.                             axis_leftright = AXIS_X;
  827.                             value = gEditingObject[playerid][movestep];
  828.                         }
  829.                     case OED_MOVE_Z:
  830.                         {
  831.                             editmode = OED_MOVE;
  832.                             axis_updown = AXIS_Z;
  833.                             axis_leftright = AXIS_NONE;
  834.                             value = gEditingObject[playerid][movestep];
  835.                         }
  836.                     case OED_ROTATE_XY:
  837.                         {
  838.                             editmode = OED_ROTATE;
  839.                             axis_updown = AXIS_X;
  840.                             axis_leftright = AXIS_Y;
  841.                             value = gEditingObject[playerid][rotatestep];
  842.                         }
  843.                     case OED_ROTATE_Z:
  844.                         {
  845.                             editmode = OED_ROTATE;
  846.                             axis_updown = AXIS_NONE;
  847.                             axis_leftright = AXIS_Z;
  848.                             value = gEditingObject[playerid][rotatestep];
  849.                         }
  850.                     }
  851.  
  852.                     if (!(gObjectEditTimer[playerid] == 0)) {
  853.                         axis_updown = AXIS_NONE;
  854.                         axis_leftright = AXIS_NONE;
  855.                     }
  856.  
  857.                     //hoch+runter
  858.                     if (newkeys & VKEY_UP) {
  859.                         if (editmode == OED_ROTATE) {
  860.                             if (!(axis_updown == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_updown, value);
  861.                         } else if (editmode == OED_MOVE) {
  862.                             switch (axis_updown) {
  863.                             case AXIS_Y: MoveObject(gObjects[oid][id_o], gObjects[oid][obj_x],gObjects[oid][obj_y]+2000,gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  864.                             case AXIS_Z: MoveObject(gObjects[oid][id_o], gObjects[oid][obj_x],gObjects[oid][obj_y],gObjects[oid][obj_z]+2000,value*gEditingObject[playerid][EditMultiplier]*10);
  865.                             }
  866.                         }
  867.                     }
  868.                     if (newkeys & VKEY_DOWN) {
  869.                         if (editmode == OED_ROTATE) {
  870.                             if (!(axis_updown == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_updown, -value);
  871.                         } else if (editmode == OED_MOVE) {
  872.                             switch (axis_updown) {
  873.                             case AXIS_Y: MoveObject(gObjects[oid][id_o], gObjects[oid][obj_x],gObjects[oid][obj_y]-2000,gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  874.                             case AXIS_Z: MoveObject(gObjects[oid][id_o], gObjects[oid][obj_x],gObjects[oid][obj_y],gObjects[oid][obj_z]-2000,value*gEditingObject[playerid][EditMultiplier]*10);
  875.                             }
  876.                         }
  877.                     }
  878.                     //links+rechts
  879.                     if (newkeys & VKEY_LEFT) {
  880.                         if (editmode == OED_ROTATE) {
  881.                             if (!(axis_leftright == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_leftright, -value);
  882.                         } else if (editmode == OED_MOVE) {
  883.                             switch (axis_leftright) {
  884.                             case AXIS_X: MoveObject(gObjects[oid][id_o], gObjects[oid][obj_x]-2000,gObjects[oid][obj_y],gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  885.                             }
  886.                         }
  887.                     }
  888.                     if (newkeys & VKEY_RIGHT) {
  889.                         if (editmode == OED_ROTATE) {
  890.                             if (!(axis_leftright == AXIS_NONE)) gObjectEditTimer[playerid] = SetTimerEx("ObjectEditTimer", 50, 1, "iiif", playerid, editmode, axis_leftright, value);
  891.                         } else if (editmode == OED_MOVE) {
  892.                             switch (axis_leftright) {
  893.                             case AXIS_X: MoveObject(gObjects[oid][id_o], gObjects[oid][obj_x]+2000,gObjects[oid][obj_y],gObjects[oid][obj_z],value*gEditingObject[playerid][EditMultiplier]*10);
  894.                             }
  895.                         }
  896.                     }
  897.  
  898.  
  899.                     if ((oldkeys & VKEY_UP) |
  900.                         (oldkeys & VKEY_DOWN) |
  901.                         (oldkeys & VKEY_LEFT) |
  902.                         (oldkeys & VKEY_RIGHT))  {
  903.  
  904.                         if (!(gObjectEditTimer[playerid] == 0)) {
  905.                             KillTimer(gObjectEditTimer[playerid]);
  906.                             gObjectEditTimer[playerid] = 0;
  907.                         }
  908.  
  909.                         StopObject(gObjects[oid][id_o]);
  910.                         SaveObjects();
  911.                     }
  912.                 }
  913.  
  914.                 if (newkeys & KEY_WALK) {
  915.                         format(msg, sizeof msg, "- %s -", gObjects[gEditingObject[playerid][object_id]][Name]);
  916.                         gMenus[playerid] = CreateMenu(msg, 1, 350, 190, 250, 0);
  917.                         if (gEditingObject[playerid][stuck]) {
  918.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_DETACH));
  919.                             gMenuMode[playerid] = MM_SELECT_EDITMODE_DETACHONLY;
  920.                         } else {
  921.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_ATTACH));
  922.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_MOVEXY));
  923.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_MOVEZ));
  924.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_ROTXY));
  925.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_ROTZ));
  926.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_ADD));
  927.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_COPY));
  928.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_DEL));
  929.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_MULT));
  930.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_CANCEL));
  931.                             AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_GOTO));
  932.  
  933.                             gMenuMode[playerid] = MM_SELECT_EDITMODE;
  934.                         }
  935.                         if (!(gObjectEditTimer[playerid] == 0)) {
  936.                             KillTimer(gObjectEditTimer[playerid]);
  937.                             gObjectEditTimer[playerid] = 0;
  938.                         }
  939.  
  940.                         StopObject(gObjects[oid][id_o]);
  941.                         SaveObjects();
  942.  
  943.                         TogglePlayerControllable(playerid, 0);
  944.                         ShowMenuForPlayer(gMenus[playerid], playerid);
  945.                         gPlayerMenu[playerid] = true;
  946.                 }
  947.  
  948.                 if (newkeys & KEY_CROUCH) {
  949.                     gEditingObject[playerid][domove] = !gEditingObject[playerid][domove];
  950.                     if (gEditingObject[playerid][domove]) {
  951.                         format(msg, sizeof msg, "%s - %s", gObjects[gEditingObject[playerid][object_id]][Name], GetLMsg(playerid,MSG_MOVEENABLED));
  952.                         OnPlayerCommandText(playerid, "/orelease");
  953.                         TogglePlayerControllable(playerid, 0);
  954.                         if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, oid);
  955.                     } else {
  956.                         CancelEditObject(playerid);
  957.  
  958.                         format(msg, sizeof msg, "%s - %s", gObjects[gEditingObject[playerid][object_id]][Name], GetLMsg(playerid,MSG_MOVEDISABLED));
  959.                     }
  960.                     SystemMessage(playerid, msg, COLOR_YELLOW);
  961.                 }
  962.             }
  963.             else if (newkeys & KEY_WALK)
  964.             {
  965.                 gMenus[playerid] = CreateMenu(GetLMsg(playerid,M_SELECT), 1, 350, 200, 250, 0);
  966.                 AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_ADD));
  967.                 AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_RELOADALL));
  968.                 AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_MULT));
  969.                 AddMenuItem(gMenus[playerid], 0, GetLMsg(playerid,M_CANCEL));
  970.                 gMenuMode[playerid] = MM_SELECT_ADDMODE;
  971.                 TogglePlayerControllable(playerid, 0);
  972.                 ShowMenuForPlayer(gMenus[playerid], playerid);
  973.                 gPlayerMenu[playerid] = true;
  974.             }
  975.     }
  976.  
  977.     return 1;
  978. }
  979.  
  980. /*---------------------------------------------------------------------------------------------------*/
  981.  
  982. public OnPlayerExitedMenu(playerid) {
  983.     if(gPlayerMenu[playerid])
  984.     {
  985.         HideMenuForPlayer(gMenus[playerid], playerid);
  986.         DestroyMenu(gMenus[playerid]);
  987.         gPlayerMenu[playerid] = false;
  988.         TogglePlayerControllable(playerid, !(gEditingObject[playerid][domove]));
  989.     }
  990.     return 1;
  991. }
  992.  
  993. /*---------------------------------------------------------------------------------------------------*/
  994.  
  995. public OnPlayerSelectedMenuRow(playerid, row) {
  996.     new Menu:current = GetPlayerMenu(playerid);
  997.    
  998.     if(current == gMenus[playerid])
  999.     {
  1000.         TogglePlayerControllable(playerid, !(gEditingObject[playerid][domove]));
  1001.         new obj_id = gEditingObject[playerid][object_id];
  1002.        
  1003.         HideMenuForPlayer(gMenus[playerid], playerid);
  1004.         DestroyMenu(gMenus[playerid]);
  1005.         gPlayerMenu[playerid] = false;
  1006.        
  1007.         new temp[MAX_STRING];
  1008.         new items[10][MAX_STRING] = {
  1009.             "0.005x",
  1010.             "0.05x",
  1011.             "0.5x",
  1012.             "1x",
  1013.             "2x",
  1014.             "5x",
  1015.             "10x",
  1016.             "20x",
  1017.             "25x",
  1018.             "45x"
  1019.          };
  1020.  
  1021.         switch (gMenuMode[playerid]) {
  1022.             case MM_SELECT_EDITMODE:
  1023.                 {
  1024.                     switch (row) {
  1025.                     case 0: //"Attach to player",
  1026.                         {
  1027.                             OnPlayerCommandText(playerid, "/ostick");
  1028.                         }
  1029.                     case 1: //"Move on X/Y Axis"
  1030.                         {
  1031.                             gEditingObject[playerid][domove] = true;
  1032.                             TogglePlayerControllable(playerid, 0);
  1033.                             if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  1034.                             OnPlayerCommandText(playerid, "/omode m_xy");
  1035.                         }
  1036.                     case 2: //"Move on Z Axis"
  1037.                         {
  1038.                             gEditingObject[playerid][domove] = true;
  1039.                             TogglePlayerControllable(playerid, 0);
  1040.                             if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  1041.                             OnPlayerCommandText(playerid, "/omode m_z");
  1042.                         }
  1043.                     case 3: //"Rotate on X/Y Axis"
  1044.                         {
  1045.                             gEditingObject[playerid][domove] = true;
  1046.                             TogglePlayerControllable(playerid, 0);
  1047.                             if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  1048.                             OnPlayerCommandText(playerid, "/omode r_xy");
  1049.                         }
  1050.                     case 4: //"Rotate on Z Axis"
  1051.                         {
  1052.                             gEditingObject[playerid][domove] = true;
  1053.                             TogglePlayerControllable(playerid, 0);
  1054.                             if (gCameraSetTimer[playerid] == 0) gCameraSetTimer[playerid] = SetTimerEx("SetObjectCoords", 25, 1, "ii", playerid, obj_id);
  1055.                             OnPlayerCommandText(playerid, "/omode r_z");
  1056.                         }
  1057.                     case 5: //"Add objetct"
  1058.                         {
  1059.                             ShowPlayerDialog(playerid, menu_add, DIALOG_STYLE_LIST, GetLMsg(playerid,M_DESC_ADD_CATEGORY), listcat, GetLMsg(playerid,M_VIEW), GetLMsg(playerid,M_CANCEL));
  1060.                         }
  1061.                     case 6: //"Copy"
  1062.                         {
  1063.                             new objname[MAX_STRING];
  1064.                             format(objname, sizeof objname, "/ocopy cpy_%s", gObjects[obj_id][Name]);
  1065.                             OnPlayerCommandText(playerid, objname);
  1066.                         }
  1067.                     case 7: //"Delete"
  1068.                         {
  1069.                             OnPlayerCommandText(playerid, "/odel");
  1070.                         }
  1071.                     case 8: //"Multiplier"
  1072.                         {
  1073.                             gMenus[playerid] = CreateMenu(GetLMsg(playerid,M_MULT), 1, 350,180, 250, 0);
  1074.                             temp = "~w~";
  1075.                             strcat(temp, items[gSelectedMultiplier[playerid]]);
  1076.                             items[gSelectedMultiplier[playerid]] = temp;
  1077.  
  1078.                             for(new i=0;i<=9;i++) {
  1079.                                 AddMenuItem(gMenus[playerid], 0, items[i]);
  1080.                             }
  1081.  
  1082.                             gMenuMode[playerid] = MM_SELECT_MULTIPLIER;
  1083.                             TogglePlayerControllable(playerid, 0);
  1084.                             ShowMenuForPlayer(gMenus[playerid], playerid);
  1085.                             gPlayerMenu[playerid] = true;
  1086.                         }
  1087.                     case 9: //"Cancel"
  1088.                         {
  1089.                            CancelEditObject(playerid);
  1090.                         }
  1091.                     case 10: //Goto
  1092.                         {
  1093.                             new str[256];
  1094.                             format(str,sizeof(str),"/ogoto %s", gObjects[obj_id][Name]);
  1095.                             OnPlayerCommandText(playerid, str);
  1096.                         }
  1097.                     }
  1098.                 }
  1099.             case MM_SELECT_EDITMODE_DETACHONLY:
  1100.                 {
  1101.                     switch (row) {
  1102.                     case 0: //"Detach from player",
  1103.                         {
  1104.                             OnPlayerCommandText(playerid, "/orelease");
  1105.                         }
  1106.                     }
  1107.                 }
  1108.             case MM_SELECT_MULTIPLIER:
  1109.                 {
  1110.                     switch (row) {
  1111.                     case 0: gEditingObject[playerid][EditMultiplier]  = 0.005;       //"0.005x",
  1112.                     case 1: gEditingObject[playerid][EditMultiplier]  = 0.050;       //"0.05x",
  1113.                     case 2: gEditingObject[playerid][EditMultiplier]  = 0.5;       //"0.5x",
  1114.                     case 3: gEditingObject[playerid][EditMultiplier]  = 1;       //"1x",
  1115.                     case 4: gEditingObject[playerid][EditMultiplier]  = 2;       //"2x",
  1116.                     case 5: gEditingObject[playerid][EditMultiplier]  = 5;       //"5x",
  1117.                     case 6: gEditingObject[playerid][EditMultiplier]  = 10;       //"10x",
  1118.                     case 7: gEditingObject[playerid][EditMultiplier]  = 20;       //"20x",
  1119.                     case 8: gEditingObject[playerid][EditMultiplier]  = 25;       //"25x",
  1120.                     case 9: gEditingObject[playerid][EditMultiplier]  = 45;       //"45x"
  1121.                     }
  1122.  
  1123.                     gSelectedMultiplier[playerid] = row;
  1124.                     TogglePlayerControllable(playerid, !gEditingObject[playerid][domove]);
  1125.                 }
  1126.             case MM_SELECT_ADDMODE:
  1127.                 {
  1128.                     switch (row) {
  1129.                         case 0:
  1130.                             ShowPlayerDialog(playerid, menu_add, DIALOG_STYLE_LIST, GetLMsg(playerid,M_DESC_ADD_CATEGORY), listcat, GetLMsg(playerid,M_VIEW), GetLMsg(playerid,M_CANCEL)); // Add Object
  1131.                         case 1://Reload all
  1132.                         {
  1133.                             SaveObjects();
  1134.                             DestroyObjects();
  1135.                             ReadObjects();
  1136.                         }
  1137.                         case 2://Multipler
  1138.                         {
  1139.                                 gMenus[playerid] = CreateMenu(GetLMsg(playerid,M_MULT), 1, 350,180, 250, 0);
  1140.                                 temp = "~w~";
  1141.                                 strcat(temp, items[gSelectedMultiplier[playerid]]);
  1142.                                 items[gSelectedMultiplier[playerid]] = temp;
  1143.                                 for(new i=0;i<=9;i++) {
  1144.                                     AddMenuItem(gMenus[playerid], 0, items[i]);
  1145.                                 }
  1146.                                 gMenuMode[playerid] = MM_SELECT_MULTIPLIER;
  1147.                                 TogglePlayerControllable(playerid, 0);
  1148.                                 ShowMenuForPlayer(gMenus[playerid], playerid);
  1149.                                 gPlayerMenu[playerid] = true;
  1150.                         }
  1151.                         case 3: //Cancel
  1152.                         {
  1153.                             CancelEditObject(playerid);
  1154.                         }
  1155.                     }
  1156.                 }
  1157.         }
  1158.     }
  1159.     return 1;
  1160. }
  1161.  
  1162. /*---------------------------------------------------------------------------------------------------*/
  1163.  
  1164. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  1165. {
  1166.     if(dialogid == menu_add)
  1167.     {
  1168.         if(response)
  1169.         {
  1170.             new file[256], n;
  1171.             set(file,inputtext);
  1172.             strcat(file,".txt");
  1173.             n = GetNumberObjects(file);
  1174.             if(n <=80)
  1175.             {
  1176.                 ReadListObjetects(lista[playerid],file);
  1177.                 format(file, sizeof(file), "%s", inputtext);
  1178.                 ShowPlayerDialog(playerid, menu_add+2, DIALOG_STYLE_LIST, file, lista[playerid], GetLMsg(playerid,M_NEXT), GetLMsg(playerid,M_CANCEL));
  1179.             }
  1180.             else
  1181.             {
  1182.                 gPlayer[playerid][vindex] = 1;
  1183.                 set(gPlayer[playerid][vfile],file);
  1184.                 ReadListObjetects(lista[playerid],file);
  1185.                 format(file, sizeof(file), "%s - Page 1", inputtext);
  1186.                 ShowPlayerDialog(playerid, menu_add+3, DIALOG_STYLE_LIST, file, lista[playerid], GetLMsg(playerid,M_NEXT), GetLMsg(playerid,M_NEXTPAGE));
  1187.             }
  1188.         }
  1189.         else
  1190.             SystemMessage(playerid, GetLMsg(playerid,MSG_CANCELED), COLOR_RED);
  1191.     }
  1192.     else if(dialogid == menu_add+1)
  1193.     {
  1194.         if(response)
  1195.         {
  1196.             new str[256];
  1197.             format(str, sizeof(str), "/oadd %d %s", gPlayer[playerid][id_sel], inputtext);
  1198.             OnPlayerCommandText(playerid, str);
  1199.         }
  1200.         else
  1201.             SystemMessage(playerid, GetLMsg(playerid,MSG_CANCELED), COLOR_RED);
  1202.     }
  1203.     else if(dialogid == menu_add+2)
  1204.     {
  1205.         if(response)
  1206.         {
  1207.             new i=0;
  1208.             gPlayer[playerid][id_sel] = strval(strtok(inputtext,i,'-'));
  1209.             ShowPlayerDialog(playerid, menu_add+1, DIALOG_STYLE_INPUT, GetLMsg(playerid,M_ONAME_TITLE), GetLMsg(playerid,M_DESC_ONAME), GetLMsg(playerid,M_ADD), GetLMsg(playerid,M_CANCEL));
  1210.         }
  1211.         else
  1212.             SystemMessage(playerid, GetLMsg(playerid,MSG_CANCELED), COLOR_RED);
  1213.     }
  1214.     else if(dialogid == menu_add+3)
  1215.     {
  1216.         if(response)
  1217.         {
  1218.             new i=0;
  1219.             gPlayer[playerid][id_sel] = strval(strtok(inputtext,i,'-'));
  1220.             ShowPlayerDialog(playerid, menu_add+1, DIALOG_STYLE_INPUT, GetLMsg(playerid,M_ONAME_TITLE), GetLMsg(playerid,M_DESC_ONAME), GetLMsg(playerid,M_ADD), GetLMsg(playerid,M_CANCEL));
  1221.         }
  1222.         else
  1223.         {
  1224.             gPlayer[playerid][vindex]++;
  1225.             new n = GetNumberObjectsPage(gPlayer[playerid][vfile], gPlayer[playerid][vindex]);
  1226.             new str[256];
  1227.             ReadListObjetects(lista[playerid],gPlayer[playerid][vfile],gPlayer[playerid][vindex]);
  1228.             strmid(str,gPlayer[playerid][vfile],0,strlen(gPlayer[playerid][vfile])-5);
  1229.             format(str, sizeof(str), "%s - Page %d", str, gPlayer[playerid][vindex]);
  1230.             if(n == 80)
  1231.                 ShowPlayerDialog(playerid, menu_add+3, DIALOG_STYLE_LIST, str, lista[playerid], GetLMsg(playerid,M_NEXT), GetLMsg(playerid,M_NEXTPAGE));
  1232.             else
  1233.                 ShowPlayerDialog(playerid, menu_add+2, DIALOG_STYLE_LIST, str, lista[playerid], GetLMsg(playerid,M_NEXT), GetLMsg(playerid,M_CANCEL));
  1234.         }
  1235.     }
  1236.     return 1;
  1237. }
  1238.  
  1239. /*---------------------------------------------------------------------------------------------------*/
  1240.  
  1241. stock SystemMessage(playerid, text[], color) {
  1242.     new msg[MAX_STRING];
  1243.  
  1244.     format(msg, sizeof msg, "[OED] %s", text);
  1245.  
  1246.     if (playerid == -1) {   //an alle
  1247.         SendClientMessageToAll(color, msg);
  1248.     } else {
  1249.         if (IsPlayerConnected(playerid)) {
  1250.             SendClientMessage(playerid, color, msg);
  1251.         }
  1252.     }
  1253.  
  1254.     return 1;
  1255. }
  1256.  
  1257. /*===================================================================================================*/
  1258. /* Objectfunktionen */
  1259. stock ReadObjects() {
  1260.     new File:hFile;
  1261.     new tmpres[MAX_STRING],i=0;
  1262.  
  1263.     new newoid;
  1264.  
  1265.     new modelid;
  1266.     new Float:x;
  1267.     new Float:y;
  1268.     new Float:z;
  1269.     new Float:rotx;
  1270.     new Float:roty;
  1271.     new Float:rotz;
  1272.     new ObjectName[MAX_STRING];
  1273.    
  1274.     new file[256];
  1275.     set(file, F_DIRECTORY);
  1276.     strcat(file,"BREAD_OED.TXT");
  1277.  
  1278.     if (!(fexist(file))) {
  1279.         new msg[256];
  1280.         format(msg,sizeof(msg), "[OED] %s File: '%s'", GetLMsg(-1,MSG_FNOTFOUND), file);
  1281.         printf("[OED] %s", msg);
  1282.         return 0;
  1283.     }
  1284.     else {
  1285.         hFile = fopen(file, io_read);
  1286.         tmpres[0]=0;
  1287.         while (fread(hFile, tmpres)) {
  1288.             StripNewLine(tmpres);
  1289.             if (tmpres[0]!=0) {      
  1290.                 //modelid
  1291.                 modelid = strval(strtok(tmpres,i,','));
  1292.                 //spawn X
  1293.                 x = Float:floatstr(strtok(tmpres,i,','));
  1294.                 //spawn Y
  1295.                 y = Float:floatstr(strtok(tmpres,i,','));
  1296.                 //spawn Z
  1297.                 z = Float:floatstr(strtok(tmpres,i,','));
  1298.                 //rotation x
  1299.                 rotx = Float:floatstr(strtok(tmpres,i,','));
  1300.                 //rotation y
  1301.                 roty = Float:floatstr(strtok(tmpres,i,','));
  1302.                 //rotation z
  1303.                 rotz = Float:floatstr(strtok(tmpres,i,','));
  1304.                 //name
  1305.                 set(ObjectName,strtok(tmpres,i,','));
  1306.                 //printf("Objeto %d - %d , %f , %f , %f, %f, %f, %f, %s", gObjectCount, modelid, x, y, z, rotx, roty, rotz, ObjectName);
  1307.                 if (gObjectCount < MAX_OBJECTS) {
  1308.                     newoid = gObjectCount;
  1309.                     gObjects[newoid][id_o] = CreateObject(modelid, x, y, z, rotx, roty, rotz, OBJECT_DISTANCE);
  1310.                     gObjects[newoid][ModelID] = modelid;
  1311.                     gObjects[newoid][obj_x] = x;
  1312.                     gObjects[newoid][obj_y] = y;
  1313.                     gObjects[newoid][obj_z] = z;
  1314.                     gObjects[newoid][rot_x] = rotx;
  1315.                     gObjects[newoid][rot_y] = roty;
  1316.                     gObjects[newoid][rot_z] = rotz;
  1317.                     gObjects[newoid][Name] = ObjectName;
  1318.                     gObjects[newoid][savetofile] = true;
  1319.                     gObjectCount++;
  1320.                 }
  1321.             }
  1322.             tmpres[0]=0;
  1323.             i=0;
  1324.         }
  1325.         fclose(hFile);
  1326.         return 1;
  1327.     }
  1328. }
  1329.  
  1330.  
  1331. /*---------------------------------------------------------------------------------------------------*/
  1332. stock DestroyObjects() {
  1333.     for(new i=0; i<gObjectCount;i++)
  1334.     {
  1335.         DestroyObject(gObjects[i][id_o]);
  1336.     }
  1337.     gObjectCount = 0;
  1338. }
  1339. /*---------------------------------------------------------------------------------------------------*/
  1340. stock SaveObjects() {
  1341.     new File:hFile;
  1342.     new line[MAX_STRING];
  1343.    
  1344.     new file[256];
  1345.     set(file, F_DIRECTORY);
  1346.     strcat(file,"BREAD_OED.TXT");
  1347.  
  1348.     hFile = fopen(file, io_write);
  1349.  
  1350.     for (new i=0;i<gObjectCount;i++) {
  1351.         if (gObjects[i][savetofile]) {
  1352.             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]);
  1353.             fwrite(hFile, line);
  1354.         }
  1355.     }
  1356.  
  1357.     fclose(hFile);
  1358.  
  1359.     return 1;
  1360. }
  1361.  
  1362. /*---------------------------------------------------------------------------------------------------*/
  1363.  
  1364. stock AddNewObjectToScript(modelid,Float:x,Float:y,Float:z,Float:rotx,Float:roty,Float:rotz,ObjectName[MAX_STRING], oid=INVALID_OBJECT) {
  1365.     new newoid;
  1366.  
  1367.     if(oid > INVALID_OBJECT)
  1368.         newoid = oid;
  1369.     else if(gObjectCount < MAX_OBJECTS)
  1370.     {
  1371.         newoid = gObjectCount;
  1372.         gObjectCount++;
  1373.     }
  1374.  
  1375.     if (gObjectCount < MAX_OBJECTS) {
  1376.    
  1377.         gObjects[newoid][id_o] = CreateObject(modelid, x, y, z, rotx, roty, rotz, OBJECT_DISTANCE);
  1378.         gObjects[newoid][ModelID] = modelid;
  1379.         gObjects[newoid][obj_x] = x;
  1380.         gObjects[newoid][obj_y] = y;
  1381.         gObjects[newoid][obj_z] = z;
  1382.         gObjects[newoid][rot_x] = rotx;
  1383.         gObjects[newoid][rot_y] = roty;
  1384.         gObjects[newoid][rot_z] = rotz;
  1385.         gObjects[newoid][Name] = ObjectName;
  1386.  
  1387.         return newoid;
  1388.     } else {
  1389.         return 0;
  1390.     }
  1391. }
  1392.  
  1393. /*---------------------------------------------------------------------------------------------------*/
  1394.  
  1395. stock GetPlayerNearestObjects(playerid) {
  1396.     new Float:x1, Float:y1, Float:z1;
  1397.     new Float:x2, Float:y2, Float:z2;
  1398.     new Float:distances[MAX_OBJECTS][2];
  1399.     new j;
  1400.     new objects[24];
  1401.  
  1402.     GetPlayerPos(playerid, x1, y1, z1);
  1403.  
  1404.     for (new i=0;i<gObjectCount;i++) {
  1405.         GetObjectPos(gObjects[i][id_o], x2, y2, z2);
  1406.         distances[i][0] = GetDistanceBetweenCoords(x1, y1, z1, x2, y2, z2);
  1407.         distances[i][1] = float(i);
  1408.     }
  1409.  
  1410.     distances = FloatBubbleSort(distances, MAX_OBJECTS);
  1411.  
  1412.     for (new i=0;i<MAX_OBJECTS;i++) {
  1413.         if (!(floatround(distances[i][1]) == 0)) {
  1414.             if (j < 24) {
  1415.                 j++;
  1416.                 objects[j] = floatround(distances[i][1]);
  1417.             }
  1418.         }
  1419.     }
  1420.  
  1421.     return objects;
  1422. }
  1423.  
  1424. /*---------------------------------------------------------------------------------------------------*/
  1425.  
  1426. stock Float:GetDistanceBetweenCoords(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
  1427.     return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
  1428. }
  1429.  
  1430. /*---------------------------------------------------------------------------------------------------*/
  1431.  
  1432. stock Float:FloatBubbleSort(Float:lArray[MAX_OBJECTS][2], lArraySize) {
  1433.     new Float:lSwap;
  1434.     new bool:bSwapped = true;
  1435.     new I;
  1436.  
  1437.     while(bSwapped) {
  1438.         bSwapped = false;
  1439.         for(I = 0; I < lArraySize - 1; I++) {
  1440.             if(lArray[I+1][0] < lArray[I][0]) {
  1441.                 lSwap = lArray[I][0];
  1442.                 lArray[I][0] = lArray[I+1][0];
  1443.                 lArray[I+1][0] = lSwap;
  1444.  
  1445.                 lSwap = lArray[I][1];
  1446.                 lArray[I][1] = lArray[I+1][1];
  1447.                 lArray[I+1][1] = lSwap;
  1448.  
  1449.                 bSwapped = true;
  1450.             }
  1451.         }
  1452.     }
  1453.  
  1454.     return lArray;
  1455. }
  1456.  
  1457. /*---------------------------------------------------------------------------------------------------*/
  1458.  
  1459. public ObjectEditTimer(playerid, editmode, axis, Float:value){
  1460.     new Float:x, Float:y, Float:z;
  1461.     new Float:rotx, Float:roty, Float:rotz;
  1462.     new oid;
  1463.  
  1464.     if ((gEditingObject[playerid][domove]) && (gEditingObject[playerid][object_id] > INVALID_OBJECT)) {
  1465.         value = floatmul(value, gEditingObject[playerid][EditMultiplier]);
  1466.  
  1467.         oid = gEditingObject[playerid][object_id];
  1468.  
  1469.         GetObjectPos(gObjects[oid][id_o], x, y, z);
  1470.         GetObjectRot(gObjects[oid][id_o], rotx, roty, rotz);
  1471.  
  1472.         switch(axis) {
  1473.         case AXIS_X:
  1474.             {
  1475.                 x = floatadd(x, value);
  1476.                 rotx = floatadd(rotx, value);
  1477.             }
  1478.         case AXIS_Y:
  1479.             {
  1480.                 y = floatadd(y, value);
  1481.                 roty = floatadd(roty, value);
  1482.             }
  1483.         case AXIS_Z:
  1484.             {
  1485.                 z = floatadd(z, value);
  1486.                 rotz = floatadd(rotz, value);
  1487.             }
  1488.         }
  1489.  
  1490.         switch (editmode) {
  1491.         case OED_MOVE:
  1492.             {
  1493.                 SetObjectPos(gObjects[oid][id_o], x, y, z);
  1494.                 gObjects[oid][obj_x] = x;
  1495.                 gObjects[oid][obj_y] = y;
  1496.                 gObjects[oid][obj_z] = z;
  1497.             }
  1498.         case OED_ROTATE:
  1499.             {
  1500.                 SetObjectRot(gObjects[oid][id_o], rotx, roty, rotz);
  1501.                 gObjects[oid][rot_x] = rotx;
  1502.                 gObjects[oid][rot_y] = roty;
  1503.                 gObjects[oid][rot_z] = rotz;
  1504.             }
  1505.         }
  1506.     }
  1507.  
  1508.     return 1;
  1509. }
  1510.  
  1511. /*---------------------------------------------------------------------------------------------------*/
  1512.  
  1513. public UpDownLeftRightAdditionTimer() {
  1514.     new keys, leftright, updown;
  1515.     new oldkeys;
  1516.  
  1517.     for (new i=0;i<MAX_PLAYERS;i++) {
  1518.         if (IsPlayerConnected(i) && IsPlayerAdmin(i)) {
  1519.             GetPlayerKeys(i, keys, updown, leftright);
  1520.  
  1521.             //links+rechts
  1522.             if (leftright == KEY_LEFT) {
  1523.                 if (!(gLastPlayerKeys[i][0] == leftright)) OnPlayerKeyStateChange(i, VKEY_LEFT, 0);
  1524.             } else if (leftright == KEY_RIGHT) {
  1525.                 if (!(gLastPlayerKeys[i][0] == leftright)) OnPlayerKeyStateChange(i, VKEY_RIGHT, 0);
  1526.             } else {
  1527.                 if (gLastPlayerKeys[i][0] == KEY_LEFT) {
  1528.                     oldkeys = VKEY_LEFT;
  1529.                 } else if (gLastPlayerKeys[i][0] == KEY_RIGHT) {
  1530.                     oldkeys = VKEY_DOWN;
  1531.                 }
  1532.                 if (!(gLastPlayerKeys[i][0] == leftright)) OnPlayerKeyStateChange(i, 0, oldkeys);
  1533.             }
  1534.  
  1535.             //hoch+runter
  1536.             if (updown == KEY_UP) {
  1537.                 if (!(gLastPlayerKeys[i][1] == updown)) OnPlayerKeyStateChange(i, VKEY_UP, 0);
  1538.             } else if (updown == KEY_DOWN) {
  1539.                 if (!(gLastPlayerKeys[i][1] == updown)) OnPlayerKeyStateChange(i, VKEY_DOWN, 0);
  1540.             } else {
  1541.                 if (gLastPlayerKeys[i][1] == KEY_UP) {
  1542.                     oldkeys = VKEY_UP;
  1543.                 } else if (gLastPlayerKeys[i][1] == KEY_DOWN){
  1544.                     oldkeys = VKEY_DOWN;
  1545.                 }
  1546.                 if (!(gLastPlayerKeys[i][1] == updown)) OnPlayerKeyStateChange(i, 0, oldkeys);
  1547.             }
  1548.  
  1549.             gLastPlayerKeys[i][0] = leftright;
  1550.             gLastPlayerKeys[i][1] = updown;
  1551.         }
  1552.     }
  1553.  
  1554.     return 1;
  1555. }
  1556.  
  1557. /*---------------------------------------------------------------------------------------------------*/
  1558.  
  1559. public SetObjectCoords(playerid, obj_id) {
  1560.     new Float:x, Float:y, Float:z;
  1561.  
  1562.     GetObjectPos(gObjects[obj_id][id_o], x, y, z);
  1563.  
  1564.     if (!((x == gObjects[obj_id][obj_x]) &&
  1565.           (y == gObjects[obj_id][obj_y]) &&
  1566.           (z == gObjects[obj_id][obj_z]))) {
  1567.  
  1568.         gObjects[obj_id][obj_x] = x;
  1569.         gObjects[obj_id][obj_y] = y;
  1570.         gObjects[obj_id][obj_z] = z;
  1571.     }
  1572.  
  1573.     GetPlayerPos(playerid, x, y, z);
  1574.     SetPlayerCameraPos(playerid, x, y, z);
  1575.     SetPlayerCameraLookAt(playerid, gObjects[obj_id][obj_x], gObjects[obj_id][obj_y], gObjects[obj_id][obj_z]);
  1576.  
  1577.     return 1;
  1578. }
  1579. /*---------------------------------------------------------------------------------------------------*/
  1580.  
  1581. stock ReadListObjetects(list [], file[]="index.ini", index=1)
  1582. {
  1583.     new farq[256];
  1584.     set(farq,file);
  1585.     format(file,MAX_STRING,"%slist_objects/%s",F_DIRECTORY, file);
  1586.     new line[256], File:fl = fopen(file,io_append), first=(index-1)*80, i=0, last = index*80;
  1587.     list[0] = 0;
  1588.     fclose(fl);
  1589.     fl = fopen(file,io_read);
  1590.     while(i < last && fread(fl, line))
  1591.     {
  1592.         if(i < first)
  1593.         {
  1594.             i++;
  1595.             continue;
  1596.         }
  1597.         StripNewLine(line);
  1598.         if(line[0] == '/')
  1599.             continue;
  1600.         strcat(list,line,4096);
  1601.         strcat(list,"\n",4096);
  1602.         i++;
  1603.     }
  1604.     if(list[strlen(list)-1] == '\n')
  1605.         list[strlen(list)-1] = 0;
  1606.     fclose(fl);
  1607.     set(file,farq);
  1608.     return list;
  1609. }
  1610.  
  1611. stock GetNumberObjects(file[]="index.ini")
  1612. {
  1613.     new farq[256];
  1614.     set(farq,file);
  1615.     format(file,MAX_STRING,"%slist_objects/%s",F_DIRECTORY, file);
  1616.     new line[256], File:fl = fopen(file,io_append), i=0;
  1617.     fclose(fl);
  1618.     fl = fopen(file,io_read);
  1619.     while(fread(fl, line))
  1620.         i++;
  1621.     fclose(fl);
  1622.     set(file,farq);
  1623.     return i;
  1624. }
  1625.  
  1626.  
  1627. stock GetNumberObjectsPage(file[]="index.ini", index)
  1628. {
  1629.     new farq[256];
  1630.     set(farq,file);
  1631.     format(file,MAX_STRING,"%slist_objects/%s",F_DIRECTORY, file);
  1632.     new line[256], File:fl = fopen(file,io_append), first=(index-1)*80, i=0, last = index*80;
  1633.     fclose(fl);
  1634.     fl = fopen(file,io_read);
  1635.     while(i < last && fread(fl, line))
  1636.     {
  1637.         if(i < first)
  1638.         {
  1639.             i++;
  1640.             continue;
  1641.         }
  1642.         i++;
  1643.     }
  1644.     fclose(fl);
  1645.     set(file,farq);
  1646.     return (i-first);
  1647. }
  1648. /*---------------------------------------------------------------------------------------------------*/
  1649.  
  1650. stock ReadLangs()
  1651. {
  1652.     new file[256], line[256], i=0;
  1653.     format(file,MAX_STRING,"%slanguages/index.ini",F_DIRECTORY);
  1654.     new File:fl = fopen(file,io_append);
  1655.     fclose(fl);
  1656.     fl = fopen(file,io_read);
  1657.     while(i < MAX_LANGS && fread(fl, line))
  1658.     {
  1659.         StripNewLine(line);
  1660.         set(Langs[i], line);
  1661.         i++;
  1662.     }
  1663.     Langs_Imp = i;
  1664.     fclose(fl);
  1665. }
  1666.  
  1667. stock GetLMsg(playerid, ELANG:message)
  1668. {
  1669.     new lfile[256];
  1670.     if(playerid > -1)
  1671.         format(lfile,sizeof(lfile),"%slanguages/%s.txt",F_DIRECTORY,plang[playerid]);
  1672.     else
  1673.         format(lfile,sizeof(lfile),"%slanguages/%s.txt",F_DIRECTORY,Langs[0]);
  1674.     new ret[256], line[256], File:fl, i=0;
  1675.     ret[0] = 0;
  1676.     fl = fopen(lfile,io_read);
  1677.     if(!fl)
  1678.     {
  1679.         printf("[OED] %s File: %s", GetLMsg(-1,MSG_FNOTFOUND), lfile);
  1680.         return ret;
  1681.     }
  1682.     while(ELANG: i < message && fread(fl, line))
  1683.     {
  1684.         i++;
  1685.         StripNewLine(line);
  1686.     }
  1687.     if(fread(fl, line))
  1688.     {
  1689.         StripNewLine(line);
  1690.         set(ret,line);
  1691.     }
  1692.     fclose(fl);
  1693.     return ret;
  1694. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement