From 3c3b802ab907bcec5934fc55e6ab5ac875dab463 Mon Sep 17 00:00:00 2001 From: Andrew-71 Date: Fri, 4 Aug 2023 21:47:09 +0300 Subject: [PATCH] Dice, please fix --- .../su/a71/new_soviet/NewSovietClient.java | 2 + .../su/a71/new_soviet/DataGeneration.java | 3 + .../java/su/a71/new_soviet/NewSoviet.java | 8 +++ .../su/a71/new_soviet/blocks/WindowBlock.java | 60 ++++++++++++++++++ .../su/a71/new_soviet/items/DiceItem.java | 35 ++++++++++ .../{ => registration}/NSE_Blocks.java | 3 +- .../new_soviet/registration/NSE_Combat.java | 48 ++++++++++++++ .../{ => registration}/NSE_Custom.java | 3 +- .../{ => registration}/NSE_Items.java | 11 +++- .../new_soviet/blockstates/landmine.json | 7 ++ .../assets/new_soviet/lang/en_us.json | 8 ++- .../new_soviet/models/block/landmine.json | 57 +++++++++++++++++ .../assets/new_soviet/models/item/dice.json | 7 ++ .../resources/assets/new_soviet/sounds.json | 9 +++ .../assets/new_soviet/sounds/dice_roll.ogg | Bin 0 -> 10369 bytes .../assets/new_soviet/textures/item/dice.png | Bin 0 -> 198 bytes 16 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 src/main/java/su/a71/new_soviet/blocks/WindowBlock.java create mode 100644 src/main/java/su/a71/new_soviet/items/DiceItem.java rename src/main/java/su/a71/new_soviet/{ => registration}/NSE_Blocks.java (99%) create mode 100644 src/main/java/su/a71/new_soviet/registration/NSE_Combat.java rename src/main/java/su/a71/new_soviet/{ => registration}/NSE_Custom.java (97%) rename src/main/java/su/a71/new_soviet/{ => registration}/NSE_Items.java (82%) create mode 100644 src/main/resources/assets/new_soviet/blockstates/landmine.json create mode 100644 src/main/resources/assets/new_soviet/models/block/landmine.json create mode 100644 src/main/resources/assets/new_soviet/models/item/dice.json create mode 100644 src/main/resources/assets/new_soviet/sounds.json create mode 100644 src/main/resources/assets/new_soviet/sounds/dice_roll.ogg create mode 100644 src/main/resources/assets/new_soviet/textures/item/dice.png diff --git a/src/client/java/su/a71/new_soviet/NewSovietClient.java b/src/client/java/su/a71/new_soviet/NewSovietClient.java index 0f1f9d8..8891aa0 100644 --- a/src/client/java/su/a71/new_soviet/NewSovietClient.java +++ b/src/client/java/su/a71/new_soviet/NewSovietClient.java @@ -5,6 +5,8 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.minecraft.client.render.RenderLayer; +import su.a71.new_soviet.registration.NSE_Blocks; +import su.a71.new_soviet.registration.NSE_Custom; @Environment(EnvType.CLIENT) public class NewSovietClient implements ClientModInitializer { diff --git a/src/main/java/su/a71/new_soviet/DataGeneration.java b/src/main/java/su/a71/new_soviet/DataGeneration.java index f2a0ba2..345ac30 100644 --- a/src/main/java/su/a71/new_soviet/DataGeneration.java +++ b/src/main/java/su/a71/new_soviet/DataGeneration.java @@ -22,6 +22,9 @@ import net.minecraft.recipe.book.RecipeCategory; import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.tag.BlockTags; import net.minecraft.util.Util; +import su.a71.new_soviet.registration.NSE_Blocks; +import su.a71.new_soviet.registration.NSE_Custom; +import su.a71.new_soviet.registration.NSE_Items; import java.util.List; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/su/a71/new_soviet/NewSoviet.java b/src/main/java/su/a71/new_soviet/NewSoviet.java index c4de9b6..f376093 100644 --- a/src/main/java/su/a71/new_soviet/NewSoviet.java +++ b/src/main/java/su/a71/new_soviet/NewSoviet.java @@ -4,18 +4,25 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import net.fabricmc.api.ModInitializer; +import net.minecraft.util.math.random.Random; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import su.a71.new_soviet.registration.NSE_Blocks; +import su.a71.new_soviet.registration.NSE_Combat; +import su.a71.new_soviet.registration.NSE_Custom; +import su.a71.new_soviet.registration.NSE_Items; public class NewSoviet implements ModInitializer { public static final String MOD_ID = "new_soviet"; public static final String MOD_NAME = "New Soviet Era"; public static final Logger LOG; public static final Gson GSON; + public static final Random RANDOM; static { LOG = LoggerFactory.getLogger(MOD_NAME); GSON = (new GsonBuilder()).setPrettyPrinting().create(); + RANDOM = Random.create(); } @Override @@ -24,5 +31,6 @@ public class NewSoviet implements ModInitializer { NSE_Blocks.initFlame(); NSE_Items.init(); NSE_Custom.init(); + NSE_Combat.init(); } } \ No newline at end of file diff --git a/src/main/java/su/a71/new_soviet/blocks/WindowBlock.java b/src/main/java/su/a71/new_soviet/blocks/WindowBlock.java new file mode 100644 index 0000000..c050345 --- /dev/null +++ b/src/main/java/su/a71/new_soviet/blocks/WindowBlock.java @@ -0,0 +1,60 @@ +package su.a71.new_soviet.blocks; + +import net.minecraft.block.*; +import net.minecraft.entity.Entity; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; + +public class WindowBlock extends HorizontalFacingBlock { + public static final IntProperty WIN_TYPE = IntProperty.of("window_type", 0, 2); + public static final BooleanProperty BROKEN = Properties.CRACKED; + + public WindowBlock(Settings settings) { + super(settings); + setDefaultState(getDefaultState() + .with(Properties.HORIZONTAL_FACING, Direction.NORTH) + .with(BROKEN, false) + .with(WIN_TYPE, 0)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(Properties.HORIZONTAL_FACING, WIN_TYPE, Properties.CRACKED); + } + + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + if (entity instanceof ProjectileEntity) { + world.getBlockState(pos); + } + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext ctx) { + Direction dir = state.get(FACING); + return switch (dir) { + case NORTH, SOUTH -> VoxelShapes.cuboid(0.0625f, 0.0f, 0.3125f, 0.9375f, 0.5625f, 0.6875f); + case EAST, WEST -> VoxelShapes.cuboid(0.3125f, 0.0f, 0.0625f, 0.6875f, 0.5625f, 0.9375f); + default -> VoxelShapes.fullCube(); + }; + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + BlockState above = ctx.getWorld().getBlockState(ctx.getBlockPos().up()); + BlockState below = ctx.getWorld().getBlockState(ctx.getBlockPos().down()); +// if ((above.getBlock() instanceof Window && ((Window) above.getBlock()).getStateManager().getProperty("broken") == true) || (below.getBlock() instanceof Window)) { +// +// } + return super.getPlacementState(ctx).with(Properties.HORIZONTAL_FACING, ctx.getHorizontalPlayerFacing().getOpposite()); + } +} diff --git a/src/main/java/su/a71/new_soviet/items/DiceItem.java b/src/main/java/su/a71/new_soviet/items/DiceItem.java new file mode 100644 index 0000000..0ddbf67 --- /dev/null +++ b/src/main/java/su/a71/new_soviet/items/DiceItem.java @@ -0,0 +1,35 @@ +package su.a71.new_soviet.items; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.sound.SoundCategory; +import net.minecraft.stat.Stats; +import net.minecraft.text.Text; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; +import su.a71.new_soviet.NewSoviet; +import su.a71.new_soviet.registration.NSE_Items; + +public class DiceItem extends Item { + public DiceItem(Settings settings) { + super(settings); + } + + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + ItemStack itemStack = user.getStackInHand(hand); + user.getItemCooldownManager().set(this, 20 * itemStack.getCount()); + if (!world.isClient) { + StringBuilder output = new StringBuilder(); + for (var i = 0; i < itemStack.getCount(); i++) { + world.playSound((PlayerEntity)null, user.getX(), user.getY(), user.getZ(), NSE_Items.DICE_SOUND, SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); + output.append(NewSoviet.RANDOM.nextBetween(1, 6) + ", "); + } + user.sendMessage(Text.translatable("item.new_soviet.dice.thrown").append(" " + output.subSequence(0, output.length() - 2))); + } + + user.incrementStat(Stats.USED.getOrCreateStat(this)); + return TypedActionResult.success(itemStack, world.isClient()); + } +} diff --git a/src/main/java/su/a71/new_soviet/NSE_Blocks.java b/src/main/java/su/a71/new_soviet/registration/NSE_Blocks.java similarity index 99% rename from src/main/java/su/a71/new_soviet/NSE_Blocks.java rename to src/main/java/su/a71/new_soviet/registration/NSE_Blocks.java index f665528..9873de4 100644 --- a/src/main/java/su/a71/new_soviet/NSE_Blocks.java +++ b/src/main/java/su/a71/new_soviet/registration/NSE_Blocks.java @@ -1,4 +1,4 @@ -package su.a71.new_soviet; +package su.a71.new_soviet.registration; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; @@ -18,6 +18,7 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import su.a71.new_soviet.NewSoviet; import java.util.Optional; import java.util.function.Supplier; diff --git a/src/main/java/su/a71/new_soviet/registration/NSE_Combat.java b/src/main/java/su/a71/new_soviet/registration/NSE_Combat.java new file mode 100644 index 0000000..ec8ff8e --- /dev/null +++ b/src/main/java/su/a71/new_soviet/registration/NSE_Combat.java @@ -0,0 +1,48 @@ +package su.a71.new_soviet.registration; + +import net.fabricmc.fabric.api.item.v1.FabricItemSettings; +import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; +import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.MapColor; +import net.minecraft.item.*; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import su.a71.new_soviet.NewSoviet; +import su.a71.new_soviet.blocks.*; + +import java.util.Optional; +import java.util.function.Supplier; + +public class NSE_Combat { + + public static final LandMineBlock LANDMINE = new LandMineBlock(FabricBlockSettings.create().mapColor(MapColor.LIGHT_GRAY)); + + private static final ItemGroup NSE_COMBAT_TAB = FabricItemGroup.builder() + .icon(() -> new ItemStack(LANDMINE)) + .displayName(Text.translatable("itemGroup.new_soviet.combat")) + .build(); + + + private static void register(String name, Supplier supplier, ItemGroup tab) { + Registry.register(Registries.BLOCK, new Identifier(NewSoviet.MOD_ID, name), supplier.get()); + BlockItem blockItem = new BlockItem(supplier.get(), new FabricItemSettings()); + Registry.register(Registries.ITEM, new Identifier(NewSoviet.MOD_ID, name), blockItem); + + Optional> key = Registries.ITEM_GROUP.getKey(tab); + key.ifPresent(itemGroupRegistryKey -> ItemGroupEvents.modifyEntriesEvent(itemGroupRegistryKey).register(content -> { + content.add(blockItem); + })); + } + + public static void init() { + Registry.register(Registries.ITEM_GROUP, new Identifier("new_soviet", "combat"), NSE_COMBAT_TAB); + register("landmine", () -> LANDMINE, NSE_COMBAT_TAB); + + } +} diff --git a/src/main/java/su/a71/new_soviet/NSE_Custom.java b/src/main/java/su/a71/new_soviet/registration/NSE_Custom.java similarity index 97% rename from src/main/java/su/a71/new_soviet/NSE_Custom.java rename to src/main/java/su/a71/new_soviet/registration/NSE_Custom.java index d1c1e53..dc07b6b 100644 --- a/src/main/java/su/a71/new_soviet/NSE_Custom.java +++ b/src/main/java/su/a71/new_soviet/registration/NSE_Custom.java @@ -1,4 +1,4 @@ -package su.a71.new_soviet; +package su.a71.new_soviet.registration; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; @@ -15,6 +15,7 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import su.a71.new_soviet.NewSoviet; import su.a71.new_soviet.blocks.*; import java.util.Optional; diff --git a/src/main/java/su/a71/new_soviet/NSE_Items.java b/src/main/java/su/a71/new_soviet/registration/NSE_Items.java similarity index 82% rename from src/main/java/su/a71/new_soviet/NSE_Items.java rename to src/main/java/su/a71/new_soviet/registration/NSE_Items.java index 0e9e7fd..99904ab 100644 --- a/src/main/java/su/a71/new_soviet/NSE_Items.java +++ b/src/main/java/su/a71/new_soviet/registration/NSE_Items.java @@ -1,4 +1,4 @@ -package su.a71.new_soviet; +package su.a71.new_soviet.registration; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; @@ -12,12 +12,15 @@ import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundEvent; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import java.util.Optional; import java.util.function.Supplier; import net.minecraft.util.Rarity; +import su.a71.new_soviet.NewSoviet; +import su.a71.new_soviet.items.DiceItem; public class NSE_Items { // Like an iron axe but a hoe and slightly faster (-2.8f vs -3.1f) and a bit weaker (6 vs 6.5 damage) @@ -27,6 +30,9 @@ public class NSE_Items { public static final FoodComponent COCONUT_FC = (new FoodComponent.Builder()).hunger(4).saturationModifier(1.2F).statusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 100, 1), 1.0F).statusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 2400, 0), 1.0F).alwaysEdible().build(); public static final Item COCONUT = new Item(new Item.Settings().food(COCONUT_FC).rarity(Rarity.EPIC)); + public static final DiceItem DICE = new DiceItem(new Item.Settings().maxCount(6)); + public static final SoundEvent DICE_SOUND = SoundEvent.of(new Identifier("new_soviet", "dice_sound")); + private static final ItemGroup NSE_ITEMS_TAB = FabricItemGroup.builder() .icon(() -> new ItemStack(SICKLE)) .displayName(Text.translatable("itemGroup.new_soviet.items")) @@ -46,5 +52,8 @@ public class NSE_Items { Registry.register(Registries.ITEM_GROUP, new Identifier("new_soviet", "items"), NSE_ITEMS_TAB); register("sickle", () -> SICKLE, NSE_ITEMS_TAB); register("coconut", () -> COCONUT, NSE_ITEMS_TAB); + register("dice", () -> DICE, NSE_ITEMS_TAB); + + Registry.register(Registries.SOUND_EVENT, new Identifier("new_soviet", "dice_sound"), DICE_SOUND); } } diff --git a/src/main/resources/assets/new_soviet/blockstates/landmine.json b/src/main/resources/assets/new_soviet/blockstates/landmine.json new file mode 100644 index 0000000..d6823f3 --- /dev/null +++ b/src/main/resources/assets/new_soviet/blockstates/landmine.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "new_soviet:block/landmine" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/new_soviet/lang/en_us.json b/src/main/resources/assets/new_soviet/lang/en_us.json index 9834322..47acaae 100644 --- a/src/main/resources/assets/new_soviet/lang/en_us.json +++ b/src/main/resources/assets/new_soviet/lang/en_us.json @@ -2,6 +2,7 @@ "itemGroup.new_soviet.building_blocks": "Soviet Building Blocks", "itemGroup.new_soviet.items": "Soviet Items", "itemGroup.new_soviet.custom": "Soviet Additions", + "itemGroup.new_soviet.combat": "Soviet Combat", "block.new_soviet.sand_tiles": "Sand Tiles", "block.new_soviet.cracked_sand_tiles": "Cracked Sand Tiles", "block.new_soviet.mossy_sand_tiles": "Mossy Sand Tiles", @@ -126,6 +127,9 @@ "block.new_soviet.radio": "Radio", "block.new_soviet.lamp": "Lamp", "block.new_soviet.ceiling_fan": "Ceiling Fan", - "block.new_soviet.siren": "Siren" - + "block.new_soviet.siren": "Siren", + "item.new_soviet.dice": "Dice", + "item.new_soviet.dice.thrown": "Dice was thrown with result:", + "subtitles.new_soviet.dice_throw": "Dice thrown", + "block.new_soviet.landmine": "AP Landmine" } \ No newline at end of file diff --git a/src/main/resources/assets/new_soviet/models/block/landmine.json b/src/main/resources/assets/new_soviet/models/block/landmine.json new file mode 100644 index 0000000..916f946 --- /dev/null +++ b/src/main/resources/assets/new_soviet/models/block/landmine.json @@ -0,0 +1,57 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "new_soviet:block/combat/ap_mine", + "particle": "new_soviet:block/combat/ap_mine" + }, + "elements": [ + { + "from": [5, 1, 5], + "to": [11, 2, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [3, 3, 6, 3.5], "texture": "#0"}, + "east": {"uv": [0, 3, 3, 3.5], "texture": "#0"}, + "south": {"uv": [9, 3, 12, 3.5], "texture": "#0"}, + "west": {"uv": [6, 3, 9, 3.5], "texture": "#0"}, + "up": {"uv": [6, 3, 3, 0], "texture": "#0"}, + "down": {"uv": [9, 0, 6, 3], "texture": "#0"} + } + }, + { + "from": [5.5, 0, 5.5], + "to": [10.5, 1, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 0, 8.5]}, + "faces": { + "north": {"uv": [2.5, 6, 5, 6.5], "texture": "#0"}, + "east": {"uv": [0, 6, 2.5, 6.5], "texture": "#0"}, + "south": {"uv": [7.5, 6, 10, 6.5], "texture": "#0"}, + "west": {"uv": [5, 6, 7.5, 6.5], "texture": "#0"}, + "up": {"uv": [5, 6, 2.5, 3.5], "texture": "#0"}, + "down": {"uv": [7.5, 3.5, 5, 6], "texture": "#0"} + } + }, + { + "from": [7.5, 0, 4.5], + "to": [8.5, 1, 5.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 0, 8.5]}, + "faces": { + "north": {"uv": [0.5, 0.5, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0.5, 0.5, 1], "texture": "#0"}, + "south": {"uv": [1.5, 0.5, 2, 1], "texture": "#0"}, + "west": {"uv": [1, 0.5, 1.5, 1], "texture": "#0"}, + "up": {"uv": [1, 0.5, 0.5, 0], "texture": "#0"}, + "down": {"uv": [1.5, 0, 1, 0.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/new_soviet/models/item/dice.json b/src/main/resources/assets/new_soviet/models/item/dice.json new file mode 100644 index 0000000..ee1bee9 --- /dev/null +++ b/src/main/resources/assets/new_soviet/models/item/dice.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "new_soviet:item/dice" + } +} + diff --git a/src/main/resources/assets/new_soviet/sounds.json b/src/main/resources/assets/new_soviet/sounds.json new file mode 100644 index 0000000..7762369 --- /dev/null +++ b/src/main/resources/assets/new_soviet/sounds.json @@ -0,0 +1,9 @@ +{ + "dice_sound": { + "subtitle": "subtitles.new_soviet.dice_throw", + "sounds": [ + "new_soviet:dice_roll" + ] + } +} + diff --git a/src/main/resources/assets/new_soviet/sounds/dice_roll.ogg b/src/main/resources/assets/new_soviet/sounds/dice_roll.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8d4d4057ff2f6c1c1f0cc6c38e02120f2078c1a7 GIT binary patch literal 10369 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 j^??TRrABzB`T8