Перейти к содержанию
Авторизация  
exspertxd

Предметы, Извлекаемые Из Предметов.

Рекомендуемые сообщения

Сабж. Интересует метод реализации данной вещи, а именно "Сундук Энергии Карли" т.е. при клике по сундуку выпадет обязательно один из трёх возможных талисманов.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сабж. Интересует метод реализации данной вещи, а именно "Сундук Энергии Карли" т.е. при клике по сундуку выпадет обязательно один из трёх возможных талисманов.

Спасибо.

Смотря какая у тебя сборка, на некоторых сборках есть файл extractable_items.csv , в котором вот допустим я зашел и вот строчки выдернул

# Greater Compressed BSpS

5262;3947,1000,10

 

5262- это ID вещи с которой при клике два раза мы чтото получаем

3947- это ID предмета котый будет выпадать

1000- это количество получаемых предметов (не знаю сколько максимум,учитывай то , что если поставишь много а у тебя в базе будут предметы не stackbate (или как то так) тоесть не в стопку, то у тебя выпадет допустим 1000 арок, и залагает )

10 - шанс получения предмета, после клика (максимум 100)

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выбираешь рандомно один из нужных предметов. в вашем случае 3.

Считаешь для него шанс = 100%/3 - выпал - выдал, нет - идем дальше

 

Выбираешь рандомно один из нужных предметов. в вашем случае уже 2.

Считаешь для него шанс = 100%/2 - выпал - выдал, нет - идем дальше

 

Если выше не выпал, для последнего считаешь шанс в 100% - он то выпадет в любом случае.

 

 

Все это оформляешь в цикле из нужного кол-ва предметов - вот и все.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сабж. Интересует метод реализации данной вещи, а именно "Сундук Энергии Карли" т.е. при клике по сундуку выпадет обязательно один из трёх возможных талисманов.

Спасибо.

 

В принципе, стандартный хендлер extractable_items, в котором ставится метод:

 

public static boolean extractRandomOneItem(Player player, int[][] items, double[] chances)
{
 if(items.length != chances.length)
 {
  return false;
 }
 double extractChance = 0;
 for(double c : chances)
 {
  extractChance += c;
 }
 if(Rnd.chance(extractChance))
 {
  int[] successfulItems = new int[0];
  while(successfulItems.length == 0)
  {
   for(int i = 0; i < items.length; i++)
   {
 if(Rnd.chance(chances[i]))
 {
  successfulItems = ArrayUtils.add(successfulItems, i);
 }
   }
  }
  int[] item = items[successfulItems[Rnd.get(successfulItems.length)]];
  if(item.length < 2)
  {
   return false;
  }
  Functions.addItem(player, item[0], item[1]);
 }
 return true;
}

 

В нём, высчитываться должен, по идее, среднестатистический шанс для массива ID итемов.

 

То есть, в зависимости от количества итемов, шанс для каждого будет уменьшаться, однако оставаться для каждого равным.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

 

В принципе, стандартный хендлер extractable_items, в котором ставится метод:

 

многа букаф

 

В нём, высчитываться должен, по идее, среднестатистический шанс для массива ID итемов.

 

То есть, в зависимости от количества итемов, шанс для каждого будет уменьшаться, однако оставаться для каждого равным.

по мне дак что этот способ, что способ с extractable_items.csv - та еще извратность. первый в силу того что для каждого распаковываемого предмета надо писать отдельный метод, внутри которого перечислены ид предметов и шансы + вызов extractRandomOneItem, а потом регистрировать эти методы в хэндлерах. ну а второй в силу своей достаточной примитивности и посему сложности описания каких-то особенных распаковок.

 

лично мой выбор давно уже - уинверсальный хэндлер для всех подобных вещей + xml'ка, в которой все эти вещи расписаны с деталями, как конкретно их распаковывать и данные из которой этот хэндлер использует.

 

что-то типа такого:

 

 

