Object Editor
Страница: 1
Сообщений 1 страница 5 из 5
Поделиться32021-03-16 11:33:52
перезалив up 09/07/20 Багофикс версия 0.20 ЯндексДиск #1
перезалив up 09/07/20 Багофикс версия 0.20 ЯндексДиск #2
[good]
Поделиться42021-08-29 00:02:25
Багофикс.
код
Код:#include <a_vicemp> #include <dini> //////////////////////////////////// const MAX_DECORATIONS = 100;//Выставите на свое кол во #pragma tabsize 0 #define EDIT_MOVE 0 #define EDIT_ROT 1 #define COLOR_GREEN 0x00FF00FF #define HOLDING(%0) ((newkeys & (%0)) == (%0)) // Когда игрок удерживает кнопку #define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0))) // Когда игрок нажал кнопку #define RELEASED(%0) (((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0))) // Когда игрок отпустил нажатую кнопку // Добыто из wiki.sa-mp.com/wiki/OnPlayerKeyStateChange /////////////////////////////////// new Float: X, Float: Y, Float: Z, Float: RX, Float: RY, Float: RZ; new Model_Id[MAX_DECORATIONS]; new Created[MAX_PLAYERS]; new OBJECT[MAX_PLAYERS]; new obj; new model; new LoadingObject = 0; new editMode[MAX_PLAYERS]; new bool: playerInEditMode[MAX_PLAYERS]; new Text:StatsEditTextDraw[MAX_PLAYERS]; new file[128]; new Float:rotateSpeed = 1.0; new Float:SpeedObject = 2.5; public OnFilterScriptInit() { LoadObject(); return 1; } forward LoadObject(); public LoadObject() { new t; for (new i=1;i<=MAX_DECORATIONS;i++) { format(file, sizeof(file), "Object/%d.ini",i); if(dini_Exists(file)) { LoadingObject++; Model_Id[i] = dini_Int(file,"ObjectID"); X = dini_Float(file,"Posx"); Y = dini_Float(file,"Posy"); Z = dini_Float(file,"Posz"); RX = dini_Float(file,"rPosx"); RY = dini_Float(file,"rPosy"); RZ = dini_Float(file,"rPosz"); OBJECT[t] = CreateObject(Model_Id[i], X, Y, Z, RX, RY, RZ); } } printf("Загружено Объектов[%d]", LoadingObject); return 1; } public OnPlayerConnect(playerid) { StatsEditTextDraw[playerid] = TextDrawCreate(8.00000, 437.00000,"_"); TextDrawFont(StatsEditTextDraw[playerid],2); TextDrawLetterSize(StatsEditTextDraw[playerid],0.25,1.0); return 1; } public OnPlayerUpdate(playerid) { new str[300]; GetObjectPos(OBJECT[playerid],X,Y,Z); GetObjectRot(OBJECT[playerid],RX,RY,RZ); format(str,sizeof(str)," X: %f Y: %f Z: %f RX: %f RY: %f RZ: %f rotateSpeed: 2b_1f",X,Y,Z,RX,RY,RZ,rotateSpeed); TextDrawSetString(Text:StatsEditTextDraw[playerid],str); return 1; } public OnPlayerSpawn(playerid) { playerInEditMode[playerid] = false; SendClientMessage(playerid,COLOR_GREEN," * Команды редактора - /cmdred"); return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { new str[256]; new cmd[256]; new tmp[256]; new idx; cmd = strtok(cmdtext, idx); if (strcmp(cmd, "/cmdred", true) == 0) { if(IsPlayerAdmin(playerid)) { SendClientMessage(playerid,COLOR_GREEN,"Создать объект - /create [ID модели]"); SendClientMessage(playerid,COLOR_GREEN,"Редактировать объект - /edit [Тип режима (0-1)] [ID объекта]"); SendClientMessage(playerid,COLOR_GREEN,"...Режим 0 редактирование позиции объекта"); SendClientMessage(playerid,COLOR_GREEN,"...Режим 1 редактирование ротации объекта"); SendClientMessage(playerid,COLOR_GREEN,"Скорость вращения объекта - /rs (0 - 5)"); SendClientMessage(playerid,COLOR_GREEN,"Скорость перемещения объекта - /rd (0 - 5)"); SendClientMessage(playerid,COLOR_GREEN,"Удалить объект - /delete [ID объекта]"); SendClientMessage(playerid,COLOR_GREEN,"Создать дубликат объекта с последним объектом - /dublecatea"); SendClientMessage(playerid,COLOR_GREEN,"Создать дубликат объекта с другим объектом на ваш выбор - /dublecateb [ID объекта]"); } return 1; } if (strcmp(cmd, "/rs", true) == 0) { if(IsPlayerAdmin(playerid)) { if ( playerInEditMode[playerid] == true ) {//--------------------------------------------------------------------- tmp = strtok(cmdtext, idx); if (!strlen(tmp)) {//----------------------------------------------------------------- SendClientMessage(playerid, COLOR_GREEN, " * Используйте: /rs [Скорость вращения (0 - 5)]"); return 1; }//----------------------------------------------------------------- new speed = strval( tmp ); if( speed < 0 || speed > 5 ) return SendClientMessage(playerid, COLOR_GREEN, " * Минимальная скорость: 0, максимальная: 5"); switch( speed ) { case 0: rotateSpeed = 0.5; case 1: rotateSpeed = 1.0; case 2: rotateSpeed = 2.5; case 3: rotateSpeed = 5.0; case 4: rotateSpeed = 10.0; case 5: rotateSpeed = 25.0; } format( str, sizeof( str ), "* Скорость вращения изменена: 2b_1f", rotateSpeed); SendClientMessage(playerid, COLOR_GREEN, str); TextDrawShowForPlayer(playerid,StatsEditTextDraw[playerid]); } else { SendClientMessage(playerid, COLOR_GREEN, " * Сначала создайте объект > /create [ID Модели]"); } } return 1; } if (strcmp(cmd, "/rd", true) == 0) { if(IsPlayerAdmin(playerid)) { if ( playerInEditMode[playerid] == true ) {//--------------------------------------------------------------------- tmp = strtok(cmdtext, idx); if (!strlen(tmp)) {//----------------------------------------------------------------- SendClientMessage(playerid, COLOR_GREEN, " * Используйте: /rd [Скорость перемещения (0 - 5)]"); return 1; }//----------------------------------------------------------------- new speed = strval( tmp ); if( speed < 0 || speed > 5 ) return SendClientMessage(playerid, COLOR_GREEN, " * Минимальная скорость: 0, максимальная: 5"); switch( speed ) { case 0: SpeedObject = 0.5; case 1: SpeedObject = 1.0; case 2: SpeedObject = 2.5; case 3: SpeedObject = 5.0; case 4: SpeedObject = 10.0; case 5: SpeedObject = 25.0; } format( str, sizeof( str ), "* Скорость перемещения изменена: 2b_1f", SpeedObject); SendClientMessage(playerid, COLOR_GREEN, str); TextDrawShowForPlayer(playerid,StatsEditTextDraw[playerid]); } else { SendClientMessage(playerid, COLOR_GREEN, " * Сначала создайте объект > /create [ID Модели]"); } } return 1; } if(strcmp(cmd, "/create", true) == 0) { if(IsPlayerAdmin(playerid)) { if ( playerInEditMode[playerid] == false ) { new i,Float:x, Float:y, Float:z; tmp = strtok(cmdtext, idx); if (!strlen(tmp)) {//----------------------------------------------------------------- SendClientMessage(playerid, COLOR_GREEN, " * Используйте: /create [ID модели]"); return 1; }//----------------------------------------------------------------- model = strval(tmp); GetPlayerPos(playerid, x, y, z); if(GetLasObjectID() != 0) { i = GetLasObjectID(); obj = CreateObject(model, x, y+10.0, z, 0.0000, 0.0000, 0.0000); OBJECT[playerid] = obj; ToggleObjectArrow(obj, true); TogglePlayerControllable(playerid, false); Model_Id[i] = model; playerInEditMode[playerid] = true; editMode[playerid] = EDIT_MOVE; Created[playerid] = 0; SendClientMessage(playerid, COLOR_GREEN, "* Руководство по использованию ViceEditor"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси X - используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Y - используйте A и D"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Z - зажмите Shift (или любую кнопку бега).."); SendClientMessage(playerid, COLOR_GREEN, ".. и используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, " * Сохранить положение объекта, клавиша *ПРОБЕЛ*"); format(str, sizeof(str), "Oбъект создан. ID: %d", obj); SendClientMessage(playerid, COLOR_GREEN, str); TextDrawShowForPlayer(playerid,StatsEditTextDraw[playerid]); } } } return 1; } if(strcmp(cmd, "/dublecatea", true) == 0) { /* Команда позволяет создать еще 1 объект как дубликат. Объект появится с тем объектом который вы создавали последний раз... самый последний. Эта команда облегчет вам время, например вам не надо будет снова выстовлять ротацию и позицию. */ if(IsPlayerAdmin(playerid)) { if(IsObject(playerid)) return SendClientMessage( playerid, COLOR_GREEN, " * Вы еще не создавали, ни одного объекта!" ); if ( playerInEditMode[playerid] == false ) { if(GetLasObjectID() != 0) { new i; i = GetLasObjectID(); OBJECT[playerid] = OBJECT[playerid]; GetObjectPos(OBJECT[playerid],X,Y,Z); GetObjectRot(OBJECT[playerid],RX,RY,RZ); OBJECT[playerid] = CreateObject(Model_Id[i], X, Y, Z, RX, RY, RZ); ToggleObjectArrow(OBJECT[playerid], true); TogglePlayerControllable(playerid, false); playerInEditMode[playerid] = true; editMode[playerid] = EDIT_MOVE; Created[playerid] = 0; SendClientMessage(playerid, COLOR_GREEN, "* Руководство по использованию ViceEditor"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси X - используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Y - используйте A и D"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Z - зажмите Shift (или любую кнопку бега).."); SendClientMessage(playerid, COLOR_GREEN, ".. и используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, " * Сохранить положение объекта, клавиша *ПРОБЕЛ*"); format(str, sizeof(str), "Дубликат создан. ID: %d", OBJECT[playerid]); SendClientMessage(playerid, COLOR_GREEN, str); } } } return 1; } if(strcmp(cmd, "/dublecateb", true) == 0) { /* Команда позволяет создать еще 1 объект как дубликат. Объект появится с тем объектом который вы укажите... Эта команда облегчет вам время, например вам не надо будет снова выстовлять ротацию и позицию. */ if(IsPlayerAdmin(playerid)) { if(IsObject(playerid)) return SendClientMessage( playerid, COLOR_GREEN, " * Вы еще не создавали, ни одного объекта!" ); if ( playerInEditMode[playerid] == false ) { tmp = strtok(cmdtext, idx); if (!strlen(tmp)) {//----------------------------------------------------------------- SendClientMessage(playerid, COLOR_GREEN, " * Используйте: /dublecateb [ID Объекта, с которым хоите сделать дубликат]"); return 1; }//----------------------------------------------------------------- OBJECT[playerid] = strval(tmp); if(GetLasObjectID() != 0) { new i; i = GetLasObjectID(); GetObjectPos(OBJECT[playerid],X,Y,Z); GetObjectRot(OBJECT[playerid],RX,RY,RZ); OBJECT[playerid] = CreateObject(Model_Id[i], X, Y, Z, RX, RY, RZ); ToggleObjectArrow(OBJECT[playerid], true); TogglePlayerControllable(playerid, false); playerInEditMode[playerid] = true; editMode[playerid] = EDIT_MOVE; Created[playerid] = 0; SendClientMessage(playerid, COLOR_GREEN, "* Руководство по использованию ViceEditor"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси X - используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Y - используйте A и D"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Z - зажмите Shift (или любую кнопку бега).."); SendClientMessage(playerid, COLOR_GREEN, ".. и используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, " * Сохранить положение объекта, клавиша *ПРОБЕЛ*"); format(str, sizeof(str), "Дубликат создан. ID: %d", OBJECT[playerid]); SendClientMessage(playerid, COLOR_GREEN, str); } } } return 1; } if (strcmp(cmd, "/delete", true) == 0) { if(IsPlayerAdmin(playerid)) { if ( playerInEditMode[playerid] == false ) { tmp = strtok(cmdtext, idx); if (!strlen(tmp)) {//----------------------------------------------------------------- SendClientMessage(playerid, COLOR_GREEN, " * Используйте: /delete [ID Объекта]"); return 1; }//----------------------------------------------------------------- new id = strval(tmp); new file_del[32]; format( file_del, 32, "Object/%d.ini", id); if( dini_Exists( file_del ) ) dini_Remove( file_del ); DestroyObject(id); format(str, sizeof(str), "Oбъект удален. ID: %d", id); SendClientMessageToAll(COLOR_GREEN, str); } } return 1; } if (strcmp(cmd, "/edit", true) == 0) { if(IsPlayerAdmin(playerid)) { if ( playerInEditMode[playerid] == false ) {//--------------------------------------------------------------------- tmp = strtok(cmdtext, idx); if (!strlen(tmp)) {//----------------------------------------------------------------- SendClientMessage(playerid, COLOR_GREEN, " * Используйте: /edit [Тип режима (0-1)] [ID объекта]"); return 1; }//----------------------------------------------------------------- new edittype = strval( tmp ); if( edittype < 0 || edittype > 1 ) { SendClientMessage(playerid, COLOR_GREEN, "* Типы режима Редактора Объектов:"); SendClientMessage(playerid, COLOR_GREEN, "* 0 - Двигать по Оси X Y Z"); SendClientMessage(playerid, COLOR_GREEN, "* 1 - Изменить Ротацию X Y Z"); return 1; } tmp = strtok(cmdtext, idx); if (!strlen(tmp)) {//----------------------------------------------------------------- SendClientMessage(playerid, COLOR_GREEN, " * Используйте: /edit [Тип режима (0-2)] [ID объекта]"); return 1; }//----------------------------------------------------------------- new dObjID = strval(tmp); switch( edittype ) { case 0: editMode[playerid] = EDIT_MOVE,Created[playerid] = 1, SendClientMessage(playerid, COLOR_GREEN, "* Вы в редактируете позицию объекта"); case 1: editMode[playerid] = EDIT_ROT,Created[playerid] = 2, SendClientMessage(playerid, COLOR_GREEN, "* Вы в редактируете ротацию объекта"); } OBJECT[playerid] = dObjID; ToggleObjectArrow(dObjID, true); TogglePlayerControllable(playerid, false); playerInEditMode[playerid] = true; format(str, sizeof(str), "Bы редактируете объект с ID: %d", dObjID); SendClientMessage(playerid, COLOR_GREEN, str); SendClientMessage(playerid, COLOR_GREEN, "* Руководство по использованию ViceEditor"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси X - используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Y - используйте A и D"); SendClientMessage(playerid, COLOR_GREEN, "* Чтобы передвигать объект по оси Z - зажмите Shift (или любую кнопку бега).."); SendClientMessage(playerid, COLOR_GREEN, ".. и используйте W и S"); SendClientMessage(playerid, COLOR_GREEN, " * Сохранить положение объекта, клавиша *ПРОБЕЛ*"); TextDrawShowForPlayer(playerid,StatsEditTextDraw[playerid]); }//--------------------------------------------------------------------- return 1; } } return 0; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) // test { new string[256]; if( playerInEditMode[ playerid ] == true ) { if( OBJECT[playerid] != 0 ) { if( editMode[playerid] == EDIT_MOVE ) { if( newkeys == ONFOOT_KEY_UP ) { GetObjectPos(OBJECT[playerid], X, Y, Z); MoveObject(OBJECT[playerid], X+0.5, Y, Z, SpeedObject); } if( newkeys == ONFOOT_KEY_DOWN ) { GetObjectPos(OBJECT[playerid], X, Y, Z); MoveObject(OBJECT[playerid], X-0.5, Y, Z, SpeedObject); } if( newkeys == ONFOOT_KEY_LEFT ) { GetObjectPos(OBJECT[playerid], X, Y, Z); MoveObject(OBJECT[playerid], X, Y+0.5, Z, SpeedObject); } if( newkeys == ONFOOT_KEY_RIGHT ) { GetObjectPos(OBJECT[playerid], X, Y, Z); MoveObject(OBJECT[playerid], X, Y-0.5, Z, SpeedObject); } if( HOLDING( ONFOOT_KEY_UP | ONFOOT_KEY_SPRINT )) { GetObjectPos(OBJECT[playerid], X, Y, Z); MoveObject(OBJECT[playerid], X, Y, Z+0.5, SpeedObject); } if( HOLDING( ONFOOT_KEY_DOWN | ONFOOT_KEY_SPRINT )) { GetObjectPos(OBJECT[playerid], X, Y, Z); MoveObject(OBJECT[playerid], X, Y, Z-0.5, SpeedObject); } if( newkeys == ONFOOT_KEY_JUMP ) { playerInEditMode[playerid] = false; SetCameraBehindPlayer(playerid); TogglePlayerControllable(playerid, true); ToggleObjectArrow(OBJECT[playerid], false); TextDrawHideForPlayer(playerid,StatsEditTextDraw[playerid]); if(GetLasObjectID() != 0) { new t; t = GetLasObjectID(); format(file, sizeof(file), "Object/%d.ini",OBJECT[playerid]); dini_Create(file); dini_IntSet(file,"ObjectID",Model_Id[t]); dini_FloatSet(file,"Posx",X); dini_FloatSet(file,"Posy",Y); dini_FloatSet(file,"Posz",Z); dini_FloatSet(file,"rPosx",RX); dini_FloatSet(file,"rPosy",RY); dini_FloatSet(file,"rPosz",RZ); } if(Created[playerid] == 0) { format(string, sizeof(string)," * Объект c ID:%d записан в папку Object",OBJECT[playerid]); SendClientMessage(playerid, COLOR_GREEN,string); printf("Объект c ID:%d записан в папку Object", OBJECT[playerid]); } if(Created[playerid] == 1) { format(string, sizeof(string)," * Объект c ID:%d отредактирован",OBJECT[playerid]); SendClientMessage(playerid, COLOR_GREEN,string); printf("Объект c ID:%d отредактирован", OBJECT[playerid]); } } } if( editMode[playerid] == EDIT_ROT ) { if( newkeys == ONFOOT_KEY_UP ) { GetObjectRot(OBJECT[playerid], RX, RY, RZ); SetObjectRot(OBJECT[playerid], RX + rotateSpeed, RY, RZ); } if( newkeys == ONFOOT_KEY_DOWN ) { GetObjectRot(OBJECT[playerid], RX, RY, RZ); SetObjectRot(OBJECT[playerid], RX - rotateSpeed, RY, RZ); } if( newkeys == ONFOOT_KEY_LEFT ) { GetObjectRot(OBJECT[playerid], RX, RY, RZ); SetObjectRot(OBJECT[playerid], RX, RY + rotateSpeed, RZ); } if( newkeys == ONFOOT_KEY_RIGHT ) { GetObjectRot(OBJECT[playerid], RX, RY, RZ); SetObjectRot(OBJECT[playerid], RX, RY - rotateSpeed, RZ); } if( HOLDING( ONFOOT_KEY_UP | ONFOOT_KEY_SPRINT )) { GetObjectRot(OBJECT[playerid], RX, RY, RZ); SetObjectRot(OBJECT[playerid], RX, RY, RZ + rotateSpeed); } if( HOLDING( ONFOOT_KEY_DOWN | ONFOOT_KEY_SPRINT )) { GetObjectRot(OBJECT[playerid], RX, RY, RZ); SetObjectRot(OBJECT[playerid], RX, RY, RZ - rotateSpeed); } if( newkeys == ONFOOT_KEY_JUMP ) { playerInEditMode[playerid] = false; SetCameraBehindPlayer(playerid); TogglePlayerControllable(playerid, true); ToggleObjectArrow(OBJECT[playerid], false); TextDrawHideForPlayer(playerid,StatsEditTextDraw[playerid]); if(GetLasObjectID() != 0) { new t; t = GetLasObjectID(); format(file, sizeof(file), "Object/%d.ini",OBJECT[playerid]); dini_Create(file); dini_IntSet(file,"ObjectID",Model_Id[t]); dini_FloatSet(file,"Posx",X); dini_FloatSet(file,"Posy",Y); dini_FloatSet(file,"Posz",Z); dini_FloatSet(file,"rPosx",RX); dini_FloatSet(file,"rPosy",RY); dini_FloatSet(file,"rPosz",RZ); } if(Created[playerid] == 2) { format(string, sizeof(string)," * Объект c ID:%d отредактирован",OBJECT[playerid]); SendClientMessage(playerid, COLOR_GREEN,string); printf("Объект c ID:%d отредактирован", OBJECT[playerid]); } } } } } return 1; } stock IsObject(id) { return (OBJECT[id] == 0) ? true : false; } stock GetLasObjectID() { new i; for(i = 1; i <= MAX_DECORATIONS; i++) if(!(IsValidObject(OBJECT[i]))) break; if(i <= MAX_DECORATIONS) return i; else return 0; } stock strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; } new offset = index; new result[20]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; }
Поделиться52023-08-20 18:40:20
Последняя финальная версия.
Ограничений в создании объектов нет.
Добавлена команда /saveobj она позваляет сохранить все созданные объекты в отдельный файл txt.
Файл создается в папке scriptfiles самостоятельно не чего делать не нужно.
Чтобы начать создавать объект итд, сперва нужно авторизоваться под ркон.
Прописываете в чат /admin ваш пароль тот что указан в server.cfg столбец rcon_password.
Страница: 1
Похожие темы
Med object editor | Файловый архив | 2020-04-10 |