Compare commits
10 Commits
generated
...
291d46b4e6
Author | SHA1 | Date | |
---|---|---|---|
291d46b4e6 | |||
6867bbdc4d | |||
1cff2526b9 | |||
f516aba128 | |||
075f2d718f | |||
d10a6df9e7 | |||
61f495acd3 | |||
2e885ab8bd | |||
bd1d872a52 | |||
61bf4a2d2a |
@ -9,8 +9,8 @@ yarn_mappings=1.21.4+build.4
|
||||
loader_version=0.16.9
|
||||
|
||||
# Mod Properties
|
||||
mod_version=1.0.0
|
||||
maven_group=de.jottyfan.gta.dgp
|
||||
mod_version=0.0.1
|
||||
maven_group=de.jottyfan.gta.gdp
|
||||
archives_base_name=gtagdp
|
||||
|
||||
# Dependencies
|
||||
|
@ -1,24 +0,0 @@
|
||||
package de.jottyfan.gta.dgp;
|
||||
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class GTAGDP implements ModInitializer {
|
||||
public static final String MOD_ID = "gtagdp";
|
||||
|
||||
// This logger is used to write text to the console and the log file.
|
||||
// It is considered best practice to use your mod id as the logger's name.
|
||||
// That way, it's clear which mod wrote info, warnings, and errors.
|
||||
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
// This code runs as soon as Minecraft is in a mod-load-ready state.
|
||||
// However, some things (like resources) may still be uninitialized.
|
||||
// Proceed with mild caution.
|
||||
|
||||
LOGGER.info("Hello Fabric world!");
|
||||
}
|
||||
}
|
25
src/main/java/de/jottyfan/gta/gdp/GTAGDP.java
Normal file
25
src/main/java/de/jottyfan/gta/gdp/GTAGDP.java
Normal file
@ -0,0 +1,25 @@
|
||||
package de.jottyfan.gta.gdp;
|
||||
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import de.jottyfan.gta.gdp.block.ModBlocks;
|
||||
import de.jottyfan.gta.gdp.item.ModItems;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class GTAGDP implements ModInitializer {
|
||||
public static final String MOD_ID = "gtagdp";
|
||||
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
ModItems.registerModItems();
|
||||
ModBlocks.registerModBlocks();
|
||||
}
|
||||
}
|
14
src/main/java/de/jottyfan/gta/gdp/GTAGDPClient.java
Normal file
14
src/main/java/de/jottyfan/gta/gdp/GTAGDPClient.java
Normal file
@ -0,0 +1,14 @@
|
||||
package de.jottyfan.gta.gdp;
|
||||
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class GTAGDPClient implements ClientModInitializer {
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
}
|
||||
}
|
55
src/main/java/de/jottyfan/gta/gdp/block/ModBlocks.java
Normal file
55
src/main/java/de/jottyfan/gta/gdp/block/ModBlocks.java
Normal file
@ -0,0 +1,55 @@
|
||||
package de.jottyfan.gta.gdp.block;
|
||||
|
||||
import de.jottyfan.gta.gdp.GTAGDP;
|
||||
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
|
||||
import net.minecraft.block.AbstractBlock;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemGroups;
|
||||
import net.minecraft.registry.Registries;
|
||||
import net.minecraft.registry.Registry;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.registry.RegistryKeys;
|
||||
import net.minecraft.sound.BlockSoundGroup;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class ModBlocks {
|
||||
|
||||
public static final Block RUBY_BLOCK = registerRubyBlock(Identifier.of(GTAGDP.MOD_ID, "ruby_block"),
|
||||
AbstractBlock.Settings.create().strength(4f).requiresTool().sounds(BlockSoundGroup.AMETHYST_BLOCK)
|
||||
.luminance(state -> state.get(RubyBlock.ACTIVATED) ? 15 : 0));
|
||||
public static final Block RUBY_ORE = registerBlock(Identifier.of(GTAGDP.MOD_ID, "ruby_ore"),
|
||||
AbstractBlock.Settings.create().strength(3f).requiresTool());
|
||||
|
||||
private static Block registerRubyBlock(Identifier identifier, Block.Settings settings) {
|
||||
Block block = new RubyBlock(settings.registryKey(RegistryKey.of(RegistryKeys.BLOCK, identifier)));
|
||||
registerBlockItem(identifier, block, new Item.Settings());
|
||||
return Registry.register(Registries.BLOCK, identifier, block);
|
||||
}
|
||||
|
||||
private static Block registerBlock(Identifier identifier, Block.Settings settings) {
|
||||
Block block = new Block(settings.registryKey(RegistryKey.of(RegistryKeys.BLOCK, identifier)));
|
||||
registerBlockItem(identifier, block, new Item.Settings());
|
||||
return Registry.register(Registries.BLOCK, identifier, block);
|
||||
}
|
||||
|
||||
private static void registerBlockItem(Identifier identifier, Block block, Item.Settings settings) {
|
||||
Registry.register(Registries.ITEM, identifier, new BlockItem(block,
|
||||
settings.useBlockPrefixedTranslationKey().registryKey(RegistryKey.of(RegistryKeys.ITEM, identifier))));
|
||||
}
|
||||
|
||||
public static void registerModBlocks() {
|
||||
GTAGDP.LOGGER.info("Registering Mod Blocks for {}", GTAGDP.MOD_ID);
|
||||
|
||||
ItemGroupEvents.modifyEntriesEvent(ItemGroups.BUILDING_BLOCKS).register(entries -> {
|
||||
entries.add(RUBY_BLOCK);
|
||||
entries.add(RUBY_ORE);
|
||||
});
|
||||
}
|
||||
}
|
39
src/main/java/de/jottyfan/gta/gdp/block/RubyBlock.java
Normal file
39
src/main/java/de/jottyfan/gta/gdp/block/RubyBlock.java
Normal file
@ -0,0 +1,39 @@
|
||||
package de.jottyfan.gta.gdp.block;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.state.StateManager.Builder;
|
||||
import net.minecraft.state.property.BooleanProperty;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class RubyBlock extends Block {
|
||||
public static final BooleanProperty ACTIVATED = BooleanProperty.of("activated");
|
||||
|
||||
public RubyBlock(Settings settings) {
|
||||
super(settings);
|
||||
setDefaultState(getDefaultState().with(ACTIVATED, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendProperties(Builder<Block, BlockState> builder) {
|
||||
builder.add(ACTIVATED);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {
|
||||
if (!world.isClient()) {
|
||||
world.setBlockState(pos, state.cycle(ACTIVATED));
|
||||
}
|
||||
return ActionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
package de.jottyfan.gta.gdp.item;
|
||||
|
||||
import net.minecraft.component.type.FoodComponent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class ModFoodComponents {
|
||||
|
||||
public static final FoodComponent DELICIOUS_STUB = new FoodComponent.Builder().nutrition(1).saturationModifier(0.1f)
|
||||
.build();
|
||||
}
|
45
src/main/java/de/jottyfan/gta/gdp/item/ModItems.java
Normal file
45
src/main/java/de/jottyfan/gta/gdp/item/ModItems.java
Normal file
@ -0,0 +1,45 @@
|
||||
package de.jottyfan.gta.gdp.item;
|
||||
|
||||
import de.jottyfan.gta.gdp.GTAGDP;
|
||||
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.Item.Settings;
|
||||
import net.minecraft.item.ItemGroups;
|
||||
import net.minecraft.registry.Registries;
|
||||
import net.minecraft.registry.Registry;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.registry.RegistryKeys;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class ModItems {
|
||||
|
||||
public static final Item STUB = registerStubItem(
|
||||
Identifier.of(GTAGDP.MOD_ID, "stub"),
|
||||
new Item.Settings().food(ModFoodComponents.DELICIOUS_STUB));
|
||||
|
||||
public static final Item RUBYBALL = registerItem(Identifier.of(GTAGDP.MOD_ID, "rubyball"), new Item.Settings());
|
||||
|
||||
private static Item registerItem(Identifier identifier, Settings settings) {
|
||||
return Registry.register(Registries.ITEM, identifier,
|
||||
new Item(settings.useItemPrefixedTranslationKey().registryKey(RegistryKey.of(RegistryKeys.ITEM, identifier))));
|
||||
}
|
||||
|
||||
private static Item registerStubItem(Identifier identifier, Settings settings) {
|
||||
return Registry.register(Registries.ITEM, identifier, new StubItem(
|
||||
settings.useItemPrefixedTranslationKey().registryKey(RegistryKey.of(RegistryKeys.ITEM, identifier))));
|
||||
}
|
||||
|
||||
public static void registerModItems() {
|
||||
GTAGDP.LOGGER.info("registering mod items for " + GTAGDP.MOD_ID);
|
||||
|
||||
ItemGroupEvents.modifyEntriesEvent(ItemGroups.TOOLS).register(entries -> {
|
||||
entries.add(STUB);
|
||||
entries.add(RUBYBALL);
|
||||
});
|
||||
}
|
||||
}
|
58
src/main/java/de/jottyfan/gta/gdp/item/StubItem.java
Normal file
58
src/main/java/de/jottyfan/gta/gdp/item/StubItem.java
Normal file
@ -0,0 +1,58 @@
|
||||
package de.jottyfan.gta.gdp.item;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.entity.ItemEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ItemUsageContext;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class StubItem extends Item {
|
||||
|
||||
private static final Map<Block, Item> SLASH_MAP = Map.of(
|
||||
Blocks.HAY_BLOCK, Items.WHEAT,
|
||||
Blocks.DRIED_KELP_BLOCK, Items.DRIED_KELP);
|
||||
|
||||
public StubItem(Settings settings) {
|
||||
super(settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult useOnBlock(ItemUsageContext context) {
|
||||
World world = context.getWorld();
|
||||
BlockPos pos = context.getBlockPos();
|
||||
Block clickedBlock = world.getBlockState(pos).getBlock();
|
||||
if (SLASH_MAP.containsKey(clickedBlock)) {
|
||||
if (!world.isClient()) {
|
||||
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
world.playSound(null, pos, SoundEvents.ITEM_HOE_TILL,
|
||||
SoundCategory.BLOCKS);
|
||||
for (int i = 0; i < 9; i++) {
|
||||
ItemStack stack = new ItemStack(SLASH_MAP.get(clickedBlock));
|
||||
float xScatter = new Random().nextFloat();
|
||||
float yScatter = new Random().nextFloat();
|
||||
ItemEntity entity = new ItemEntity(world, pos.getX(), pos.getY(), pos.getZ(),
|
||||
stack, xScatter, yScatter, 0.2);
|
||||
world.spawnEntity(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ActionResult.SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package de.jottyfan.gta.dgp.mixin;
|
||||
package de.jottyfan.gta.gdp.mixin;
|
||||
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "gtagdp:block/ruby_block"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "gtagdp:block/ruby_ore"
|
||||
}
|
||||
}
|
||||
}
|
6
src/main/resources/assets/gtagdp/items/ruby_block.json
Normal file
6
src/main/resources/assets/gtagdp/items/ruby_block.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"model": {
|
||||
"type": "minecraft:model",
|
||||
"model": "gtagdp:block/ruby_block"
|
||||
}
|
||||
}
|
6
src/main/resources/assets/gtagdp/items/ruby_ore.json
Normal file
6
src/main/resources/assets/gtagdp/items/ruby_ore.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"model": {
|
||||
"type": "minecraft:model",
|
||||
"model": "gtagdp:block/ruby_ore"
|
||||
}
|
||||
}
|
6
src/main/resources/assets/gtagdp/items/rubyball.json
Normal file
6
src/main/resources/assets/gtagdp/items/rubyball.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"model": {
|
||||
"type": "minecraft:model",
|
||||
"model": "gtagdp:item/rubyball"
|
||||
}
|
||||
}
|
6
src/main/resources/assets/gtagdp/items/stub.json
Normal file
6
src/main/resources/assets/gtagdp/items/stub.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"model": {
|
||||
"type": "minecraft:model",
|
||||
"model": "gtagdp:item/stub"
|
||||
}
|
||||
}
|
7
src/main/resources/assets/gtagdp/lang/de_de.json
Normal file
7
src/main/resources/assets/gtagdp/lang/de_de.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"item.gtagdp.stub": "Stummel",
|
||||
"item.gtagdp.rubyball": "Rubinball",
|
||||
|
||||
"block.gtagdp.ruby_block": "Rubinblock",
|
||||
"block.gtagdp.ruby_ore": "Rubinerz"
|
||||
}
|
7
src/main/resources/assets/gtagdp/lang/en_us.json
Normal file
7
src/main/resources/assets/gtagdp/lang/en_us.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"item.gtagdp.stub": "Stub",
|
||||
"item.gtagdp.rubyball": "Ruby ball",
|
||||
|
||||
"block.gtagdp.ruby_block": "Ruby block",
|
||||
"block.gtagdp.ruby_ore": "Ruby ore"
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "gtagdp:block/ruby_block"
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "gtagdp:block/ruby_ore"
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
{
|
||||
"parent": "gtagdp:block/ruby_block"
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
{
|
||||
"parent": "gtagdp:block/ruby_ore"
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:item/generated",
|
||||
"textures": {
|
||||
"layer0": "gtagdp:item/rubyball"
|
||||
}
|
||||
}
|
6
src/main/resources/assets/gtagdp/models/item/stub.json
Normal file
6
src/main/resources/assets/gtagdp/models/item/stub.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:item/generated",
|
||||
"textures": {
|
||||
"layer0": "gtagdp:item/stub"
|
||||
}
|
||||
}
|
BIN
src/main/resources/assets/gtagdp/textures/block/ruby_block.png
Normal file
BIN
src/main/resources/assets/gtagdp/textures/block/ruby_block.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 989 B |
BIN
src/main/resources/assets/gtagdp/textures/block/ruby_ore.png
Normal file
BIN
src/main/resources/assets/gtagdp/textures/block/ruby_ore.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
BIN
src/main/resources/assets/gtagdp/textures/item/rubyball.png
Normal file
BIN
src/main/resources/assets/gtagdp/textures/item/rubyball.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.5 KiB |
BIN
src/main/resources/assets/gtagdp/textures/item/stub.png
Normal file
BIN
src/main/resources/assets/gtagdp/textures/item/stub.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.1 KiB |
@ -0,0 +1,20 @@
|
||||
{
|
||||
"type": "minecraft:block",
|
||||
"pools": [
|
||||
{
|
||||
"bonus_rolls": 0.0,
|
||||
"conditions": [
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "gtagdp:rubyball"
|
||||
}
|
||||
],
|
||||
"rolls": 1.0
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"type": "minecraft:blasting",
|
||||
"ingredient": "gtagdp:ruby_ore",
|
||||
"result": {
|
||||
"id": "gtagdp:rubyball"
|
||||
},
|
||||
"experience": 0.1,
|
||||
"cookingtime": 200
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"type": "minecraft:campfire_cooking",
|
||||
"ingredient": "gtagdp:stub",
|
||||
"result": {
|
||||
"id": "minecraft:torch"
|
||||
},
|
||||
"experience": 0.1,
|
||||
"cookingtime": 20
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"###",
|
||||
"###",
|
||||
"###"
|
||||
],
|
||||
"key": {
|
||||
"#": "gtagdp:rubyball"
|
||||
},
|
||||
"result": {
|
||||
"id": "gtagdp:ruby_block",
|
||||
"count": 1
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shapeless",
|
||||
"ingredients": [
|
||||
"gtagdp:ruby_block"
|
||||
],
|
||||
"result": {
|
||||
"id": "gtagdp:rubyball",
|
||||
"count": 9
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shapeless",
|
||||
"ingredients": [
|
||||
"minecraft:stick"
|
||||
],
|
||||
"result": {
|
||||
"id": "gtagdp:stub",
|
||||
"count": 4
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"replace": false,
|
||||
"values": [
|
||||
"gtagdp:ruby_block",
|
||||
"gtagdp:ruby_ore"
|
||||
]
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"replace": false,
|
||||
"values": [
|
||||
"gtagdp:ruby_block",
|
||||
"gtagdp:ruby_ore"
|
||||
]
|
||||
}
|
@ -3,20 +3,23 @@
|
||||
"id": "gtagdp",
|
||||
"version": "${version}",
|
||||
"name": "GTAGDP",
|
||||
"description": "This is an example description! Tell everyone what your mod is about!",
|
||||
"description": "The reference repository for the Minecraft Fabric Mod Development GTA",
|
||||
"authors": [
|
||||
"Me!"
|
||||
"jotty"
|
||||
],
|
||||
"contact": {
|
||||
"homepage": "https://fabricmc.net/",
|
||||
"sources": "https://github.com/FabricMC/fabric-example-mod"
|
||||
"homepage": "https://git.jottyfan.de/GTA_Minecraft_Fabric_Mod_Development/GTAGDP",
|
||||
"sources": "https://git.jottyfan.de/GTA_Minecraft_Fabric_Mod_Development/GTAGDP"
|
||||
},
|
||||
"license": "CC0-1.0",
|
||||
"license": "GNU AFFERO GENERAL PUBLIC LICENSE",
|
||||
"icon": "assets/gtagdp/icon.png",
|
||||
"environment": "*",
|
||||
"entrypoints": {
|
||||
"main": [
|
||||
"de.jottyfan.gta.dgp.GTAGDP"
|
||||
"de.jottyfan.gta.gdp.GTAGDP"
|
||||
],
|
||||
"client": [
|
||||
"de.jottyfan.gta.gdp.GTAGDPClient"
|
||||
]
|
||||
},
|
||||
"mixins": [
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"required": true,
|
||||
"package": "de.jottyfan.gta.dgp.mixin",
|
||||
"package": "de.jottyfan.gta.gdp.mixin",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"mixins": [
|
||||
"ExampleMixin"
|
||||
|
Reference in New Issue
Block a user