<!--
   Допустимые атрибуты ноды item:
       id - распаковываемый предмет
       extract_type - тип распаковки (ONE_ITEM - выдать один предмет из списка распаковки, соответственно его шансу,
           ALL_ITEMS - будет попытка выдать по очереди все предметы из списка распаковки, соответственно их шансам).
           Если в списке наград имеется только одна запись, то распаковка идет всегда по типу ALL_ITEMS
           (используется более быстрый алгоритм).
       allow_fail - допустимость неполучения ни одного предмета из списка распаковки (проверяется только для типа
           распаковки ONE_ITEM). Если такое недопустимо, то суммарный шанс всех предметов в списке распаковки
           обязательно должен быть равен 100%. Необязательный параметр, по умолчанию равный "false".
       delete - удалять ли распаковываемый предмет после использования. Необязательный параметр, по умолчанию равный "true".
       skill - использование какого скилла броадкастить окружающим при распаковке. Задается в виде строки вида
           "skill_id,skill_level". Необязательный параметр.

   Допустимые атрибуты ноды reward:
       id - идентификатор награды:
           - если одно число, больше 0, то id предмета;
           - если одно число, меньше 0, то одно из трех значений: -100 - очки PC Bang, -200 - клановые очки, -300 - слава;
           - если задана строка "id1,id2,...idN", то будет выдан предмет из списка, выбранный случайным образом;
           - если задана строка "min_id:max_id", то будет выдан случайный предмет из заданного диапазона id.
           Последние два варианта можно комбинировать друг с другом.
       count - количество выдаваемой награды. Можно задавать в виде одного числа или же в виде строки "min_count,max_count".
           Во втором случае будет выдано случайное количество, входящее в заданный дипазон.
       chance - Шанс выдачи награды, в диапазоне от 0.001% до 100%. Поддерживается точность до тысячных долей после запятой.
       only_one - если задано значение "true", то данный предмет будет выдан только если у игрока в инвентаре еще нет
           такого же предмета. Необязательный параметр, по умолчанию равный "false".
-->
<list>
   <!-- Spellbook Page / Страница Книги Заклинаний -->
   <item id="5916" extract_type="ONE_ITEM">
       <!-- [5917] Kranvel's Spellbook: Chapter of Fire / Книга Заклинаний - Огонь -->
       <!-- [5918] Kranvel's Spellbook: Chapter of Water / Книга Заклинаний – Вода -->
       <!-- [5919] Kranvel's Spellbook: Chapter of Wind / Книга Заклинаний – Ветер -->
       <!-- [5920] Kranvel's Spellbook: Chapter of Earth / Книга Заклинаний – Земля -->
       <reward id="5917:5920" count="1" chance="80.0" />
       <reward id="736" count="1" chance="20.0" />    <!-- Scroll of Escape / Свиток Телепорта -->
   </item>

   ...

   <!-- Shadow Armor Set Pack (No-grade) / Коробка с Комплектом Теневого Доспеха (Без Ранга) -->
   <item id="8960" extract_type="ALL_ITEMS">
       <reward id="9030" count="1" chance="100.0" />    <!-- Shadow Item: Bronze Breastplate / Теневой Предмет: Бронзовая Кираса -->
       <reward id="9031" count="1" chance="100.0" />    <!-- Shadow Item: Bronze Gaiters / Теневой Предмет: Бронзовые Набедренники -->
       <reward id="9036" count="1" chance="100.0" />    <!-- Shadow Item: Bone Shield / Теневой Предмет: Костяной Щит -->
       <reward id="9037" count="1" chance="100.0" />    <!-- Shadow Item: Durable Leather Helmet / Теневой Предмет: Шлем из Толстой Кожи -->
       <reward id="9038" count="1" chance="100.0" />    <!-- Shadow Item: Boots / Теневой Предмет: Сапоги -->
       <reward id="9039" count="1" chance="100.0" />    <!-- Shadow Item: Bracer / Теневой Предмет: Наручи -->
   </item>

   ...

   <!-- Wondrous Cubic / Чудесный Кубик -->
   <item id="10632" extract_type="ONE_ITEM" delete="false">
       <reward id="10633" count="1" chance="27.1" />    <!-- Cube Fragment Armor - D / Фрагмент Кубика Доспехов – D -->
       <reward id="21096" count="1" chance="6.9" />    <!-- Shiny Cube Fragment Armor (D-grade) / Сверкающий Фрагмент Кубика Доспехов – D -->
       <reward id="10634" count="1" chance="16.0" />    <!-- Cube Fragment Armor - C / Фрагмент Кубика Доспехов – С -->
       <reward id="21097" count="1" chance="4.0" />    <!-- Shiny Cube Fragment Armor (C-grade) / Сверкающий Фрагмент Кубика Доспехов – С -->
       <reward id="10635" count="1" chance="8.0" />    <!-- Cube Fragment Armor - B / Фрагмент Кубика Доспехов – В -->
       <reward id="21098" count="1" chance="2.0" />    <!-- Shiny Cube Fragment Armor (B-grade) / Сверкающий Фрагмент Кубика Доспехов – В -->
       <reward id="10636" count="1" chance="6.4" />    <!-- Cube Fragment Armor - A / Фрагмент Кубика Доспехов – А -->
       <reward id="21099" count="1" chance="1.6" />    <!-- Shiny Cube Fragment Armor (A-grade) / Сверкающий Фрагмент Кубика Доспехов – А -->
       <reward id="10637" count="1" chance="1.6" />    <!-- Cube Fragment Armor - S / Фрагмент Кубика Доспехов – S -->
       <reward id="21100" count="1" chance="0.4" />    <!-- Shiny Cube Fragment Armor (S-grade) / Сверкающий Фрагмент Кубика Доспехов – S -->
       <reward id="34851" count="1" chance="0.8" />    <!-- Cube Fragment Armor - R / Фрагмент Кубика Доспехов - R -->
       <reward id="34853" count="1" chance="0.2" />    <!-- Shiny Cube Fragment Armor - R / Сверкающий Фрагмент Кубика Доспехов – R -->
       <reward id="10642" count="1" chance="11.0" />    <!-- Cube Fragment Weapon - D / Фрагмент Кубика Оружия – D -->
       <reward id="21101" count="1" chance="2.75" />    <!-- Shiny Cube Fragment Weapon (D-grade) / Сверкающий Фрагмент Кубика Оружия – D -->
       <reward id="10643" count="1" chance="5.6" />    <!-- Cube Fragment Weapon - C / Фрагмент Кубика Оружия – C -->
       <reward id="21102" count="1" chance="1.4" />    <!-- Shiny Cube Fragment Weapon (C-grade) / Сверкающий Фрагмент Кубика Оружия – С -->
       <reward id="10644" count="1" chance="2.0" />    <!-- Cube Fragment Weapon - B / Фрагмент Кубика Оружия – В -->
       <reward id="21103" count="1" chance="0.5" />    <!-- Shiny Cube Fragment Weapon (B-grade) / Сверкающий Фрагмент Кубика Оружия – В -->
       <reward id="10645" count="1" chance="0.8" />    <!-- Cube Fragment Weapon - A / Фрагмент Кубика Оружия – А -->
       <reward id="21104" count="1" chance="0.2" />    <!-- Shiny Cube Fragment Weapon (A-grade) / Сверкающий Фрагмент Кубика Оружия – А -->
       <reward id="10646" count="1" chance="0.4" />    <!-- Cube Fragment Weapon - S / Фрагмент Кубика Оружия – S -->
       <reward id="21105" count="1" chance="0.1" />    <!-- Shiny Cube Fragment Weapon (S-grade) / Сверкающий Фрагмент Кубика Оружия – S -->
       <reward id="34852" count="1" chance="0.2" />    <!-- Cube Fragment Weapon - R / Фрагмент Кубика Оружия - R -->
       <reward id="34854" count="1" chance="0.05" />    <!-- Shiny Cube Fragment Weapon - R / Сверкающий Фрагмент Кубика Оружия – R -->
   </item>

   ...

</list>

 

 

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

 

и таким образом у меня расписано уже более 2к итемов + на очереди еще около 1к, просто никак руки не доходят доописать их.

Изменено пользователем Gaikotsu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по мне дак что этот способ, что способ с extractable_items.csv - та еще извратность. первый в силу того что для каждого распаковываемого предмета надо писать отдельный метод, внутри которого перечислены ид предметов и шансы + вызов extractRandomOneItem, а потом регистрировать эти методы в хэндлерах. ну а второй в силу своей достаточной примитивности и посему сложности описания каких-то особенных распаковок.

 

лично мой выбор давно уже - уинверсальный хэндлер для всех подобных вещей + xml'ка, в которой все эти вещи расписаны с деталями, как конкретно их распаковывать и данные из которой этот хэндлер использует.

 

что-то типа такого:

 

 

