Admin | Дата: Понедельник, 02.05.2016, 19:04 | Сообщение # 1 |
Гл.Администратор
Группа: Пользователи
Сообщений: 65
Награды: 1
Репутация: 32767
Статус: Offline
| Здравствуйте пользователи SampWarn.Ru. Завис у вас временно на форуме, увы мало кто пишет сам, в основном всё копируют, не вижу смысла. Пожалуй напишу вам 1 урок, да бы хоть чуть поднять свою репутацию на форуме. В этом уроке я расскажу как написать свою работу грузчика, для любого мода. Делается она просто, всего в несколько сотен строк, но и получается не плохая, уже стандартная работа. Начну... Для начала, добавим ко всем #define, вот этот код:
Код #define MAX_UCHECK 2 // Чекпоинты куда несём груз #define MAX_PCHECK 5 // Чекпоинты где берём груз #define START_JOB 2 // Колличество мест для начала работы #define JOB_CASH 10 // Зарплата за 1 ящик Всё расписал, думаю запутаться тут будет сложно.. Дальше ко всем new, добавляем вот это: Код [b]new Float:ucheck[MAX_UCHECK][3] = {// Чекпоинты где нужно брать вещи.. {2746.9546,-2436.0449,13.6432}, {2746.5940,-2427.4841,13.6380} };
new Float:check[MAX_PCHECK][3] = {// Чекпоинты куда нужно нести вещи... {2785.3604,-2409.4348,13.6343}, {2784.9187,-2424.8127,13.6344}, {2793.5256,-2410.3799,13.6323}, {2793.3657,-2425.0623,13.6323}, {2799.1807,-2409.9629,13.6309} };
new Float:start_job[START_JOB][3] = {// Места, где можно начать работу... {2798.4226,-2393.9375,13.9560}, {2749.2666,-2454.0779,13.8623} }; Тут кратко объясню, если вы хотите добавить ещё одно место для начала работы, то вы добавляете в start_job, координаты x,y,z, заключённые в "{ }", а #define START_JOB 2, меняете на #define START_JOB 3, дальше в код вмешиваться вам не надо. Остальное аналогично.
Далее в public OnGameModeInit, вставим вот это:
Код for(new gjob; gjob < START_JOB; gjob++)// Цикл на создание пикапа для начала работу { CreatePickup(1275,23,start_job[gjob][0],start_job[gjob][1],start_job[ gjob][2],-1);// Создаём пикап начала работы, на заданых координатах } С помощью этого, мы создали пикап, по заданным координатам в start_job.
Дальше находим public OnPlayerUpdate, и в него вставляем:
Код for(new gjob; gjob < START_JOB; gjob++)// Цикл колличество мест в которых можно начать работу { if(IsPlayerInRangeOfPoint(playerid,2,start_job[gjob][0],start_job[gjob][1] ,start_job[gjob][2])) GameTextForPlayer(playerid,"~g~PRESS KEY ~r~ALT",5000,4);// Проверяем нахождение игрока в точках начала работы, если он там, выводи GameText } C помощью этого действия, мы проверили нахождение игрока на координатах указанных в start_job, и вывели ему GameText, с пояснением..
Дальше находим public OnPlayerKeyStateChange, и в него добавляем: Код if(newkeys == KEY_WALK)// Проверка на кнопку ALT { for(new gjob; gjob < START_JOB; gjob++)// Цикл колличество мест в которых можно начать работу { if(IsPlayerInRangeOfPoint(playerid,2,start_job[gjob][0],start_job[gjob][1] ,start_job[gjob][2]))// Проверяем нахождение игрока в точках начала работы { if(GetPVarInt(playerid,"InJob") == 0) ShowPlayerDialog(playerid,30000,DIALOG_STYLE_MSGBOX,"Начало Работы грузчиком","{FFFFFF}Если вы хотите начать работу грузчиком, нажмите начать","Начать","Отмена"); // Если игрок уже работает грузчиком, то выводим диалог окончания else if(GetPVarInt(playerid,"InJob") == 1) ShowPlayerDialog(playerid,30001,DIALOG_STYLE_MSGBOX,"Окончание Работы грузчиком","{FFFFFF}Если вы хотите завершить работу грузчиком, нажмите конец","Конец","Отмена"); // Если игрок не работает грузчиком, то выводим диалог начала } } } if(GetPVarInt(playerid,"Job") == 2) { if(newkeys == KEY_SECONDARY_ATTACK || newkeys == KEY_JUMP || newkeys == KEY_SECONDARY_ATTACK || newkeys == KEY_FIRE || newkeys == KEY_CROUCH) { RemovePlayerAttachedObject(playerid,5);// Удаляем объект из рук ApplyAnimation(playerid,"PED","IDLE_tired",4.1,0,1,1,0,1);// Обнуляем анимацию SetPVarInt(playerid,"Job",1);// Устанавливаем момент работы игрока на 1.. new checkp = random(MAX_PCHECK); SetPlayerCheckpoint(playerid,pcheck[checkp][0],pcheck[checkp][1],pcheck[ checkp][2],1.5);// Создаём один из чекпоинтов } }if(newkeys == KEY_WALK)// Проверка на кнопку ALT { for(new gjob; gjob < START_JOB; gjob++)// Цикл колличество мест в которых можно начать работу { if(IsPlayerInRangeOfPoint(playerid,2,start_job[gjob][0],start_job[gjob][1] ,start_job[gjob][2]))// Проверяем нахождение игрока в точках начала работы { if(GetPVarInt(playerid,"InJob") == 0) ShowPlayerDialog(playerid,30000,DIALOG_STYLE_MSGBOX,"Начало Работы грузчиком","{FFFFFF}Если вы хотите начать работу грузчиком, нажмите начать","Начать","Отмена"); // Если игрок уже работает грузчиком, то выводим диалог окончания else if(GetPVarInt(playerid,"InJob") == 1) ShowPlayerDialog(playerid,30001,DIALOG_STYLE_MSGBOX,"Окончание Работы грузчиком","{FFFFFF}Если вы хотите завершить работу грузчиком, нажмите конец","Конец","Отмена"); // Если игрок не работает грузчиком, то выводим диалог начала } } } if(GetPVarInt(playerid,"Job") == 2) { if(newkeys == KEY_SECONDARY_ATTACK || newkeys == KEY_JUMP || newkeys == KEY_SECONDARY_ATTACK || newkeys == KEY_FIRE || newkeys == KEY_CROUCH) { RemovePlayerAttachedObject(playerid,5);// Удаляем объект из рук ApplyAnimation(playerid,"PED","IDLE_tired",4.1,0,1,1,0,1);// Обнуляем анимацию SetPVarInt(playerid,"Job",1);// Устанавливаем момент работы игрока на 1.. new checkp = random(MAX_PCHECK); SetPlayerCheckpoint(playerid,pcheck[checkp][0],pcheck[checkp][1],pcheck[ checkp][2],1.5);// Создаём один из чекпоинтов } } Тут я постарался объяснить всё в комментариях в коде. Если внимательно почитать, то можно понять суть.
Дальше находим public OnDialogResponse, и в него вставляем. Код if(dialogid == 30000) { if(!response) return 1;// Если нажал отмена SendClientMessage(playerid,0xFFFFFFAA,"* Вы начали работу {ff0000}грузчиком");// Выводим текст SetPVarInt(playerid,"PSkin",GetPlayerSkin(playerid));// Сохраним скин игрока SetPlayerSkin(playerid,268);// Установим игроку скин SetPVarInt(playerid,"InJob",1);// Устанавливаем игроку работу. SetPVarInt(playerid,"Job",1);// Устанавливаем момент работы, 1 - идём брать вещи. 2 - несём вещи. new checkp = random(MAX_PCHECK);// Рандомно выдаём координаты где брать груз SetPlayerCheckpoint(playerid,pcheck[checkp][0],pcheck[checkp][1],pcheck[ checkp][2],1.5);// Создаём один из чекпоинтов } if(dialogid == 30001) { if(!response) return 1; new str[128]; format(str,sizeof(str),"* Вы завершили работу {ff0000}грузчиком.{ffffff}Вы получаете: {ff0000}$%d",GetPVarInt(playerid,"JobY")*JOB_CASH); SendClientMessage(playerid,0xFFFFFFAA,str);// Выводим текст DisablePlayerCheckpoint(playerid);// Удаляем чекпоинт ApplyAnimation(playerid,"PED","IDLE_tired",4.1,0,1,1,0,1);// Обнуляем анимацию RemovePlayerAttachedObject(playerid,5);// Удаляем объект из рук GivePlayerMoney(playerid,GetPVarInt(playerid,"JobY")*JOB_CASH);// Выдаём деньги SetPlayerSkin(playerid,GetPVarInt(playerid,"PSkin"));// Возвращаем скин DeletePVar(playerid,"Job");// Удаляем PVar с моментом работы DeletePVar(playerid,"InJob");// Удаляем PVar с работой DeletePVar(playerid,"JobY");// Удаляем PVar с колличеством вещей DeletePVar(playerid,"PSkin");// Удаляем PVar с одеждой } Тут тоже всё объяснил в комментариях, первый диалог открывается по кнопке ALT, если игрок не работает, а второй, по кнопке ALT, если игрок работает. Если почитать, то можно увидеть суть работы. Всё описано.
Ну и пожалуй последний пункт, находим public OnPlayerEnterCheckpoint, и в него вставляем: Код if(GetPVarInt(playerid,"Job") == 1)// Если момент работы игрока 1.. { new checku = random(MAX_UCHECK);// Рандомно выдаём координаты куда нести груз SetPlayerCheckpoint(playerid,ucheck[checku][0],ucheck[checku][1],ucheck[ checku][2],1.5);// Создаём один из чекпоинтов ApplyAnimation(playerid,"CARRY","crry_prtial",4.1,0,1,1,1,1);// Анимация, типо что то несём.. SetPVarInt(playerid,"Job",2);// Устанавливаем момент работы игрока на 2.. new objectr = random(3);// Выдаём в руки объект if(objectr == 0) return SetPlayerAttachedObject(playerid,5,1221,1,0.135011,0.463495,-0.024351,357.460632,87.350753,88.068374, 0.434164,0.491270,0.368655); if(objectr == 1) return SetPlayerAttachedObject(playerid,5,2226,1,0.000708,0.356461,0.000000,186.670364,87.529838,0.000000,1. 000000,1.000000,1.000000); if(objectr == 2) return SetPlayerAttachedObject(playerid,5,1750,1,0.013829,0.131155,0.145773,185.651550,86.201354,345.922180, 0.693442,0.873942,0.577291); } if(GetPVarInt(playerid,"Job") == 2) { RemovePlayerAttachedObject(playerid,5);// Удаляем объект из рук ApplyAnimation(playerid,"PED","IDLE_tired",4.1,0,1,1,0,1);// Обнуляем анимацию SetPVarInt(playerid,"Job",1);// Устанавливаем момент работы игрока на 1.. SetPVarInt(playerid,"JobY",GetPVarInt(playerid,"JobY")+1);// Прибавим к вещам игрока 1 new str[128],checkp = random(MAX_PCHECK); format(str,sizeof(str),"* Вещей перетащенно: {ff0000}%d",GetPVarInt(playerid,"JobY")); SendClientMessage(playerid,0xFFFFFFAA,str);// Выведем сообщение SetPlayerCheckpoint(playerid,pcheck[checkp][0],pcheck[checkp][1],pcheck[ checkp][2],1.5);// Создаём один из чекпоинтов } Тут могу вкратце объяснить, если игрок встал на чекпоинт, и его момент работы равен 1 ( GetPVarInt(playerid,"Job") == 1), то ему в руки даёт один из 3 - х объектов, и показывается один из двух доступных чекпоинтов, на которые надо принести вещь. А если момент работы игрока, равен 2 ( GetPVarInt(playerid,"Job") ==2), то у игрока удаляется из рук объект, убирается анимация, к перенесёным вещам прибавляется 1, и показывает один из 5 чекпоинтов, где можно взять вещь.
Цитата При копировании данного контекста ссылка на сайт обязательна. Если есть проблемы, жду ответов в этой теме.
|
|
|
|