- Регистрация
- 26 Ноя 2015
- Сообщения
- 56
- Лучшие ответы
- 0
- Репутация
- 12
В приступе альтруизма решил в общий доступ выложить
Делал для своего сервера
Можно обойтись и без mysql,без zcmd и прочих сторонних библиотек — но мне с таким набором удобнее.
И да,если где-то есть "быдлокод",и Вы знаете,как можно написать лучше — пожалуйста,я буду только рад,если Вы меня поправите.
Описывать процесс вшивания в мод не буду,кому надо разберутся,вроде всё что нужно закоментил
Если есть идеи,как можно расширить функционал — пишите
Точно такая же система есть у меня на сервере,тестировал где-то час,багов не нашёл.
Требования (для запуска без мороки):
MySQL (юзал версию R39-3,но может работать и на более ранних),стример,zcmd (можно перепилить без проблем на другой)
ПЫСЫ я нуб,не нашёл добавления файла,так что лью сразу код
Делал для своего сервера
Можно обойтись и без mysql,без zcmd и прочих сторонних библиотек — но мне с таким набором удобнее.
И да,если где-то есть "быдлокод",и Вы знаете,как можно написать лучше — пожалуйста,я буду только рад,если Вы меня поправите.
Описывать процесс вшивания в мод не буду,кому надо разберутся,вроде всё что нужно закоментил
Если есть идеи,как можно расширить функционал — пишите
Точно такая же система есть у меня на сервере,тестировал где-то час,багов не нашёл.
Требования (для запуска без мороки):
MySQL (юзал версию R39-3,но может работать и на более ранних),стример,zcmd (можно перепилить без проблем на другой)
ПЫСЫ я нуб,не нашёл добавления файла,так что лью сразу код
PHP:
// by iGuarDD
#include <a_samp>
#include <a_mysql>
#include <streamer>
#include <zcmd>
// Можно обойтись и без последних 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,"Пикапы","{FFEE00}Пикапы телепорта","Выбор","Назад");
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,"Пикапы","{FFEE00}Пикапы телепорта","Выбор","Назад");
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 ID = %d",pickupid);
mysql_tquery(dbHandle,query,"","");
}
case 11223:
{
if !response*then return ShowPlayerDialog(playerid,11221,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Список\n{FFDD00}Создать\n{FFCC00}Удалить","Выбор","Назад");
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,"Пикапы","{FFEE00}Список\n{FFDD00}Создать\n{FFCC00}Удалить","Выбор","Назад");
new pickupid = createdpickups[listitem];
SetPVarInt(playerid,"ControlConsolePick",pickupid);
ShowPlayerDialog(playerid,11225,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Телепортироваться\n{FFDD00}Переименовать\n{FFCC00}Удалить","Выбор","Назад");
}
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 ID = %d",pickupid);
mysql_tquery(dbHandle,query,"","");
ShowPlayerConsolePickups(playerid);
}
}
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++)
{
id = cache_get_field_content_int(i,"ID");
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,"Пикапы","{FFEE00}Список\n{FFDD00}Создать\n{FFCC00}Удалить","Выбор","Назад");
return 1;
}