Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система DropGun[MySQL]

Статус
В этой теме нельзя размещать новые ответы.

free.time_

Умник
Здравствуйте уважаемые пользователи Pawno-Info.Ru.
Хотелось бы вам представить систему DropGun, сразу хочу сказать система не моя, и я взял ее с (не реклама), автор .
Но я его переделал под себя и в лучшую сторону!
Версия оригинальной системы 1.3, я ее изменил, и пусть это будет версия 1.4, и так ее изменения:
• Система была на mxini, теперь переведена на MySQL r8.
• Действия были через команды, теперь на кнопках.
• Исправлены мелкие баги.

Если кто-то из "профессионалов" решит обосрать данный код, то я сразу попрошу пройти мимо.
Да, в некоторых местах код не оптимизирован, но он и не такой ужасный, все работает хорошо и быстро, багов не замечал.

И так приступим:

Идем в начало мода, или в то место, где у вас обычно присутствует enum, и вставляем следующее:

PHP:
enum dGunEnum
{
	Float:ObjPos[3],
	ObjID,
	ObjData[2]
};
new dGunData[MAX_OBJ][dGunEnum];
Это у нас данные о оружии.

Далее мы идем к нашим переменным(new) и вставляем это:

PHP:
new GunNames[48][] = {
	"Nothink", "Brass Knuckles", "Golf Club", "Nitestick", "Knife", "Baseball Bat",
	"Showel", "Pool Cue", "Katana", "Chainsaw", "Purple Dildo", "Small White Dildo",
	"Long White Dildo", "Vibrator", "Flowers", "Cane", "Grenade", "Tear Gas", "Molotov",
	"Vehicle Missile", "Hydra Flare", "Jetpack", "Glock", "Silenced Colt", "Desert Eagle",
	"Shotgun", "Sawn Off", "Combat Shotgun", "Micro UZI", "MP5", "AK47", "M4", "Tec9",
	"Rifle", "Sniper Rifle", "Rocket Launcher", "HS Rocket Launcher", "Flamethrower", "Minigun",
	"Satchel Charge", "Detonator", "Spraycan", "Fire Extinguisher", "Camera", "Nightvision",
	"Infrared Vision", "Parachute", "Fake Pistol"
};
// -----------------------------------------------------------------------------
new GunObjects[47] = {
	0,331,333,334,335,336,337,338,339,341,321,322,323,324,325,326,342,343,344,
	0,0,0,346,347,348,349,350,351,352,353,355,356,372,357,358,359,360,361,362,
	363,364,365,366,367,368,368,371
};
Тут у нас названия оружия для вывода на экран, и иды модельки(объекта).