<!--
Допустимые атрибуты ноды item:
id - распаковываемый предмет
extract_type - тип распаковки (ONE_ITEM - выдать один предмет из списка распаковки, соответственно его шансу,
ALL_ITEMS - будет попытка выдать по очереди все предметы из списка распаковки, соответственно их шансам).
Если в списке наград имеется только одна запись, то распаковка идет всегда по типу ALL_ITEMS
(используется более быстрый алгоритм).
allow_fail - допустимость неполучения ни одного предмета из списка распаковки (проверяется только для типа
распаковки ONE_ITEM). Если такое недопустимо, то суммарный шанс всех предметов в списке распаковки
обязательно должен быть равен 100%. Необязательный параметр, по умолчанию равный "false".
delete - удалять ли распаковываемый предмет после использования. Необязательный параметр, по умолчанию равный "true".
skill - использование какого скилла броадкастить окружающим при распаковке. Задается в виде строки вида
"skill_id,skill_level". Необязательный параметр.

Допустимые атрибуты ноды reward:
id - идентификатор награды:
- если одно число, больше 0, то id предмета;
- если одно число, меньше 0, то одно из трех значений: -100 - очки PC Bang, -200 - клановые очки, -300 - слава;
- если задана строка "id1,id2,...idN", то будет выдан предмет из списка, выбранный случайным образом;
- если задана строка "min_id:max_id", то будет выдан случайный предмет из заданного диапазона id.
Последние два варианта можно комбинировать друг с другом.
count - количество выдаваемой награды. Можно задавать в виде одного числа или же в виде строки "min_count,max_count".
Во втором случае будет выдано случайное количество, входящее в заданный дипазон.
chance - Шанс выдачи награды, в диапазоне от 0.001% до 100%. Поддерживается точность до тысячных долей после запятой.
only_one - если задано значение "true", то данный предмет будет выдан только если у игрока в инвентаре еще нет
такого же предмета. Необязательный параметр, по умолчанию равный "false".
-->
<list>
<!-- Spellbook Page / Страница Книги Заклинаний -->
<item id="5916" extract_type="ONE_ITEM">
<!-- [5917] Kranvel's Spellbook: Chapter of Fire / Книга Заклинаний - Огонь -->
<!-- [5918] Kranvel's Spellbook: Chapter of Water / Книга Заклинаний – Вода -->
<!-- [5919] Kranvel's Spellbook: Chapter of Wind / Книга Заклинаний – Ветер -->
<!-- [5920] Kranvel's Spellbook: Chapter of Earth / Книга Заклинаний – Земля -->
<reward id="5917:5920" count="1" chance="80.0" />
<reward id="736" count="1" chance="20.0" /> <!-- Scroll of Escape / Свиток Телепорта -->
</item>

...

<!-- Shadow Armor Set Pack (No-grade) / Коробка с Комплектом Теневого Доспеха (Без Ранга) -->
<item id="8960" extract_type="ALL_ITEMS">
<reward id="9030" count="1" chance="100.0" /> <!-- Shadow Item: Bronze Breastplate / Теневой Предмет: Бронзовая Кираса -->
<reward id="9031" count="1" chance="100.0" /> <!-- Shadow Item: Bronze Gaiters / Теневой Предмет: Бронзовые Набедренники -->
<reward id="9036" count="1" chance="100.0" /> <!-- Shadow Item: Bone Shield / Теневой Предмет: Костяной Щит -->
<reward id="9037" count="1" chance="100.0" /> <!-- Shadow Item: Durable Leather Helmet / Теневой Предмет: Шлем из Толстой Кожи -->
<reward id="9038" count="1" chance="100.0" /> <!-- Shadow Item: Boots / Теневой Предмет: Сапоги -->
<reward id="9039" count="1" chance="100.0" /> <!-- Shadow Item: Bracer / Теневой Предмет: Наручи -->
</item>

...

