
Общие сведения:
- Создание администратором до 300 лутов (можно увеличить);
- Указание, при создании, типа и количества ресурса;
- Подбор лута игроком по клавише "Alt";
- Хранение лутов средствами mysql r5.
- В начало мода, после всех подключенных инклудов:
#define MAX_LOOT 300 // максимальное количество лутов // создаём массив переменных: enum lInfo { LootTip, // переменная для хранения типа LootCount, // переменная для хранения количества ресурса Float:LootPosX, // переменная для хранения позиции Float:LootPosY, // переменная для хранения позиции Float:LootPosZ, // переменная для хранения позиции Text3D:Loot3DText, // переменная для хранения id 3D текста LootObject // переменная для хранения id объекта }; new LootInfo[MAX_LOOT][lInfo]; // объявляем массив переменных new TOTALLOOT; // переменная для хранения текущего количества лутов new str[256]; // если у вас данная переменная есть, отсюда удалить
- Напишем команду для создания лутов:
CMD:addloot(playerid, params[]) { // Сюда добавьте проверку на админа if(sscanf(params, "d", params[0])) return SendClientMessage(playerid, COLOR_GRAY, "Введите: /addloot [1 - кошелек, 2 - нарко, 3 - объедки]"); if(params[0] > 3 || params[0] < 1) return SendClientMessage(playerid, COLOR_GRAY, "Введите: /addloot [1 - кошелек, 2 - нарко, 3 - объедки]"); new Float:positions[3]; GetPlayerPos(playerid, positions[0], positions[1], positions[2]); if(sscanf(params, "d", params[1])) CreateLoot(params[0], positions[0], positions[1], positions[2] - 1.0); else CreateLoot(params[0], positions[0], positions[1], positions[2] - 1.0, params[1]); SendClientMessage(playerid, COLOR_WHITE, "Вы успешно создали Лут"); return true; }
- Создадим два стока:
stock CreateLoot(loottip, Float:x, Float:y, Float:z, lootcount = 0) { if(!lootcount) lootcount = 1+random(50); for(new i = 0; i != MAX_LOOT; ++i) { if(LootInfo[i][LootTip] > 0) continue; LootInfo[i][LootTip] = loottip; LootInfo[i][LootCount] = lootcount; LootInfo[i][LootPosX] = x; LootInfo[i][LootPosY] = y; LootInfo[i][LootPosZ] = z; switch(LootInfo[i][LootTip]) { case 1: { LootInfo[i][Loot3DText] = Create3DTextLabel( "Кошелёк\n{808080}ALT", 0xFF8000FF, x,y,z+0.3, 2.0, 0, 1); LootInfo[i][LootObject] = CreateObject(1212,x,y,z,0,0,0); } case 2: { LootInfo[i][Loot3DText] = Create3DTextLabel( "Неизвестный пакет\n{808080}ALT", 0xFF8000FF, x,y,z+0.3, 2.0, 0, 1); LootInfo[i][LootObject] = CreateObject(1579,x,y,z,0,0,0); } case 3: { LootInfo[i][Loot3DText] = Create3DTextLabel( "Объедки\n{808080}ALT", 0xFF8000FF, x,y,z+0.3, 2.0, 0, 1); LootInfo[i][LootObject] = CreateObject(2837,x,y,z,0,0,0); } } format(str, sizeof(str), "INSERT INTO `loots` (`LootTip`,`LootCount`,`LootPosX`,`LootPosY`,`LootPosZ`) VALUES ('%d','%d','%f','%f','%f')", LootInfo[i][LootTip], LootInfo[i][LootCount], LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ]); mysql_query(str); TOTALLOOT++; break; } return true; }
stock LoadLoot() { new id, time = GetTickCount(); format(str, sizeof(str), "SELECT * FROM `loots`"); mysql_query(str); mysql_store_result(); new rows = mysql_num_rows(); if(rows > 0) { for(new i = 0; i != (rows+1); ++i) { mysql_fetch_row(str); sscanf(str, "p<|>iiifff", id, LootInfo[i][LootTip], LootInfo[i][LootCount], LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ]); switch(LootInfo[i][LootTip]) { case 1: { LootInfo[i][Loot3DText] = Create3DTextLabel( "Кошелёк\n[{FF8000}Alt{C0C0C0}]", 0xFF8000FF, LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ]+0.3, 2.0, 0, 1); LootInfo[i][LootObject] = CreateObject(1212, LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ], 0, 0, 0); } case 2: { LootInfo[i][Loot3DText] = Create3DTextLabel( "Неизвестный пакет\n[{FF8000}Alt{C0C0C0}]", 0xFF8000FF, LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ]+0.3, 2.0, 0, 1); LootInfo[i][LootObject] = CreateObject(1579, LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ], 0, 0, 0); } case 3: { LootInfo[i][Loot3DText] = Create3DTextLabel( "Объедки\n[{FF8000}Alt{C0C0C0}]", 0xFF8000FF, LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ]+0.3, 2.0, 0, 1); LootInfo[i][LootObject] = CreateObject(2837, LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ], 0, 0, 0); } } TOTALLOOT++; } } mysql_free_result(); printf(" [LOAD]: Успешная загрузка \"LoadLoot\" - загружено %d за %d м.с", TOTALLOOT, GetTickCount() - time); return true; }
- В public OnPlayerKeyStateChange сделаем подбор на клавишу "Alt":
if(newkeys == 1024) //Alt { if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) { for(new i = 0; i != TOTALLOOT; ++i) { if(!IsPlayerInRangeOfPoint(playerid, 2.0, LootInfo[i][LootPosX], LootInfo[i][LootPosY], LootInfo[i][LootPosZ])) continue; if(LootInfo[i][LootTip] <= 0) continue; Delete3DTextLabel(LootInfo[i][Loot3DText]); DestroyObject(LootInfo[i][LootObject]); switch(LootInfo[i][LootTip]) { case 1: { GivePlayerMoney(playerid, LootInfo[i][LootCount]); format(str, sizeof(str), "Вы нашли кошелёк с %d$", LootInfo[i][LootCount]); } case 2: { PlayerPlaySound(playerid, 5600, 0.0, 0.0, 0.0); format(str, sizeof(str), "Вы нашли пакет с порошком весом %d г.", LootInfo[i][LootCount]); } case 3: { PlayerPlaySound(playerid, 32200, 0.0, 0.0, 0.0); format(str, sizeof(str), "Вы поели объедки. Ваша сытость пополнена на %d %%", LootInfo[i][LootCount]); } } SendClientMessage(playerid, 0x8080FFFF, str); LootInfo[i][LootTip] = 0; break; } } }
- В public OnGameModeInit() сделаем загрузку лутов при включении сервера:
LoadLoot();
Автор: Alien Brickman
(Я всего лишь немного исправил данную систему и убрал лишний код)
Скачать БД для импорта:
loots.sql
[1,75К]Скрытый текст [Показать]
Вход
Регистрация
Помощь















