Уважаемый Гость.
Пожалуйста — воздержитесь от любых комментариев на форуме относительно ситуации в мире.
В личных сообщениях, в темах и где бы то не было.
Помните — это закончится в любом случае, а слова, сказанные (или написанные) Вами — не забудутся никогда.
МЫ ЗА МИР.
(Любые сообщения относительно ситуации в мире(не важно с каким смыслом) буду удаляться. А пользователи — блокироваться безвозвратно. )
Быстрый переход в группу «Пользователи», без надобности написания постов и ожидания.
Если вы хотите обновить Ваш сервер новыми доработками — то зайдите в наш раздел. Большой выбор готовых решений от наших пользователей
Огромный выбор различных модификаций для Вашего сервера. Пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.
Подборка удобных программ для скриптера
Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
Ручное создание новых тем невозможно.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
В приступе альтруизма решил в общий доступ выложить
Делал для своего сервера
Можно обойтись и без mysql,без zcmd и прочих сторонних библиотек — но мне с таким набором удобнее.
И да,если где-то есть «быдлокод»,и Вы знаете,как можно написать лучше — пожалуйста,я буду только рад,если Вы меня поправите.
Описывать процесс вшивания в мод не буду,кому надо разберутся,вроде всё что нужно закоментил
Если есть идеи,как можно расширить функционал — пишите
Точно такая же система есть у меня на сервере,тестировал где-то час,багов не нашёл.
Требования (для запуска без мороки):
MySQL (юзал версию R39-3,но может работать и на более ранних),стример,zcmd (можно перепилить без проблем на другой)
ПЫСЫ я нуб,не нашёл добавления файла,так что лью сразу код
// by iGuarDD #include #include #include #include // Можно обойтись и без последних 3 инклудов.Но с ними мне было удобнее. #define MySQL_HOST "" #define MySQL_USER "" #define MySQL_DB "" #define MySQL_PASS "" #define MAX_CONSOLE_PICKUPS 50 // Максимальное количество пикапов. new dbHandle; new Name[MAX_PLAYERS][24]; // При наличии аналогичной переменной заменить на свою. new dialog[MAX_CONSOLE_PICKUPS * 56]; new buff[56]; // Вывел как локальную дабы хомячки не пищали о занятом стеке. enum cPickups < pickid, Float:TeleX, Float:TeleY, Float:TeleZ, Float:TeleAngle, Float:StartX, Float:StartY, Float:StartZ, StartWorld, StartInterior, TeleWorld, TeleInterior, bool:created, Creator[24], PickName[30] >new TelePickInfo[MAX_CONSOLE_PICKUPS][cPickups]; new createdpickups[MAX_CONSOLE_PICKUPS]; // Используется для показа диалога с созданными пикапами. public OnGameModeInit() < dbHandle = mysql_connect(MySQL_HOST,MySQL_USER,MySQL_DB,MySQL_PASS); mysql_tquery(dbHandle,"SELECT * FROM ConsolePickups","",""); return 1; >public OnGameModeExit() < mysql_close(dbHandle); return 1; >public OnPlayerConnect(playerid) < GetPlayerName(playerid,Name[playerid],24); >public OnPlayerRequestClass(playerid, classid) < SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746); return 1; >public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) < if newkeys & KEY_NO && GetPVarInt(playerid,"CreateTelePickMode")*then < new Float:start[3]; new query[290]; // Такой размер обусловлен непостоянностью длины Float- значений.На запас)) new Float:p[4]; start[0] = GetPVarFloat(playerid,"CreateTelePickX"); start[1] = GetPVarFloat(playerid,"CreateTelePickY"); start[2] = GetPVarFloat(playerid,"CreateTelePickZ"); GetPlayerPos(playerid,p[0],p[1],p[2]); GetPlayerFacingAngle(playerid,p[3]); for(new i;i != MAX_CONSOLE_PICKUPS;i++) < if TelePickInfo[i][created]*then continue; TelePickInfo[i][created] = true; TelePickInfo[i][TeleX] = p[0]; TelePickInfo[i][TeleY] = p[1]; TelePickInfo[i][TeleZ] = p[2]; TelePickInfo[i][TeleWorld] = GetPlayerVirtualWorld(playerid); TelePickInfo[i][TeleInterior] = GetPlayerInterior(playerid); TelePickInfo[i][StartX] = start[0]; TelePickInfo[i][StartY] = start[1]; TelePickInfo[i][StartZ] = start[2]; TelePickInfo[i][StartWorld] = GetPVarInt(playerid,"CreateTelePickWorld"); TelePickInfo[i][StartInterior] = GetPVarInt(playerid,"CreateTelePickInterior"); TelePickInfo[i][pickid] = CreateDynamicPickup(1318,1,start[0],start[1],start[2],GetPVarInt(playerid,"CreateTelePickWorld"),GetPVarInt(playerid,"CreateTelePickInterior")); strmid(TelePickInfo[i][Creator],Name[playerid],0,strlen(Name[playerid])); GetPVarString(playerid,"CreateTelePickName",TelePickInfo[i][PickName],30); format(query,sizeof query,"INSERT INTO ConsolePickups (ID,StartX,StartY,StartZ,StartWorld,StartInterior,EndX,EndY,EndZ,EndA,EndWorld,EndInterior,Creator,Name) VALUES (%d,%f,%f,%f,%d,%d,%f,%f,%f,%f,%d,%d,'%s','%s')", i,start[0],start[1],start[2],GetPVarInt(playerid,"CreateTelePickWorld"),GetPVarInt(playerid,"CreateTelePickInterior"),p[0],p[1],p[2],p[3],GetPlayerVirtualWorld(playerid),GetPlayerInterior(playerid),Name[playerid],TelePickInfo[i][PickName]); mysql_tquery(dbHandle,query,"",""); format(query,45,"Пикап с %d ID успешно создан",i); SendClientMessage(playerid,-1,query); DeletePVar(playerid,"CreateTelePickX"); DeletePVar(playerid,"CreateTelePickY"); DeletePVar(playerid,"CreateTelePickZ"); DeletePVar(playerid,"CreateTelePickWorld"); DeletePVar(playerid,"CreateTelePickInterior"); DeletePVar(playerid,"CreateTelePickName"); return DeletePVar(playerid,"CreateTelePickMode"); >return SendClientMessage(playerid,0xFF0000FF,"Достигнут лимит создания."); // Если цикл не нашёл свободную переменную — выдаём ошибку. > return 1; > public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) < for(new i = strlen(inputtext) - 1;i != -1;i--) if inputtext[i] == '%'*then inputtext[i] = '#'; switch(dialogid) < case 11221: < if !response*then return ShowPlayerDialog(playerid,11220,DIALOG_STYLE_LIST,"Пикапы","Пикапы телепорта","Выбор","Назад"); switch(listitem) < case 0: ShowPlayerConsolePickups(playerid); case 1: ShowPlayerDialog(playerid,11223,DIALOG_STYLE_INPUT,"Пикапы","Введите название пикапа","Выбор","Назад"); case 2: ShowPlayerDialog(playerid,11222,DIALOG_STYLE_INPUT,"Пикапы","Введите ID пикапа для удаления","Выбор","Назад"); >> case 11222: < if !response*then return ShowPlayerDialog(playerid,11220,DIALOG_STYLE_LIST,"Пикапы","Пикапы телепорта","Выбор","Назад"); new pickupid = strval(inputtext); if pickupid < 0 || pickupid >= MAX_CONSOLE_PICKUPS || TelePickInfo[pickupid][pickid] == INVALID_PLAYER_ID*then return ShowPlayerDialog(playerid,11202,DIALOG_STYLE_INPUT,"Пикапы","Введите ID пикапа для удаления","Выбор","Назад"),SendClientMessage(playerid,0xFF0000FF,"Пикап не найден"); DestroyDynamicPickup(TelePickInfo[pickupid][pickid]); TelePickInfo[pickupid][created] = false; new query[45]; format(query,sizeof query,"DELETE FROM ConsolePickups WHERE 11223: < if !response*then return ShowPlayerDialog(playerid,11221,DIALOG_STYLE_LIST,"Пикапы","Список\nСоздать\nУдалить","Выбор","Назад"); new len = strlen(inputtext); if !len || len > 30*then return ShowPlayerDialog(playerid,11223,DIALOG_STYLE_INPUT,"Пикапы","Введите название пикапа","Выбор","Назад"),SendClientMessage(playerid,0xFF0000FF,"Диапазон длины названия: 1..30"); SetPVarString(playerid,"CreateTelePickName",inputtext); new Float:p[3]; GetPlayerPos(playerid,p[0],p[1],p[2]); SetPVarFloat(playerid,"CreateTelePickX",p[0]); SetPVarFloat(playerid,"CreateTelePickY",p[1]); SetPVarFloat(playerid,"CreateTelePickZ",p[2]); SetPVarInt(playerid,"CreateTelePickWorld",GetPlayerVirtualWorld(playerid)); SetPVarInt(playerid,"CreateTelePickInterior",GetPlayerInterior(playerid)); SetPVarInt(playerid,"CreateTelePickMode",1); SendClientMessage(playerid,-1,"Встаньте на точку телепорта и нажмите клавишу \"N\""); > case 11224: < if !response*then return ShowPlayerDialog(playerid,11221,DIALOG_STYLE_LIST,"Пикапы","Список\nСоздать\nУдалить","Выбор","Назад"); new pickupid = createdpickups[listitem]; SetPVarInt(playerid,"ControlConsolePick",pickupid); ShowPlayerDialog(playerid,11225,DIALOG_STYLE_LIST,"Пикапы","Телепортироваться\nПереименовать\nУдалить","Выбор","Назад"); > case 11225: < if !response*then return ShowPlayerConsolePickups(playerid),DeletePVar(playerid,"ControlConsolePick"); new pickupid = GetPVarInt(playerid,"ControlConsolePick"); switch(listitem) < case 0: < SetPVarInt(playerid,"PickUpTimer",gettime() + 5); SetPlayerPos(playerid,TelePickInfo[pickupid][StartX],TelePickInfo[pickupid][StartY],TelePickInfo[pickupid][StartZ]); SetPlayerInterior(playerid,TelePickInfo[pickupid][StartInterior]); SetPlayerVirtualWorld(playerid,TelePickInfo[pickupid][StartWorld]); >case 1: return ShowPlayerDialog(playerid,11226,DIALOG_STYLE_INPUT,"Пикапы","Введите новое название для пикапа:","Ввод","Назад"); case 2: < DestroyDynamicPickup(TelePickInfo[pickupid][pickid]); TelePickInfo[pickupid][created] = false; new query[45]; format(query,sizeof query,"DELETE FROM ConsolePickups WHERE >> DeletePVar(playerid,"ControlConsolePick"); > case 11226: < if !response*then return ShowPlayerConsolePickups(playerid),DeletePVar(playerid,"ControlConsolePick"); new len = strlen(inputtext); if !len || len >30*then return ShowPlayerDialog(playerid,11226,DIALOG_STYLE_INPUT,"Пикапы","Введите новое название для пикапа:","Ввод","Назад"),SendClientMessage(playerid,0xFF0000FF,"Диапазон длины названия: 1..30"); new pickupid = GetPVarInt(playerid,"ControlConsolePick"); strmid(TelePickInfo[pickupid][PickName],inputtext,0,len); DeletePVar(playerid,"ControlConsolePick"); ShowPlayerConsolePickups(playerid); > > return 1; > forward ForLoadConsolePickups(tick); public ForLoadConsolePickups(tick) < new rows,fields; cache_get_data(rows,fields); if !rows*then return print("Пикапы для телепорта не найдены в базе данных"); else if rows >MAX_CONSOLE_PICKUPS*then return printf("WARNING: количество пикапов для телепорта в базе превышает лимит (%d)",rows - MAX_CONSOLE_PICKUPS); new id; new Float:pos[3]; new world; new interior; for(new i;i != rows;i++) < pos[0] = cache_get_field_content_int(i,"StartX"); pos[1] = cache_get_field_content_int(i,"StartY"); pos[2] = cache_get_field_content_int(i,"StartZ"); world = cache_get_field_content_int(i,"StartWorld"); interior = cache_get_field_content_int(i,"Startinterior"); TelePickInfo[id][StartX] = pos[0]; TelePickInfo[id][StartY] = pos[1]; TelePickInfo[id][StartZ] = pos[2]; TelePickInfo[id][TeleX] = cache_get_field_content_int(i,"EndX"); TelePickInfo[id][TeleY] = cache_get_field_content_int(i,"EndY"); TelePickInfo[id][TeleZ] = cache_get_field_content_int(i,"EndZ"); TelePickInfo[id][StartWorld] = world; TelePickInfo[id][StartInterior] = interior; TelePickInfo[id][TeleAngle] = cache_get_field_content_int(i,"EndAngle"); TelePickInfo[id][TeleWorld] = cache_get_field_content_int(i,"EndWorld"); TelePickInfo[id][TeleInterior] = cache_get_field_content_int(i,"EndInterior"); TelePickInfo[id][pickid] = CreateDynamicPickup(1318,1,pos[0],pos[1],pos[2],world,interior); cache_get_field_content(i,"Creator",TelePickInfo[id][Creator]); cache_get_field_content(i,"Name",TelePickInfo[id][PickName]); TelePickInfo[id][created] = true; >printf("Загружено пикапов: %d. %d мс.",rows,GetTickCount() - tick); return 1; > public OnPlayerPickUpDynamicPickup(playerid,pickupid) < if GetPVarInt(playerid,"PickUpTimer") >gettime()*then return 1; // Для телепорта к пикапам for(new i;i != MAX_CONSOLE_PICKUPS;i++) // Можно и без цикла,с < if !TelePickInfo[i][created] || pickupid != TelePickInfo[i][pickid]*then continue; SetPlayerVirtualWorld(playerid,TelePickInfo[i][TeleWorld]); SetPlayerInterior(playerid,TelePickInfo[i][TeleInterior]); SetPlayerFacingAngle(playerid,TelePickInfo[i][TeleAngle]); SetPlayerPos(playerid,TelePickInfo[i][TeleX],TelePickInfo[i][TeleY],TelePickInfo[i][TeleZ]); >return 1; > ShowPlayerConsolePickups(playerid) < dialog[0] = EOS; buff[0] = EOS; // Чистим массив. new countfind; for(new i;i != MAX_CONSOLE_PICKUPS;i++) < createdpickups[i] = 0; if !TelePickInfo[i][created]*then continue; format(buff,sizeof buff,"%s\t%s\n",TelePickInfo[i][PickName],TelePickInfo[i][Creator]); strcat(dialog,buff); createdpickups[i] = countfind; countfind++; >if !countfind*then return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Пикапы","Пикапы не найдены","Ясно",""); ShowPlayerDialog(playerid,11224,DIALOG_STYLE_TABLIST,"Пикапы",dialog,"Выбор","Назад"); dialog[0] = EOS; buff[0] = EOS; // Чистим массив. return 1; > CMD:pickmenu(playerid) < if IsPlayerAdmin(playerid)*then ShowPlayerDialog(playerid,11221,DIALOG_STYLE_LIST,"Пикапы","Список\nСоздать\nУдалить","Выбор","Назад"); return 1; >
Adblock