Advertisement
RaWRCoder

[RUS] Aion 4.0 npc_drop rates patcher

Jul 31st, 2014
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.64 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3.  
  4. namespace aion_test
  5. {
  6.     class Program
  7.     {
  8.         //Рейты на монеты (оказалось таких мобов всего то 4, по 2 на рассу,
  9.         //и дропают только медь, да и монеты эти (кроме мифрила) нафиг не нужны)
  10.         const int RATE_COINS_MIN = 10;//минимальный дроп этого предмета увеличится во столько раз
  11.         const int RATE_COINS_MAX = 100;//максимальный дроп - во столько
  12.  
  13.         //Рейты на кинары (цифры тут весьма индивидуальны, рейты порядка 500 весьма неплохи)
  14.         const int RATE_KINAH_MIN = 100;
  15.         const int RATE_KINAH_MAX = 666;
  16.  
  17.         //Рейты на осколки стигм
  18.         const int RATE_STIGMA_MIN = 10;
  19.         const int RATE_STIGMA_MAX = 15;
  20.  
  21.         //Рейты на волшебные и магические камни, 1-10 камешков с моба выглядит вполне приемлимо (в купе с рейтами на лут)
  22.         const int RATE_MAGICSTONES_MIN = 1;
  23.         const int RATE_MAGICSTONES_MAX = 10;
  24.  
  25.         internal static byte[] bts;
  26.  
  27.         /// <summary>
  28.         /// Как юзать: 1) в папке с npc_drops.dat создайте его копию с суффиксом _ORIGINAL (npc_drops.dat_ORIGINAL)
  29.         ///            2) Откройте npc_drops.dat с помощью этой программы.
  30.         /// Изменения сохраняются в npc_drops на основе данных из оригинала (которые программа лишь читает)
  31.         /// Таким образом автоматом решается проблема с backup`ом
  32.         /// Если нужен полный лог с сохранением в файл - прикрутите сами :)
  33.         /// Также ведение статистики (сколько изменено и т.п.) звучит очень вкусно
  34.         /// </summary>
  35.         static void Main(string[] args)
  36.         {
  37.             var fname = args[0];
  38.  
  39.             //Полностью считываем файл. Работать с RAM быстрее чем с HDD
  40.             //Надеюсь вы не раздуете npc_drops.dat до 1 ГБ и более
  41.             bts = File.ReadAllBytes(fname + "_ORIGINAL");
  42.             Console.WriteLine("Файл загружен!");
  43.             for (var i = 0; i + 4 < bts.Length; i++)
  44.             {
  45.                 var itemID = BitConverter.ToInt32(bts, i);
  46.                 switch (itemID)
  47.                 {
  48.                     case 182400001:
  49.                         ApplyRates("Кинары", RATE_KINAH_MIN, RATE_KINAH_MAX, i);
  50.                         break;
  51.                     case 186000002://Вроде не шибко ценные монетки
  52.                         ApplyRates("Медные монеты (эл.)", RATE_COINS_MIN, RATE_COINS_MAX, i);
  53.                         break;
  54.                     case 186000007://Вроде не шибко ценные монетки
  55.                         ApplyRates("Медные монеты (ас.)", RATE_COINS_MIN, RATE_COINS_MAX, i);
  56.                         break;
  57.  
  58.                     case 141000001:
  59.                         ApplyRates("Осколок стигмы", RATE_STIGMA_MIN, RATE_STIGMA_MAX, i);
  60.                         break;
  61.  
  62.                     default:
  63.                         //Волшебные камешки
  64.                         if (itemID >= 166000001 && itemID <= 166000190)
  65.                         {//Должно быть падают лишь с боссов?
  66.                             ApplyRates("Волшебный камень ур. " + (itemID - 166000000).ToString(),
  67.                                 RATE_MAGICSTONES_MIN, RATE_MAGICSTONES_MAX, i);
  68.                             break;
  69.                         }
  70.                         //Магические камешки (Без ивентовых)
  71.                         if (itemID >= 167000226 && itemID <= 167000235 ||
  72.                             itemID >= 167000258 && itemID <= 167000267 ||
  73.                             itemID >= 167000290 && itemID <= 167000299 ||
  74.                             itemID >= 167000322 && itemID <= 167000331 ||
  75.                             itemID >= 167000354 && itemID <= 167000363 ||
  76.                             itemID >= 167000418 && itemID <= 167000427 ||
  77.                             itemID >= 167000450 && itemID <= 167000459 ||
  78.                             itemID == 167000465 || itemID == 167000497 ||
  79.                             itemID >= 167000482 && itemID <= 167000491 ||
  80.                             itemID >= 167000514 && itemID <= 167000523 ||
  81.                             itemID >= 167000525 && itemID <= 167000563 ||
  82.                             itemID >= 167000578 && itemID <= 167000877 ||
  83.                             itemID >= 167020024 && itemID <= 167020071)
  84.                         {
  85.                             ApplyRates(string.Format("Магический камень ({0})", itemID),
  86.                                 RATE_MAGICSTONES_MIN, RATE_MAGICSTONES_MAX, i);
  87.                             break;
  88.                         }
  89.                         continue;
  90.                 }
  91.  
  92.                 i += 16;
  93.             }
  94.             Console.WriteLine("Усё пропатчено, сохраняем ...");
  95.  
  96.             File.WriteAllBytes(fname, bts);
  97.  
  98.             Console.WriteLine("Готово! Пресс эни кей ту эксит");
  99.             Console.ReadKey(true);
  100.         }
  101.  
  102.         public static void ApplyRates(string name, int rateMin, int rateMax, int i)
  103.         {
  104.             var minKinahs = BitConverter.ToInt32(bts, i + 8);
  105.             var maxKinahs = BitConverter.ToInt32(bts, i + 12);
  106.  
  107.             //Хорошо бы еще узнавать с кого падает (желательно не только ID но и как то заполучать название)
  108.             //Полагаю это заметно усложнит алгоритм
  109.             Console.WriteLine("Найдено: {2}, падает от {0} до {1} штук.", minKinahs, maxKinahs, name);
  110.             minKinahs *= rateMin;
  111.             maxKinahs *= rateMax;
  112.             Console.WriteLine("         Теперь падает от {0} до {1} штук.", minKinahs, maxKinahs);
  113.  
  114.             BitConverter.GetBytes(minKinahs).CopyTo(bts, i + 8);
  115.             BitConverter.GetBytes(maxKinahs).CopyTo(bts, i + 12);
  116.            
  117.         }
  118.     }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement