Форум Pawn.Wiki - Воплоти мечту в реальность!: Система лутов - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Scr ][ All ]
Система лутов
Оценка: -----

#1
Пользователь офлайн   Макс 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Изображение
Общие сведения:
  • Создание администратором до 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К]
Скрытый текст [Показать]

3

#2
Пользователь офлайн   SmileCord 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
ХорошИзображение
0

#3
Пользователь офлайн   mxINI 

  • Даун какой-то
  • Вставить ник
  • Раскрыть информацию
LootTip :wink: :wink:
0

#4
Пользователь офлайн   Lanzo 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Вот примерно такое же делал на mxINI. Мне почему то mxINI ближе, и удобнее чем mySQL. Система конечно нормальная, но для расстановки лута на сервер не очень если честно.
-1

#5
Пользователь офлайн   sql!te 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

 Lanzo (10 июня 2017 - 00:25) писал:

Вот примерно такое же делал на mxINI. Мне почему то mxINI ближе, и удобнее чем mySQL. Система конечно нормальная, но для расстановки лута на сервер не очень если честно.

1. Ближе и удобнее? На счет удобнее не соглашусь. Ибо мне кажется ты даже и не пытался понять запросы.
2. В чем заключается твое не очень для расстановки лута? Это можно использовать, как на РПГ, так и на Survival серверах. Мне кажется все даже очень. По возможности ты можешь сам ее доработать, если такой тру-скриптер, которому удобнее через mxINI делать сейв, то тебе не составит никакого труда переделать под mxINI и добавить обширный спектр возможностей к системе, т.к. исходный код у тебя на глазах.
3. "Вот примерно такое же делал на mxINI". Ну-ка. Выложи. Посмотрим твою работу. Можешь даже amx кинуть и посмотрим твой функционал.
0

#6
Пользователь офлайн   SmileCord 

  • Знаток
  • Вставить ник
  • Раскрыть информацию

 Abramoff.A (10 июня 2017 - 22:29) писал:

1. Ближе и удобнее? На счет удобнее не соглашусь. Ибо мне кажется ты даже и не пытался понять запросы.
2. В чем заключается твое не очень для расстановки лута? Это можно использовать, как на РПГ, так и на Survival серверах. Мне кажется все даже очень. По возможности ты можешь сам ее доработать, если такой тру-скриптер, которому удобнее через mxINI делать сейв, то тебе не составит никакого труда переделать под mxINI и добавить обширный спектр возможностей к системе, т.к. исходный код у тебя на глазах.
3. "Вот примерно такое же делал на mxINI". Ну-ка. Выложи. Посмотрим твою работу. Можешь даже amx кинуть и посмотрим твой функционал.


Разве, на mxINI это трудно реализовать?
0

#7
Пользователь офлайн   Long- 

  • Assassin Of Scripters
  • Вставить ник
  • Раскрыть информацию
Перед публикацией мог бы подправить код, и перевести на более новую версию mysql, так-же и вариант на mxini.
Куда копировать спеша ?

Команда построена не верно:

CMD:addloot(playerid, params[])
{
        if(IsPlayerAdmin(playerid) == 0)
                 return 1;

        new
              c_loot,
              Float:pos_x,
              Float:pos_y,
              Float:pos_z;

        if(sscanf(params, "d", c_loot)) 
                 return SendClientMessage(playerid, COLOR_GRAY, "Введите: /addloot [1 - кошелек, 2 - нарко, 3 - объедки]");

        if(!(1 <= c_loot <= 3)) 
                 return SendClientMessage(playerid, COLOR_GRAY, "Введите: /addloot [1 - кошелек, 2 - нарко, 3 - объедки]");

        GetPlayerPos(playerid, pos_x, pos_y, pos_z);

        CreateLoot(c_loot, pos_x, pos_y, pos_z - 1.0);
 
        return SendClientMessage(playerid, COLOR_WHITE, "Вы успешно создали Лут");
}


Везде в коде быдлокод, мог бы немного поработать над кодом..

Сообщение отредактировал Long-: 11 июня 2017 - 23:27

0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика