Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.IO;
- namespace aion_test
- {
- class Program
- {
- //Рейты на монеты (оказалось таких мобов всего то 4, по 2 на рассу,
- //и дропают только медь, да и монеты эти (кроме мифрила) нафиг не нужны)
- const int RATE_COINS_MIN = 10;//минимальный дроп этого предмета увеличится во столько раз
- const int RATE_COINS_MAX = 100;//максимальный дроп - во столько
- //Рейты на кинары (цифры тут весьма индивидуальны, рейты порядка 500 весьма неплохи)
- const int RATE_KINAH_MIN = 100;
- const int RATE_KINAH_MAX = 666;
- //Рейты на осколки стигм
- const int RATE_STIGMA_MIN = 10;
- const int RATE_STIGMA_MAX = 15;
- //Рейты на волшебные и магические камни, 1-10 камешков с моба выглядит вполне приемлимо (в купе с рейтами на лут)
- const int RATE_MAGICSTONES_MIN = 1;
- const int RATE_MAGICSTONES_MAX = 10;
- internal static byte[] bts;
- /// <summary>
- /// Как юзать: 1) в папке с npc_drops.dat создайте его копию с суффиксом _ORIGINAL (npc_drops.dat_ORIGINAL)
- /// 2) Откройте npc_drops.dat с помощью этой программы.
- /// Изменения сохраняются в npc_drops на основе данных из оригинала (которые программа лишь читает)
- /// Таким образом автоматом решается проблема с backup`ом
- /// Если нужен полный лог с сохранением в файл - прикрутите сами :)
- /// Также ведение статистики (сколько изменено и т.п.) звучит очень вкусно
- /// </summary>
- static void Main(string[] args)
- {
- var fname = args[0];
- //Полностью считываем файл. Работать с RAM быстрее чем с HDD
- //Надеюсь вы не раздуете npc_drops.dat до 1 ГБ и более
- bts = File.ReadAllBytes(fname + "_ORIGINAL");
- Console.WriteLine("Файл загружен!");
- for (var i = 0; i + 4 < bts.Length; i++)
- {
- var itemID = BitConverter.ToInt32(bts, i);
- switch (itemID)
- {
- case 182400001:
- ApplyRates("Кинары", RATE_KINAH_MIN, RATE_KINAH_MAX, i);
- break;
- case 186000002://Вроде не шибко ценные монетки
- ApplyRates("Медные монеты (эл.)", RATE_COINS_MIN, RATE_COINS_MAX, i);
- break;
- case 186000007://Вроде не шибко ценные монетки
- ApplyRates("Медные монеты (ас.)", RATE_COINS_MIN, RATE_COINS_MAX, i);
- break;
- case 141000001:
- ApplyRates("Осколок стигмы", RATE_STIGMA_MIN, RATE_STIGMA_MAX, i);
- break;
- default:
- //Волшебные камешки
- if (itemID >= 166000001 && itemID <= 166000190)
- {//Должно быть падают лишь с боссов?
- ApplyRates("Волшебный камень ур. " + (itemID - 166000000).ToString(),
- RATE_MAGICSTONES_MIN, RATE_MAGICSTONES_MAX, i);
- break;
- }
- //Магические камешки (Без ивентовых)
- if (itemID >= 167000226 && itemID <= 167000235 ||
- itemID >= 167000258 && itemID <= 167000267 ||
- itemID >= 167000290 && itemID <= 167000299 ||
- itemID >= 167000322 && itemID <= 167000331 ||
- itemID >= 167000354 && itemID <= 167000363 ||
- itemID >= 167000418 && itemID <= 167000427 ||
- itemID >= 167000450 && itemID <= 167000459 ||
- itemID == 167000465 || itemID == 167000497 ||
- itemID >= 167000482 && itemID <= 167000491 ||
- itemID >= 167000514 && itemID <= 167000523 ||
- itemID >= 167000525 && itemID <= 167000563 ||
- itemID >= 167000578 && itemID <= 167000877 ||
- itemID >= 167020024 && itemID <= 167020071)
- {
- ApplyRates(string.Format("Магический камень ({0})", itemID),
- RATE_MAGICSTONES_MIN, RATE_MAGICSTONES_MAX, i);
- break;
- }
- continue;
- }
- i += 16;
- }
- Console.WriteLine("Усё пропатчено, сохраняем ...");
- File.WriteAllBytes(fname, bts);
- Console.WriteLine("Готово! Пресс эни кей ту эксит");
- Console.ReadKey(true);
- }
- public static void ApplyRates(string name, int rateMin, int rateMax, int i)
- {
- var minKinahs = BitConverter.ToInt32(bts, i + 8);
- var maxKinahs = BitConverter.ToInt32(bts, i + 12);
- //Хорошо бы еще узнавать с кого падает (желательно не только ID но и как то заполучать название)
- //Полагаю это заметно усложнит алгоритм
- Console.WriteLine("Найдено: {2}, падает от {0} до {1} штук.", minKinahs, maxKinahs, name);
- minKinahs *= rateMin;
- maxKinahs *= rateMax;
- Console.WriteLine(" Теперь падает от {0} до {1} штук.", minKinahs, maxKinahs);
- BitConverter.GetBytes(minKinahs).CopyTo(bts, i + 8);
- BitConverter.GetBytes(maxKinahs).CopyTo(bts, i + 12);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement