(MultiMC) Мой предмет и генерация лута

Версия Minecraft
1.19.2
API
Fabric
Как сделать так что-бы мой предмет из мода, спавнился естественным образом в сундуках (например в заброшеных шахтах) или же при убийсте моба (например вардена или дракона) с определённым шансом?
 
Последнее редактирование:
1,038
57
229
ChatGPT (23:24:59): Для реализации спавна вашего предмета в сундуках и при убийстве мобов с шансом в Minecraft Forge 1.19.2, вам потребуется использовать события генерации мира и события смерти мобов. Вот пример мода, который добавляет спаун вашего предмета настраиваемым образом:

1. Создайте новый проект в вашей среде разработки (например, IntelliJ IDEA) с настройками для Minecraft Forge 1.19.2.

2. Создайте новый класс с именем "CustomItemSpawnMod" и добавьте следующий код:

CustomItemSpawnMod.java:
package com.example.customitemspawnmod;



import net.minecraft.block.Block;

import net.minecraft.item.Item;

import net.minecraft.item.ItemStack;

import net.minecraft.item.Items;

import net.minecraft.loot.LootPool;

import net.minecraft.loot.LootTables;

import net.minecraft.loot.entry.ItemEntry;

import net.minecraft.loot.function.SetItemCountLootFunction;

import net.minecraft.loot.function.SetNbtLootFunction;

import net.minecraft.util.Identifier;

import net.minecraftforge.event.LootTableLoadEvent;

import net.minecraftforge.event.entity.living.LivingDropsEvent;

import net.minecraftforge.event.world.BiomeLoadingEvent;

import net.minecraftforge.eventbus.api.SubscribeEvent;

import net.minecraftforge.fml.common.Mod;



import java.util.Random;



@Mod("customitemspawnmod")

public class CustomItemSpawnMod {



private static final Item CUSTOM_ITEM = Items.DIAMOND; // Замените на свой предмет



private static final int SPAWN_CHANCE = 10; // Шанс спавна предмета (1 к SPAWN_CHANCE)



private static final int MIN_ITEMS = 1; // Минимальное количество предметов

private static final int MAX_ITEMS = 3; // Максимальное количество предметов



public CustomItemSpawnMod() {

// Регистрируем методы-обработчики событий

MinecraftForge.EVENT_BUS.register(this);

}



@SubscribeEvent

public void onBiomeLoading(BiomeLoadingEvent event) {

// Добавляем предмет в сундуки

event.getTable().addPool(getLootPool(event.getName()));

}



@SubscribeEvent

public void onLivingDrops(LivingDropsEvent event) {

// Добавляем предмет в дроп моба с определенным шансом

if (event.getEntityLiving().isServerWorld() && event.getEntityLiving().getRandom().nextInt(SPAWN_CHANCE) == 0) {

event.getDrops().add(new ItemStack(CUSTOM_ITEM, getRandomItemCount()));

}

}



@SubscribeEvent

public void onLootTableLoad(LootTableLoadEvent event) {

Identifier tableId = event.getTable().getId();

// Если это сундук в заброшенной шахте, то добавляем предмет в лут таблицу

if (tableId.equals(LootTables.CHESTS_ABANDONED_MINESHAFT)) {

event.getTable().addPool(getLootPool(tableId));

}

}



private LootPool getLootPool(Identifier tableId) {

return LootPool.builder()

.rolls(1)

.addEntry(ItemEntry.builder(CUSTOM_ITEM)

.weight(1)

.function(SetItemCountLootFunction.builder(new Random().nextInt(MAX_ITEMS - MIN_ITEMS + 1) + MIN_ITEMS))

.function(SetNbtLootFunction.builder(CUSTOM_ITEM.getDefaultStack().getOrCreateNbt()))

.build())

.build();

}



private int getRandomItemCount() {

return new Random().nextInt(MAX_ITEMS - MIN_ITEMS + 1) + MIN_ITEMS;

}

}

3. Сохраните файл "CustomItemSpawnMod.java".

4. Запустите проект в среде разработки или соберите .jar файл и поместите его в папку "mods" вашего Minecraft Forge клиента.

После запуска Minecraft Forge 1.19.2 с установленным модом, ваш предмет будет спавниться с настройками, которые вы указали, в сундуках заброшенных шахт и дропаться с определенным шансом от убитых мобов.
 
1,038
57
229
1,038
57
229
Зависит от того проверяешь ли ты тот код, который кидаешь
чисто логически написан верно, даже если будут ошибки, вот тут уж я и помогу)
Единственное в чём я ошибся, это по привычке написал forge, но в принципе разница не так велика.
ChatGPT (23:55:41): Для того чтобы твой предмет спавнился в сундуках или при убийстве мобов, тебе понадобится создать собственный лут-таблицы для каждого случая. Вот что ты можешь сделать:

1. Чтобы добавить свой предмет в сундуки, создай новый файл JSON в папке "loot_tables" внутри твоего мода. Назви его, например, "custom_chest_loot.json".

2. Внутри файла JSON определи таблицу лута. Например, чтобы задать шанс выпадения предмета в 50%, можно использовать следующий код:

JSON:
{
"type": "minecraft:chest",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "modid:item_id",
"weight": 1,
"functions": [
{
"function": "minecraft:set_count",
"count": 1
}
]
}
],
"conditions": [
{
"condition": "minecraft:random_chance",
"chance": 0.5
}
]
}
]
}

Замени "modid:item_id" на идентификатор твоего предмета из мода.

3. Чтобы добавить свой предмет к дропу при убийстве моба, создай новый файл JSON в папке "loot_tables" с именем, например, "custom_mob_drop.json".

4. Внутри файла JSON определи таблицу лута. Например, чтобы задать шанс выпадения предмета с вероятностью 25%, можно использовать следующий код:

JSON:
{
"type": "minecraft:entity",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "modid:item_id",
"weight": 1,
"functions": [
{
"function": "minecraft:set_count",
"count": 1
}
]
}
],
"conditions": [
{
"condition": "minecraft:random_chance_with_looting",
"chance": 0.25,
"looting_multiplier": 0.02
}
]
}
]
}

Снова замени "modid:item_id" на идентификатор твоего предмета из мода.

5. После того как создал два файла, зарегистрируй их в Minecraft Fabric в твоём моде. Ты можешь совершить это с помощью методов Fabric API, например, в методе onInitialize() твоего мода:
yourmod.java:
package com.example.yourmod;



import net.fabricmc.api.ModInitializer;

import net.minecraft.util.Identifier;

import net.minecraft.util.registry.BuiltinRegistries;

import net.minecraft.util.registry.Registry;

import net.minecraft.world.loot.LootTables;



public class YourMod implements ModInitializer {



private static final Identifier CUSTOM_CHEST_LOOT_ID = new Identifier("yourmod", "custom_chest_loot");

private static final Identifier CUSTOM_MOB_DROP_ID = new Identifier("yourmod", "custom_mob_drop");



@Override

public void onInitialize() {

Registry.register(BuiltinRegistries.LOOT_TABLE, CUSTOM_CHEST_LOOT_ID, LootTables.register(CUSTOM_CHEST_LOOT_ID));

Registry.register(BuiltinRegistries.LOOT_TABLE, CUSTOM_MOB_DROP_ID, LootTables.register(CUSTOM_MOB_DROP_ID));

}

}
6. Готово! Теперь твой предмет будет выпадать при генерации сундуков или при убийстве мобов с заданными шансами. Не забудь изменить "yourmod" на идентификатор твоего мода.


Я сейчас о том, что такие вопросы в принципе не должны существовать без ответов на форуме.
Или не существовать как вопросы.
Должно быть что то такое: ребят, вот у меня код работает не верно, не могли вы бы мне помочь.
Хотел сделать вот это.
И сразу видно усилия чувака, его желание становится лучше... ой старый уже, начинаю много говорить.
 
Последнее редактирование:
1,111
47
420
не ну я готов согласится что лучше дать хоть что-то, но иногда чатгпт может довольно шизоидную штуку произвести, и если такое попадет в правильный ответ, может потратиться много человекочасов на дебаг людьми, которые зайдут в тему через эн времени.
так как отбор в лучшие ответы частенько осуществляется людьми, которые не в зуб ногой что происходит, шиза может пройти и вопроса о том что что-то не работает может не последовать.
крч мне умерено страшно.
 
1,038
57
229
Тыж боженька, что тебе боятся о мыслях простых смертных ;)
Главное результат, тут я с тобой согласен. Пофиг как, главное чтобы люди создавали то что они хотят увидеть в Minecraft.
 
1,111
47
420
я просто чсв - это другое.
Главное результат, тут я с тобой согласен. Пофиг как, главное чтобы люди создавали то что они хотят увидеть в Minecraft.
Я этого не говорил. Я утверждаю, что иногда фрустрация от дебага шизы, сгенеренной чатгпт, может быть хуже, чем отсутствие ответа. Фрустрация убивает мотивацию. Отсутствие мотивации ведет к уменьшению шансов на окончание разработки мода. Такого буквально пока ни разу не было потому я не более чем высказываю свои опасения по этому поводу. Память о том как я по пять часов дебажил чатгптшную версию градиентного спуска только для того чтобы потом выбросить код полностью еще свежа. Отвратительно то что оно тоже выглядело "логично".
Я сейчас о том, что такие вопросы в принципе не должны существовать без ответов на форуме.
Или не существовать как вопросы.
Должно быть что то такое: ребят, вот у меня код работает не верно, не могли вы бы мне помочь.
Хотел сделать вот это.
Это справедливо. Такие темы в свое время выпиливали кажется.
И сразу видно усилия чувака, его желание становится лучше... ой старый уже, начинаю много говорить.
Дорогу молодым!
 
1,074
72
372
Что лучше? Пройти мимо или дать ответ?
Дать собственноручно написанный ответ, в том числе с использованием GPT, но ни в коему случае не заниматься тупым копипастом. На форум приходят с целью получения помощи от живых людей, а не искать ответ среди тонн воды, сгенерированной AI. Лить воду - это пока то, с чем нейронки справляются лучше всего для выполнения различных глупых заданий, где требуется определённое минимальное кол-во символов.

Люди проходят мимо по одной простой причине - видение нежелания у ТС пользоваться поиском и тем же GPT, чтобы хоть какие-то крупицы собрать для ответа. Никто не хочет тратить своё драгоценное время на нубов, не получив с этого для себя никакой выгоды, включая приобретение опыта.

Это я ещё не говорю про отдельные темы, где ТС нагло требует дать ему готовый код сразу «на блюдечке». Таким ничего не остаётся предложить, как посещение коммерческого раздела. Увы, но правило «время – деньги» применимо ко многим случаям.
 
Сверху