/* Автор: Yuri_ Translate: Lampo7 */ #define FILTERSCRIPT #include #define red 0xFF4500AA #define royalblue 0x4169FFAA new IsInNpcMode[MAX_PLAYERS]; new IsInNpcRecordMode[MAX_PLAYERS]; #if defined FILTERSCRIPT public OnFilterScriptInit() { print("\n--------------------------------------"); print(" Создатель NPC загружен"); print("--------------------------------------\n"); return 1; } public OnFilterScriptExit() { print("\n--------------------------------------"); print(" Создатель NPC выключен"); print("--------------------------------------\n"); return 1; } #endif public OnPlayerConnect(playerid) { IsInNpcRecordMode[playerid] = 0; IsInNpcMode[playerid] = 0; return 1; } public OnPlayerDisconnect(playerid, reason) { IsInNpcRecordMode[playerid] = 0; IsInNpcMode[playerid] = 0; return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { new cmd[256]; new idx; cmd = strtok(cmdtext, idx); if (strcmp(cmd, "/createnpc", true) == 0) { if(!IsPlayerAdmin(playerid)) { SendClientMessage(playerid,red," Только RCON Админ может использовать эту команду."); } else if(IsInNpcMode[playerid] == 1) { SendClientMessage(playerid,red," Вы уже работайте над созданием NPC!"); } else { IsInNpcMode[playerid] = 1; ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Создатель NPC","Добро пожаловать в создатель NPC.\nС помощью этого NPC редактора, создать NPC будет очень просто.\nПожалуйста, следуйте всем шагам, чтобы создать NPC.\nНажмите 'Ок' для начала разработки NPC или 'Выход' чтобы выйти из создателя NPC.","Ок","Выход"); } return 1; } if (strcmp(cmd, "/sr", true) == 0) { if(IsInNpcRecordMode[playerid] == 0) { return 1; } else if(IsInNpcRecordMode[playerid] == 1) { ShowPlayerDialog(playerid,6,DIALOG_STYLE_MSGBOX,"Шаг 5","Шаг 5:\nВам NPC создаётся.\nНажмите 'Готово' для выхода или 'Ещё одного'\nчтобы создать ещё NPC.","Готово","Ещё одного"); StopRecordingPlayerData(playerid); IsInNpcRecordMode[playerid] = 0; } return 1; } return 0; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { new string[248]; new idx; new tmp[256]; tmp = strtok(inputtext, idx); new skin = strval(tmp); new weapon = strval(tmp); if(dialogid == 0) { if(response) { ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Шаг 1","Шаг 1:\nВыберите режим NPC.\nЕсли вы хотите выйти, нажмите 'Выход'.","Продолжить","Выход"); } else { IsInNpcMode[playerid] = 0; SendClientMessage(playerid,royalblue," Вы вышли из создателя NPC."); } } else if(dialogid == 1) { if(response) { format(string,sizeof(string),"Напишите ID скина, который хотите использовать и нажмите 'Выбрать скин'.\nЧтобы вернуться назад, нажмите 'Назад'"); ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Шаг 2",string,"Выбрать скин","Назад"); } else { IsInNpcMode[playerid] = 0; SendClientMessage(playerid,royalblue," Вы вышли из создателя NPC."); } } else if(dialogid == 2) { if(response) { if(skin < 0 || skin > 289 || IsInvalidSkin(skin)) { format(string,sizeof(string),"Этот скин недопустим.\n Попробуйте другой скин."); ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Шаг 2",string,"Выбрать скин","Назад"); } else { SetPlayerSkin(playerid,skin); format(string,sizeof(string),"Скин выбран! \nШаг 3: Напишите ID оружия для вашего NPC.\n Если вы не хотите оружие для NPC, то нажмите 'Без оружия'."); ShowPlayerDialog(playerid,4,DIALOG_STYLE_INPUT,"Шаг 3",string,"Выбрать","Без оружия"); } } else { ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Шаг 1","Шаг 1:\nВыберите режим NPC.\nЕсли вы хотите выйте, то нажмите 'Выход'.","Продолжить","Выход"); } } else if(dialogid == 3) { if(response) { if(skin < 0 || skin > 289 || IsInvalidSkin(skin)) { format(string,sizeof(string),"Этот скин недопустим.\n Попробуйте другой скин."); ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Step 2",string,"Выбрать скин","Назад"); new bigstring[456]; new string2[256]; format(bigstring,sizeof(bigstring),"#include \n\n\n\nmain() {}\n\n\n\nNextPlayBack()\n{\n StartRecordingPlayback(PLAYER_RECORDING_TYPE_ONFOOT,NPC);\n}\n\npublic OnRecordingPlaybackEnd()\n{\n NextPlayBack();\n}\npublic OnNPCSpawn()\n{\n NextPlayBack();\n}\npublic OnNPCExitVehicle()\n{\n StopRecordingPlayback();\n}"); format(string2,sizeof(string2),"NPC.pwn"); new File: PwnFile; PwnFile = fopen(string2,io_write); fwrite(PwnFile,bigstring); fclose(PwnFile); } else { SetPlayerSkin(playerid,skin); format(string,sizeof(string),"Скин Выбран! \nШаг 3: Напишите ID оружия для вашего NPC.\n Если вы не хотите оружие для NPC, то нажмите 'Без оружия'."); ShowPlayerDialog(playerid,4,DIALOG_STYLE_INPUT,"Step 3",string,"Выбрать","Без оружия"); new bigstring[456]; new string2[256]; format(bigstring,sizeof(bigstring),"#include \n\n\n\nmain() {}\n\n\n\nNextPlayBack()\n{\n StartRecordingPlayback(PLAYER_RECORDING_TYPE_ONFOOT,NPC);\n}\n\npublic OnRecordingPlaybackEnd()\n{\n NextPlayBack();\n}\npublic OnNPCSpawn()\n{\n NextPlayBack();\n}\npublic OnNPCExitVehicle()\n{\n StopRecordingPlayback();\n}"); format(string2,sizeof(string2),"NPC.pwn"); new File: PwnFile; PwnFile = fopen(string2,io_write); fwrite(PwnFile,bigstring); fclose(PwnFile); } } else { ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Шаг 1","Шаг 1:\nВыберите режим NPC.","Пешком","В машине"); } } else if(dialogid == 4) { if(response) { if(weapon < 0 || weapon > 46) { format(string,sizeof(string),"Этот ID оружия недопустим.\n Попробуйте другое оружие."); ShowPlayerDialog(playerid,4,DIALOG_STYLE_INPUT,"Шаг 3",string,"Выбрать оружие","Назад"); } else { ResetPlayerWeapons(playerid); GivePlayerWeapon(playerid,weapon,9999999); format(string,sizeof(string),"Оружие выбрано! \nШаг 4: Запишите имя файла для этого NPC.\n Как только вы нажмёте 'Сохранить' начнётся запись в файл.\n Нажмите 'Назад' чтобы вернуться."); ShowPlayerDialog(playerid,5,DIALOG_STYLE_INPUT,"Шаг 4",string,"Сохранить","Назад"); new bigstring[456]; new string2[256]; format(bigstring,sizeof(bigstring),"#include \n\n\n\nmain() {}\n\n\n\nNextPlayBack()\n{\n StartRecordingPlayback(PLAYER_RECORDING_TYPE_ONFOOT,NPC);\n}\n\npublic OnRecordingPlaybackEnd()\n{\n NextPlayBack();\n}\npublic OnNPCSpawn()\n{\n NextPlayBack();\n}\npublic OnNPCExitVehicle()\n{\n StopRecordingPlayback();\n}"); format(string2,sizeof(string2),"NPC.pwn"); new File: PwnFile; PwnFile = fopen(string2,io_write); fwrite(PwnFile,bigstring); fclose(PwnFile); new bigstring2[456]; new string3[256]; format(bigstring2,sizeof(bigstring2),"Добавьте это в ваш GameMode под OnPlayerSpawn: \nif(!IsPlayerNpc(playerid)) retunrn 0;\nSetPlayerSkin(playerid,%d);\nGivePlayerWeapon(playerid,%d);",skin,weapon); format(string3,sizeof(string3),"AddMeToYourGM.txt"); new File: OtherFile; OtherFile = fopen(string2,io_write); fwrite(OtherFile,bigstring); fclose(OtherFile); } } else { ResetPlayerWeapons(playerid); format(string,sizeof(string),"Оружие выбрано! \nШаг 4: Запишите имя файла для этого NPC.\n Как только вы нажмёте 'Сохранить' начнётся запись в файл.\n Нажмите 'Назад' чтобы вернуться."); ShowPlayerDialog(playerid,5,DIALOG_STYLE_INPUT,"Шаг 4",string,"Сохранить","Назад"); new bigstring[456]; new string2[256]; format(bigstring,sizeof(bigstring),"#include \n\n\n\nmain() {}\n\n\n\nNextPlayBack()\n{\n StartRecordingPlayback(PLAYER_RECORDING_TYPE_ONFOOT,NPC);\n}\npublic OnRecordingPlaybackEnd()\n{\n NextPlayBack();\n}\npublic OnNPCSpawn()\n{\n NextPlayBack();\n}\npublic OnNPCExitVehicle()\n{\n StopRecordingPlayback();\n}"); format(string2,sizeof(string2),"NPC.pwn"); new File: PwnFile; PwnFile = fopen(string2,io_write); fwrite(PwnFile,bigstring); fclose(PwnFile); } } else if(dialogid == 5) { if(response) { if(!strlen(inputtext)) { format(string,sizeof(string),"Неправильное имя файла. Пожалуйста напишите название:"); ShowPlayerDialog(playerid,4,DIALOG_STYLE_INPUT,"Шаг 3",string,"Сохранить","Назад"); } else { IsInNpcRecordMode[playerid] = 1; SendClientMessage(playerid,royalblue," Запись работы! Напишите /sr чтобы остановить запись."); StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,inputtext); } } else { format(string,sizeof(string),"Скин выбран! \nСкин Выбран! \nШаг 3: Напишите ID оружия для вашего NPC.\n Если вы не хотите оружие для NPC, то нажмите 'Без оружия'."); ShowPlayerDialog(playerid,4,DIALOG_STYLE_INPUT,"Шаг 3",string,"Выбрать оружие","Без оружия"); } } else if(dialogid == 6) { if(response) { IsInNpcMode[playerid] = 0; SendClientMessage(playerid,royalblue," NPC был успешно создан! В 'scriptfiles' находится дополнительная ифнормация."); SendClientMessage(playerid,royalblue," Чтобы создать ещё одного NPC, наберите /createnpc."); } else { ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Шаг 1","Шаг 1:\nВыберите режим NPC.\nЕсли вы хотите выйти, нажмите 'Выход'.","Продолжить","Выход"); } } return 1; } IsInvalidSkin(skinid) { #define MAX_BAD_SKINS 22 new InSkin[MAX_BAD_SKINS] = { 0, 3, 4, 5, 6, 8, 42, 65, 74, 86, 119, 149, 208, 273, 289}; for (new i = 0; i < MAX_BAD_SKINS; i++) { if (skinid == InSkin[i]) return true;} return 0; } stock strtok(const string[], &index,seperator=' ') { new length = strlen(string); new offset = index; new result[128]; while ((index < length) && (string[index] != seperator) && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; if ((index < length) && (string[index] == seperator)) { index++; } return result; }