Jump to content
Sign in to follow this  
Vehd

База данных

Recommended Posts

Нужна база данных в которой можно было бы просматривать дроп изз сундуков типо мистика ,пурпурки , и т.д 

Share this post


Link to post
Share on other sites

Привет @Vehd!

 

Такой базы данных нет в открытом доступе. Поэтому у Вас есть хорошая возможность её разработать и выложить первым.


Share this post


Link to post
Share on other sites

вот поэтому и хотелось бы приобрести ее,знаю что есть  исходники арбаха, а так же мордо реализовали это.

Share this post


Link to post
Share on other sites
9 часов назад, Vehd сказал:

вот поэтому и хотелось бы приобрести ее,знаю что есть  исходники арбаха, а так же мордо реализовали это.

Это не так уж и тяжело. 
Загружаете файл ItemEffect.lua на сайт, далее апгрейдите функцию отображения предмета:

если тип предмета = сундук, то берем функцию предмета и проверяем ее на функцию GiveItem( role , ID ,  vaule, type) и выбираем оттуда ID далее создаем массив(список) предметов и отображаем его. 
Как то так.


Делай добро и бросай его в воду

Share this post


Link to post
Share on other sites
13 часа назад, NMS3RR сказал:

Это не так уж и тяжело. 
Загружаете файл ItemEffect.lua на сайт, далее апгрейдите функцию отображения предмета:

если тип предмета = сундук, то берем функцию предмета и проверяем ее на функцию GiveItem( role , ID ,  vaule, type) и выбираем оттуда ID далее создаем массив(список) предметов и отображаем его. 
Как то так.

 

Хорошая идея. Открываем файл ItemEffect.lua и построчно его читаем. Создаем переменную-счетчик, присваиваем ей ноль. Ищем ключевое слово function. Увеличиваем счетчик на единицу, если нашли. Если в строке встречается ключевое слово if, то увеличиваем счетчик на единицу. Если встречается ключевое слово end, то уменьшаем счетчик на единицу. Таким образом, когда счетчик будет опять равен нулю, значит мы прошли всю функцию. Между этим ищем в строках вызовы функции GiveItem() и извлекаем из них ID предметов, их количество.


Чтобы каждый раз при просмотре предмета не читать файл ItemEffect.lua, что занимает время, нужно кэшировать информацию о выдаваемых предметах. Например, записать в ту же базу данных. Затем на странице просмотра предмета проверять, есть ли его ID в таблице с выдаваемыми предметами (с помощью данного предмета можно получить другие предметы), если есть, то выводить эти предметы.

 

Что сложного?


Share this post


Link to post
Share on other sites

Написал программу, которая разбирает ItemEffect.lua и составляет список какая функция какие предметы выдает.

 

prog.png

 

На выходе получаем текстовый файл примерно такого содержания:

ItemUse_50AMFYBOX = 385,561,737,2207
ItemUse_50AMHHBOX = 355,531,707,2192
ItemUse_50AMSZBOX = 382,558,734,2204
ItemUse_50FYBOX = 369,545,721
ItemUse_50FYZWBOX = 102
ItemUse_50HHBOX = 345,521,697
ItemUse_50HHZWBOX = 1419
ItemUse_50JJBOX = 229,653
ItemUse_50JJZWBOX = 1373
ItemUse_50JUJBOX = 312,488,664
ItemUse_50JUJZWBOX = 40
ItemUse_50SJBOX = 299,475,651
ItemUse_50SJZWBOX = 1392
ItemUse_50SZBOX = 371,547,723
ItemUse_50SZZWBOX = 103
ItemUse_60AMFYBOX = 364,540,716,2201
ItemUse_60AMHHBOX = 358,534,710,2195

Этот файл можно распарсить и записать информацию в любую базу данных.

 

Исходный код (С++):

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>

// Путь до файла ItemEffect.lua
const std::string SCRIPT_PATH = "E:\\ItemEffect.lua";

// Путь до файла с информацией о выдаваемых предметах
const std::string DB_PATH = "E:\\Database.txt";


// Убрать лишние пробелы из строки
std::string Trim(std::string str);

// Удалить комментарии из строки
std::string Clear(std::string str);

// Найти ключевое слово в строке
bool FindKeyWord(const std::string& word,
				 const std::string& str);