Сейчас нам надо перейти к паблику OnPlayerKeyStateChange, и вставить следующее:
PHP:
if (newkeys == KEY_NO)
	{
		if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT) return 1;
        new GunID = GetPlayerWeapon(playerid);
        new GunAmmo = GetPlayerAmmo(playerid);
        if(GunID > 0 && GunAmmo != 0)
        {
            new f = MAX_OBJ+1;
            for(new a = 0; a < MAX_OBJ; a++)
            {
                if(dGunData[a][ObjPos][0] == 0.0)
                {
                    f = a;
                    break;
                }
            }
            if(f > MAX_OBJ) return SendClientMessage(playerid, 0x33AA3300, "Вы не можете выбросить оружие.");
            SetPVarInt(playerid, "fe", f);
			RemovePlayerWeapon(playerid, GunID);
			dGunData[f][ObjData][0] = GunID;
			dGunData[f][ObjData][1] = GunAmmo;
            GetPlayerPos(playerid, dGunData[f][ObjPos][0], dGunData[f][ObjPos][1], dGunData[f][ObjPos][2]);
            dGunData[f][ObjID] = CreateObject(GunObjects[GunID], dGunData[f][ObjPos][0], dGunData[f][ObjPos][1], dGunData[f][ObjPos][2]-1, 93.7, 120.0, 120.0);
            new buffer[50];
            SaveGunsDrop(f);
			format(buffer, sizeof(buffer), "Вы выбросили: {77dd77}%s", GunNames[dGunData[f][ObjData][0]]);
			SendClientMessage(playerid, 0x33AA3300, buffer);
        }
	}
	if (newkeys == KEY_YES)
	{
	    if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT) return 1;
        new f = MAX_OBJ+1;
        new queryip[160];
		for(new a = 0; a < MAX_OBJ; a++)
		{
		    if(IsPlayerInRangeOfPoint(playerid, 2.0, dGunData[a][ObjPos][0], dGunData[a][ObjPos][1], dGunData[a][ObjPos][2]))
		    {
		        f = a;
		        break;
		    }
		}
		if(f > MAX_OBJ) return SendClientMessage(playerid, 0x33AA3300, "Вы не можете поднять оружие");
		DestroyObject(dGunData[f][ObjID]);
		format(queryip,sizeof(queryip),	"DELETE FROM "TABLE_GUNS" WHERE id = '%d'", dGunData[f][ObjID]);
        mysql_function_query(connectionHandl, queryip, false,"","");
		GivePlayerWeapon(playerid, dGunData[f][ObjData][0], dGunData[f][ObjData][1]);
		dGunData[f][ObjPos][0] = 0.0;
		dGunData[f][ObjPos][1] = 0.0;
		dGunData[f][ObjPos][2] = 0.0;
		dGunData[f][ObjID] = -1;
		dGunData[f][ObjData][1] = 0;
		new buffer[50];
		format(buffer, sizeof(buffer), "Вы подняли: {77dd77}%s", GunNames[dGunData[f][ObjData][0]]);
  		SendClientMessage(playerid, 0x33AA3300, buffer);
  		return 1;
    }
Быстро объясню, данный паблик отвечает реагирует на нажатие клавиш.
if (newkeys == KEY_NO) - Проверка нажата ли клавиша, в нашем случае клавиша 'N'
if (newkeys == KEY_YES) - Клавиша "Y"
Иды кнопок вот:
PHP:
KEY_CROUCH           2         Присесть          
KEY_FIRE             4         Огонь            
KEY_SPRINT           8         Спринт           
KEY_SECONDARY_ATTACK 16        Вторичная атака  
KEY_JUMP             32        Прыжок           
KEY_LOOK_RIGHT       64        Смотреть в право 
KEY_HANDBRAKE        128       Ручной тормоз
KEY_LOOK_LEFT        256       Смотреть в лево 
KEY_SUBMISSION       512       Субмиссия        
KEY_LOOK_BEHIND      512       Смотреть назад   
KEY_WALK             1024      Идти шагом       
KEY_ANALOG_UP        2048      Аналог вверх     
KEY_ANALOG_DOWN      4096      Аналог ввниз     
KEY_ANALOG_LEFT      8192      Аналог влево     
KEY_ANALOG_RIGHT     16384     Аналог вправо    
KEY_UP               -128      Вверх            
KEY_DOWN             128       Вниз             
KEY_LEFT             -128      Влево            
KEY_RIGHT            128       Вправо           
KEY_YES              65536     Разговор (ДА)    
KEY_NO               131072    Разговор (НЕТ)   
KEY_CTRL_BACK        262144

Идем дальше, нам нужно создать паблик загрузки оружия из нашей базы данных:
PHP:
publics: LoadGuns()
{
	for(new n = 0; n < MAX_OBJ; n++) dGunData[n][ObjID] = -1;
	new rows,fields;
	cache_get_data(rows, fields);
    if(rows)
    {
        for(new g = 0; g < rows; ++g)
        {
            dGunData[g][ObjID] = cache_get_field_content_int(g,"id");
            dGunData[g][ObjPos][0] = cache_get_field_content_float(g,"fic0");
			dGunData[g][ObjPos][1] = cache_get_field_content_float(g,"fic1");
			dGunData[g][ObjPos][2] = cache_get_field_content_float(g,"fic2");
			dGunData[g][ObjData][0] = cache_get_field_content_int(g,"fic3");
			dGunData[g][ObjData][1] = cache_get_field_content_int(g,"fic4");
			if(dGunData[g][ObjData][0] > 0 && dGunData[g][ObjData][1] != 0 && dGunData[g][ObjPos][0] != 0)
			{
                dGunData[g][ObjID] = CreateObject(GunObjects[dGunData[g][ObjData][0]], dGunData[g][ObjPos][0], dGunData[g][ObjPos][1], dGunData[g][ObjPos][2]-1, 93.7, 120.0, 120.0);
			}
        }
    }
    else print("База данных с оружием пуста");
	return 1;
}
Ко всем define прошу добавить:
PHP:
#define MAX_OBJ 50
#define publics:%0(%1)	forward %0(%1); public %0(%1)
#define TABLE_GUNS       	"guns"
Далее нам необходимо перейти в паблик OnGameModeInit, и добавить туда следующее:
PHP:
mysql_function_query(connectionHandl,"SELECT * FROM `guns`",true,"LoadGuns","");
Данный паблик вызывается при запуске мода, и с помощью этой функции мы будем подключаться к нашей базе данных "guns", и произойдет вызов паблика LoadGuns.