<!-- Wondrous Cubic / Чудесный Кубик -->
<item id="10632" extract_type="ONE_ITEM" delete="false">
<reward id="10633" count="1" chance="27.1" /> <!-- Cube Fragment Armor - D / Фрагмент Кубика Доспехов – D -->
<reward id="21096" count="1" chance="6.9" /> <!-- Shiny Cube Fragment Armor (D-grade) / Сверкающий Фрагмент Кубика Доспехов – D -->
<reward id="10634" count="1" chance="16.0" /> <!-- Cube Fragment Armor - C / Фрагмент Кубика Доспехов – С -->
<reward id="21097" count="1" chance="4.0" /> <!-- Shiny Cube Fragment Armor (C-grade) / Сверкающий Фрагмент Кубика Доспехов – С -->
<reward id="10635" count="1" chance="8.0" /> <!-- Cube Fragment Armor - B / Фрагмент Кубика Доспехов – В -->
<reward id="21098" count="1" chance="2.0" /> <!-- Shiny Cube Fragment Armor (B-grade) / Сверкающий Фрагмент Кубика Доспехов – В -->
<reward id="10636" count="1" chance="6.4" /> <!-- Cube Fragment Armor - A / Фрагмент Кубика Доспехов – А -->
<reward id="21099" count="1" chance="1.6" /> <!-- Shiny Cube Fragment Armor (A-grade) / Сверкающий Фрагмент Кубика Доспехов – А -->
<reward id="10637" count="1" chance="1.6" /> <!-- Cube Fragment Armor - S / Фрагмент Кубика Доспехов – S -->
<reward id="21100" count="1" chance="0.4" /> <!-- Shiny Cube Fragment Armor (S-grade) / Сверкающий Фрагмент Кубика Доспехов – S -->
<reward id="34851" count="1" chance="0.8" /> <!-- Cube Fragment Armor - R / Фрагмент Кубика Доспехов - R -->
<reward id="34853" count="1" chance="0.2" /> <!-- Shiny Cube Fragment Armor - R / Сверкающий Фрагмент Кубика Доспехов – R -->
<reward id="10642" count="1" chance="11.0" /> <!-- Cube Fragment Weapon - D / Фрагмент Кубика Оружия – D -->
<reward id="21101" count="1" chance="2.75" /> <!-- Shiny Cube Fragment Weapon (D-grade) / Сверкающий Фрагмент Кубика Оружия – D -->
<reward id="10643" count="1" chance="5.6" /> <!-- Cube Fragment Weapon - C / Фрагмент Кубика Оружия – C -->
<reward id="21102" count="1" chance="1.4" /> <!-- Shiny Cube Fragment Weapon (C-grade) / Сверкающий Фрагмент Кубика Оружия – С -->
<reward id="10644" count="1" chance="2.0" /> <!-- Cube Fragment Weapon - B / Фрагмент Кубика Оружия – В -->
<reward id="21103" count="1" chance="0.5" /> <!-- Shiny Cube Fragment Weapon (B-grade) / Сверкающий Фрагмент Кубика Оружия – В -->
<reward id="10645" count="1" chance="0.8" /> <!-- Cube Fragment Weapon - A / Фрагмент Кубика Оружия – А -->
<reward id="21104" count="1" chance="0.2" /> <!-- Shiny Cube Fragment Weapon (A-grade) / Сверкающий Фрагмент Кубика Оружия – А -->
<reward id="10646" count="1" chance="0.4" /> <!-- Cube Fragment Weapon - S / Фрагмент Кубика Оружия – S -->
<reward id="21105" count="1" chance="0.1" /> <!-- Shiny Cube Fragment Weapon (S-grade) / Сверкающий Фрагмент Кубика Оружия – S -->
<reward id="34852" count="1" chance="0.2" /> <!-- Cube Fragment Weapon - R / Фрагмент Кубика Оружия - R -->
<reward id="34854" count="1" chance="0.05" /> <!-- Shiny Cube Fragment Weapon - R / Сверкающий Фрагмент Кубика Оружия – R -->
</item>

...

</list>

 

 

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

 

и таким образом у меня расписано уже более 2к итемов + на очереди еще около 1к, просто никак руки не доходят доописать их.

 

Думал о таком способе, парсер/хранилище/xml написал, но потом подзабил, т.к. всё же хендлер показался удобнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну-ну... учитывая еще что у тебя в сборке и скрипты датапака скомпилены и собраны в jar (и наверняка java-файлы из датапака сервером при загрузке уже не подхватываются) всем страждущим, для добавления любой новой распаковываемой вещи придется искать тебя и просить чтобы ты добавил хэндлер для данной вещи - это да, конечно, очень "удобно".

 

З.Ы. вообще если честно не понимаю такого стремления все запихать поглубже, не давая возможности пользователям сборки самим что либо менять или добавлять. со стороны автора сборки конечно полная зависимость во всем от него хороша, но только до того момента, пока ему не надоест работать над сборкой или до момента ухода в приват. в итоге пользователи сборки встают перед выбором - или искать новую сборку или платить за новые версии.

Изменено пользователем Gaikotsu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...