// Точка входа
int main(int argc, char *argv[])
{
	// Поддержка русского языка в консоли
	setlocale(LC_ALL, "Russian");

	// Открываем ItemEffect.lua
	std::ifstream item_effect(SCRIPT_PATH);
	if (!item_effect.is_open())
	{
		std::cout << "Не удалось открыть файл "
				  << SCRIPT_PATH << std::endl;

		system("PAUSE");
		return 1;
	}

	// Функция => Список предметов
	std::map<std::string, std::vector<int> > FunctionList;

	// Итератор по списку
	std::map<std::string, std::vector<int> >::iterator it;

	// Заведем статистику
	size_t function_number = 0;
	size_t good_function_number = 0;
	size_t item_number = 0;
	
	// Читаем файл построчно
	std::string line, function;
	int n = 0;

	while (std::getline(item_effect, line))
	{
		// Удаляем из строки лишние пробелы
		line = Trim(line);

		// Проверяем что строка не пустая
		if (line.length() == 0)
		{
			continue;
		}

		// Проверяем что строка не закомментирована
		if (line.find("--") == 0)
		{
			continue;
		}

		// Удаляем комментарий из строки
		line = Clear(line);

		// Ищем ключевые слова
		if (n == 0)
		{
			if (FindKeyWord("function", line))
			{
				// Увеличиваем счетчик
				n++;
				
				// Извлекаем имя функции
				function = Trim( line.substr(8, 
							     line.find("(") - 8) );

				// Кладем имя функции в список
				std::vector<int> Items;
				FunctionList.insert( std::pair<std::string, std::vector<int> >(function, Items) );
				
				// Увеличиваем количество функций
				function_number++;

				continue;
			}
		}
		else
		{
			if ( FindKeyWord("if", line)  || 
				 FindKeyWord("for", line) || FindKeyWord("while", line) )
			{
				n++;
				continue;
			}

			if (FindKeyWord("end", line))
			{
				n--;
				continue;
			}
		}

		// Если n > 0, то мы внутри функции
		if (n > 0)
		{
			// Ищем функцию GiveItem
			if (line.find("GiveItem") != std::string::npos)
			{
				// Извлекаем ее параметры
				size_t s = line.find("(") + 1;
				size_t e = line.find(")");
				std::string param = Trim(line.substr(s, e - s));
				
				// Разбиваем строку по разделителю
				size_t pn = 1;
				while (true)
				{
					size_t offset = 0;
					size_t p = param.find(",");

					if (pn == 3)
					{
						std::string item_id = Trim(param.substr(offset, p));
						
						// Кладем ID предмета в список
						int id = atoi(item_id.c_str());
						if (id != 0)
						{
							it = FunctionList.find(function);
							it->second.push_back(id);
							item_number++;
						}

						break;
					}

					param = param.substr(p + 1);
					offset = p;
					pn++;
				}
			}
		}
	}

	// Закрываем ItemEffect.lua
	item_effect.close();


	// Запишем информацию о выдаваемых предметах в файл
	// Название функции => ID предметов через запятую

	// Создаем новый файл
	std::ofstream db(DB_PATH);
	if (!db.is_open())
	{
		std::cout << "Не удалось создать файл с информацией о выдаваемых предметах: " << DB_PATH << "!";

		system("PAUSE");
		return 1;
	}
	
	it = FunctionList.begin();
	while (it != FunctionList.end())
	{
		const std::vector<int>& items = it->second;
		size_t n = items.size();
		if (n > 0)
		{
			good_function_number++;

			db << it->first << " = ";
			for (size_t i = 0; i < n; i++)
			{
				db << items[i];
				if (i != (n - 1))
				{
					db << ',';
				}
			}

			db << std::endl;
		}

		it++;
	}

	// Закрываем файл с информацией о выдаваемых предметах
	db.close();

	// Напечатаем статистику
	std::cout << "Информация о выдаваемых предметах была записана в файл " << DB_PATH << "!" << std::endl;
	std::cout << "Всего функций: " << function_number << std::endl;
	std::cout << "Функции, которые выдают предметы: " << good_function_number << std::endl;
	std::cout << "Всего предметов: " << item_number << std::endl;

	system("PAUSE");
    return 0;
}

// Убрать лишние пробелы из строки
std::string Trim(std::string str)
{
	size_t start_pos, end_pos;

	// Убираем пробелы в начале строки
	start_pos = str.find_first_not_of(" \t");
	if (std::string::npos != start_pos)
	{
		str = str.substr(start_pos);
	}

	// Убираем пробелы в конце строки
	end_pos = str.find_last_not_of(" \t");
	if (std::string::npos != end_pos)
	{
		str = str.substr(0, end_pos + 1);
	}

	return str;
}

// Удалить комментарии из строки
std::string Clear(std::string str)
{
	size_t comment = str.find("--");
	if (comment != std::string::npos)
	{
		return str.substr(comment);
	}

	return str;
}

// Найти ключевое слово в строке
bool FindKeyWord(const std::string& word, const std::string& str)
{
	if (str.find(word) != std::string::npos &&
		str.find(word) == 0)
	{
		return true;
	}

	return false;
}

 

Сама программа очень простая, никаких проверок на ошибки нет. Анализирует ItemEffect.lua по принципу одна строка - одно ключевое слово. Так же нет проверки на случай, если в одной функции предмет с одним и тем же ID выдается несколько раз. С ItemEffect.lua из сборки PKO138 вроде работает без косяков.


Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...