Теперь нам надо сделать сохранения оружия на земле, в конец мода:
PHP:
stock SaveGunsDrop(g)
{
	if(dGunData[g][ObjData][0] != 0)
	{
		mysql_format(connectionHandl,query,512,"INSERT INTO `guns` (`fic0`, `fic1`, `fic2`, `fic3`, `fic4`) VALUES ('%f', '%f', '%f', '%i', '%i')",
		dGunData[g][ObjPos][0],
		dGunData[g][ObjPos][1],
		dGunData[g][ObjPos][2],
		dGunData[g][ObjData][0],
		dGunData[g][ObjData][1]);
		mysql_function_query(connectionHandl, query, false,"","");
    }
	return 1;
}
Данный паблик вызывается только после того, как мы выбросим оружие на землю, он запишет модель оружия, координаты, кол-во патронов.

И самое последнее, добавляем в конец мода:
PHP:
stock RemovePlayerWeapon(playerid, weaponid)
{
	new plyWeapons[12] = 0;
	new plyAmmo[12] = 0;
	for(new sslot = 0; sslot != 12; sslot++)
	{
		new wep, ammo;
		GetPlayerWeaponData(playerid, sslot, wep, ammo);
		if(wep != weaponid && ammo != 0) GetPlayerWeaponData(playerid, sslot, plyWeapons[sslot], plyAmmo[sslot]);
	}
	ResetPlayerWeapons(playerid);
	for(new sslot = 0; sslot != 12; sslot++) if(plyAmmo[sslot] != 0) GivePlayerWeapon(playerid, plyWeapons[sslot], plyAmmo[sslot]);
	return 1;
}
Этот сток мы используем чтобы забрать у игрока определенное оружие, когда он его выбрасывает.

Теперь нам необходимо перейти в БД и создать таблицу под названием guns(регистр учитывается),
Далее переходим в нашу созданную таблицу guns, и выбираем раздел "SQL"
И вставляем следующее:
PHP:
CREATE TABLE IF NOT EXISTS `guns` (
  `fic0` float NOT NULL,
  `fic1` float NOT NULL,
  `fic2` float NOT NULL,
  `fic3` int(11) NOT NULL,
  `fic4` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Вроде бы все, если есть какие-то ошибки, баги, недоработки, может писать:
• В комментарии
• Skype
•

Помогу чем смогу.


UPDATE:
Система авто очистки территории и БД от моделей
Идем в public OnGameModeInit() и добавляем следующее:
PHP:
SetTimer("DGuns", 1000, false);
1000 - это миллисекунды, т.е. 1 секунда, выставляете свое значение!

Далее в конец мода и добавляем это:
PHP:
publics: DGuns()
{
    new queryip[160];
    for(new g = 0; g < MAX_OBJ; g++)
	{
	    if(dGunData[g][ObjData][0] > 0 && dGunData[g][ObjPos][1] != 0)
		{
		    DestroyObject(dGunData[g][ObjID]);
		}
	}
	format(queryip,sizeof(queryip),	"DELETE FROM "TABLE_GUNS" WHERE id");
 	mysql_function_query(connectionHandl, queryip, false,"","");
	return true;
}
Писал на скорую руку, если будут баги, пишите.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу