Ко всем define
Код: Выделить всё
#define MAX_GATES 50 //максимальное количество объектов
Далее создадим enum
Код: Выделить всё
enum gInfo
{
gID,
Float: gClosedPos[6],
Float: gOpenPos[3],
gFaction,
gObj,
gState
};
new GatesInfo[MAX_GATES][gInfo];
new gCount;
Дальше добавим стоки, отвечающие за перемещение объектов, удаление и тд.
Код: Выделить всё
gSave(i)
{
new buff[500];
if(GatesInfo[i][gClosedPos][0]!=0.0)
{
mysql_format(connectionHandle,buff,sizeof(buff),"UPDATE `gates` SET `Obj` = '%d',`Faction` = '%d', `State` = '%d', `ClosedPos1` = '%f', `ClosedPos2` = '%f', `ClosedPos3` = '%f',`ClosedPos4` = '%f', `ClosedPos5` = '%f', `ClosedPos6` = '%f', `OpenPos1` = '%f', `OpenPos2` = '%f', `OpenPos3` = '%f' WHERE `ID` = '%i'",
GatesInfo[i][gObj],GatesInfo[i][gFaction],GatesInfo[i][gState],GatesInfo[i][gClosedPos][0],GatesInfo[i][gClosedPos][1],GatesInfo[i][gClosedPos][2],GatesInfo[i][gClosedPos][3],
GatesInfo[i][gClosedPos][4],GatesInfo[i][gClosedPos][5],GatesInfo[i][gOpenPos][0],GatesInfo[i][gOpenPos][1],GatesInfo[i][gOpenPos][2],i);
mysql_tquery(connectionHandle, buff,"","");
}
}
public gLoad()
{
new rows, fields;
cache_get_data(rows,fields,connectionHandle);
if (rows)
{
for(new i=0; i<rows; i++)
{
GatesInfo[i][gID] = cache_get_field_content_int(i, "ID");
GatesInfo[i][gObj] = cache_get_field_content_int(i, "Obj");
GatesInfo[i][gFaction] = cache_get_field_content_int(i, "Faction");
GatesInfo[i][gState] = cache_get_field_content_int(i, "State");
GatesInfo[i][gOpenPos][0] = cache_get_field_content_float(i, "OpenPos1");
GatesInfo[i][gOpenPos][1] = cache_get_field_content_float(i, "OpenPos2");
GatesInfo[i][gOpenPos][2] = cache_get_field_content_float(i, "OpenPos3");
GatesInfo[i][gClosedPos][0] = cache_get_field_content_float(i, "ClosedPos1");
GatesInfo[i][gClosedPos][1] = cache_get_field_content_float(i, "ClosedPos2");
GatesInfo[i][gClosedPos][2] = cache_get_field_content_float(i, "ClosedPos3");
GatesInfo[i][gClosedPos][3] = cache_get_field_content_float(i, "ClosedPos4");
GatesInfo[i][gClosedPos][4] = cache_get_field_content_float(i, "ClosedPos5");
GatesInfo[i][gClosedPos][5] = cache_get_field_content_float(i, "ClosedPos6");
GatesInfo[i][gID] = CreateDynamicObject(GatesInfo[i][gObj],GatesInfo[i][gClosedPos][0],GatesInfo[i][gClosedPos][1],GatesInfo[i][gClosedPos][2],
GatesInfo[i][gClosedPos][3], GatesInfo[i][gClosedPos][4],GatesInfo[i][gClosedPos][5],-1,-1,-1, 400);
GatesInfo[i][gState] = 0;
gCount++;
}
printf("Загружено объектов: %d",rows);
}
return 1;
}
gCreate(type,playerid)
{
new Float: x, Float: y, Float: z, msg[25];
GetPlayerPos(playerid,x,y,z);
GatesInfo[gCount][gObj] = type;
GatesInfo[gCount][gID] = CreateDynamicObject(type,x,y,z,0.0,0.0,0.0,-1,-1,-1,400.0);
new query[100];
mysql_format(connectionHandle,query,sizeof(query),"INSERT INTO `gates` (`Faction`, `Obj`) VALUES ('%d','%d')",GatesInfo[gCount][gFaction], GatesInfo[gCount][gObj]);
mysql_tquery(connectionHandle,query, "", "");
format(msg,25,"Bорота созданы, id: %i",gCount);
SendClientMessage(playerid,clYellow,msg);
gCount++;
}
gDestroy(id,playerid)
{
if(GatesInfo[id][gID]) DestroyDynamicObject(GatesInfo[id][gID]);
SendClientMessage(playerid,clYellow,"Удалено");
gSave(id);
}
gMove(id,Float: x, Float: y, Float: z)
{
new Float: px,Float: py,Float: pz;
GetDynamicObjectPos(GatesInfo[id][gID],px,py,pz);
StopDynamicObject(GatesInfo[id][gID]);
MoveDynamicObject(GatesInfo[id][gID],px+x,py+y,pz+z,6.0);
}
gRotate(id,Float: x,Float: y,Float: z)
{
new Float: px,Float: py,Float: pz;
GetDynamicObjectRot(GatesInfo[id][gID],px,py,pz);
StopDynamicObject(GatesInfo[id][gID]);
SetDynamicObjectRot(GatesInfo[id][gID],px+x,py+y,pz+z);
}
GetNearestGates(playerid, Float: maxd = 4.0,all=0){
for(new i=0; i<MAX_GATES; i++){
if(PlayerToPoint(maxd,playerid,GatesInfo[i][gClosedPos][0],GatesInfo[i][gClosedPos][1],GatesInfo[i][gClosedPos][2])) {
if(GatesInfo[i][gOpenPos][2]!=0.0 || all) return i;
}
}
return -1;
}
ну и наконец добавляем команды (zcmd и ему подобные командные процессоры + sscanf2)
Код: Выделить всё
//Информация о воротах
CMD:ginfo(playerid,params[])
{
restricted(5);
new id = GetNearestGates(playerid,12.0,1);
if(id<0) return SendClientMessage(playerid,clDarkRed,"Поблизости нет никаких ворот");
new msg[30];
format(msg,30,"ID: %i, Фракция: %i",id,GatesInfo[id][gFaction]);
SendClientMessage(playerid,clYellow,msg);
return true;
}
//передвинуть объект
CMD:gm(playerid,params[])
{
restricted(5);
if(sscanf(params,"dddd",params[0],params[1],params[2],params[3])) return send(playerid,"Использование: /gm [id] {x} {y} {z}");
gMove(params[0],params[1],params[2],params[3]);
return true;
}
//повернуть объект
CMD:gr(playerid,params[])
{
restricted(5);
if(sscanf(params,"dddd",params[0],params[1],params[2],params[3])) return send(playerid,"Использование: /gr [id] {x} {y} {z}");
gRotate(params[0],params[1],params[2],params[3]);
return true;
}
//создать объект
CMD:gc(playerid,params[])
{
restricted(5);
if(sscanf(params,"d",params[0])) return send(playerid,"Используйте:/gc [id]");
gCreate(params[0],playerid);
return true;
}
//удалить объект
CMD:gcd(playerid,params[])
{
restricted(5);
if(sscanf(params,"d",params[0])) return send(playerid,"Используйте:/gcd [id]");
gDestroy(params[0],playerid);
new query[50];
mysql_format(connectionHandle,query,sizeof(query),"DELETE FROM `gates` WHERE `ID` = '%d'",params[0]);
mysql_tquery(connectionHandle,query, "", "");
gSave(params[0]);
return true;
}
//привязать объект к фракции
CMD:gcf(playerid,params[])
{
restricted(5);
if(sscanf(params,"dd",params[0],params[1])) return send(playerid,"Используйте:/gcf [id] [фракция]");
GatesInfo[params[0]][gFaction] = params[1];
SendClientMessage(playerid,clYellow,"Информация обновлена");
gSave(params[0]);
return true;
}
//сохранить позицию закрытых ворот
CMD:gsc(playerid,params[])
{
restricted(5);
if(sscanf(params,"d",params[0])) return send(playerid,"Используйте:/gsc [id]");
GetDynamicObjectPos(GatesInfo[params[0]][gID],GatesInfo[params[0]][gClosedPos][0],GatesInfo[params[0]][gClosedPos][1],GatesInfo[params[0]][gClosedPos][2]);
GetDynamicObjectRot(GatesInfo[params[0]][gID],GatesInfo[params[0]][gClosedPos][3],GatesInfo[params[0]][gClosedPos][4],GatesInfo[params[0]][gClosedPos][5]);
SendClientMessage(playerid,clYellow,"Позиция закрытых ворот сохранена");
gSave(params[0]);
return true;
}
//сохранить позицию открытых ворот
CMD:gso(playerid,params[])
{
restricted(5);
if(sscanf(params,"d",params[0])) return send(playerid,"Используйте:/gso [id]");
GetDynamicObjectPos(GatesInfo[params[0]][gID],GatesInfo[params[0]][gOpenPos][0],GatesInfo[params[0]][gOpenPos][1],GatesInfo[params[0]][gOpenPos][2]);
SendClientMessage(playerid,clYellow,"Позиция открытых ворот сохранена");
gSave(params[0]);
return true;
}
Ну вот и все, осталось только создать таблицу gates следующего типа