Система объектов с возможностью создания с сервера (MySQL R39-2)

Описание: Уроки по скриптингу
Модератор: SJplayer

Pinger
Автор темы, Мл. сержант
Мл. сержант
Аватара
Pinger
Автор темы, Мл. сержант
Мл. сержант
Сообщения: 34
Зарегистрирован: 6 февраля 2014
С нами: 10 лет 1 месяц

#1 Pinger » 9 июля 2018, 18:37

Версия MySQL R39-2, для создания объектов используется streamer от incognito.

Ко всем define

Код: Выделить всё

#define MAX_GATES           50  //максимальное количество объектов 


Далее создадим enum

Код: Выделить всё

enum gInfo
{
    
gID,
FloatgClosedPos[6],
FloatgOpenPos[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(connectionHandlebuff,"","");
    }
     
}
 
public 
gLoad()
{
    new 
rowsfields;
    
cache_get_data(rows,fields,connectionHandle);
    if (
rows)
    {
        for(new 
i=0i<rowsi++)
        {
            
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,-1400);
            
GatesInfo[i][gState] = 0;
            
gCount++;
        }
        
printf("Загружено объектов: %d",rows);
    }
    return 
1;
}
 
gCreate(type,playerid)
{
    new 
FloatxFloatyFloatzmsg[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,FloatxFloatyFloatz)
{
    new 
Floatpx,Floatpy,Floatpz;
    
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,Floatx,Floaty,Floatz)
{
    new 
Floatpx,Floatpy,Floatpz;
    
GetDynamicObjectRot(GatesInfo[id][gID],px,py,pz);
    
StopDynamicObject(GatesInfo[id][gID]);
    
SetDynamicObjectRot(GatesInfo[id][gID],px+x,py+y,pz+z);
}
 
GetNearestGates(playeridFloatmaxd 4.0,all=0){
    for(new 
i=0i<MAX_GATESi++){
        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 следующего типа

создать таблицу gates.png
создать таблицу gates
создать таблицу gates.png (92.42 КБ) 1684 просмотра


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Уроки»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 5 гостей
Боты: MailRu [Bot]