complied with FramedBlock assets License by making this project Multi-Licensed. In addition, wrote a README.md + cache reload fix on resource reload + items for hammer, blueprint and screwdriver + updated to v1.5.5
This commit is contained in:
parent
08bde119b2
commit
5c064176b2
16
LICENSE
16
LICENSE
@ -1,15 +1 @@
|
|||||||
Copyright (c) 2019 B0undarybreaker (Meredith Espinosa)
|
MIT AND LGPL-3.0
|
||||||
Copyright (c) 2024 Adrien1106
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
165
LICENSE.LGPL-3.0
Normal file
165
LICENSE.LGPL-3.0
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
This version of the GNU Lesser General Public License incorporates
|
||||||
|
the terms and conditions of version 3 of the GNU General Public
|
||||||
|
License, supplemented by the additional permissions listed below.
|
||||||
|
|
||||||
|
0. Additional Definitions.
|
||||||
|
|
||||||
|
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||||
|
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
"The Library" refers to a covered work governed by this License,
|
||||||
|
other than an Application or a Combined Work as defined below.
|
||||||
|
|
||||||
|
An "Application" is any work that makes use of an interface provided
|
||||||
|
by the Library, but which is not otherwise based on the Library.
|
||||||
|
Defining a subclass of a class defined by the Library is deemed a mode
|
||||||
|
of using an interface provided by the Library.
|
||||||
|
|
||||||
|
A "Combined Work" is a work produced by combining or linking an
|
||||||
|
Application with the Library. The particular version of the Library
|
||||||
|
with which the Combined Work was made is also called the "Linked
|
||||||
|
Version".
|
||||||
|
|
||||||
|
The "Minimal Corresponding Source" for a Combined Work means the
|
||||||
|
Corresponding Source for the Combined Work, excluding any source code
|
||||||
|
for portions of the Combined Work that, considered in isolation, are
|
||||||
|
based on the Application, and not on the Linked Version.
|
||||||
|
|
||||||
|
The "Corresponding Application Code" for a Combined Work means the
|
||||||
|
object code and/or source code for the Application, including any data
|
||||||
|
and utility programs needed for reproducing the Combined Work from the
|
||||||
|
Application, but excluding the System Libraries of the Combined Work.
|
||||||
|
|
||||||
|
1. Exception to Section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
You may convey a covered work under sections 3 and 4 of this License
|
||||||
|
without being bound by section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
2. Conveying Modified Versions.
|
||||||
|
|
||||||
|
If you modify a copy of the Library, and, in your modifications, a
|
||||||
|
facility refers to a function or data to be supplied by an Application
|
||||||
|
that uses the facility (other than as an argument passed when the
|
||||||
|
facility is invoked), then you may convey a copy of the modified
|
||||||
|
version:
|
||||||
|
|
||||||
|
a) under this License, provided that you make a good faith effort to
|
||||||
|
ensure that, in the event an Application does not supply the
|
||||||
|
function or data, the facility still operates, and performs
|
||||||
|
whatever part of its purpose remains meaningful, or
|
||||||
|
|
||||||
|
b) under the GNU GPL, with none of the additional permissions of
|
||||||
|
this License applicable to that copy.
|
||||||
|
|
||||||
|
3. Object Code Incorporating Material from Library Header Files.
|
||||||
|
|
||||||
|
The object code form of an Application may incorporate material from
|
||||||
|
a header file that is part of the Library. You may convey such object
|
||||||
|
code under terms of your choice, provided that, if the incorporated
|
||||||
|
material is not limited to numerical parameters, data structure
|
||||||
|
layouts and accessors, or small macros, inline functions and templates
|
||||||
|
(ten or fewer lines in length), you do both of the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the object code that the
|
||||||
|
Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
4. Combined Works.
|
||||||
|
|
||||||
|
You may convey a Combined Work under terms of your choice that,
|
||||||
|
taken together, effectively do not restrict modification of the
|
||||||
|
portions of the Library contained in the Combined Work and reverse
|
||||||
|
engineering for debugging such modifications, if you also do each of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the Combined Work that
|
||||||
|
the Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
c) For a Combined Work that displays copyright notices during
|
||||||
|
execution, include the copyright notice for the Library among
|
||||||
|
these notices, as well as a reference directing the user to the
|
||||||
|
copies of the GNU GPL and this license document.
|
||||||
|
|
||||||
|
d) Do one of the following:
|
||||||
|
|
||||||
|
0) Convey the Minimal Corresponding Source under the terms of this
|
||||||
|
License, and the Corresponding Application Code in a form
|
||||||
|
suitable for, and under terms that permit, the user to
|
||||||
|
recombine or relink the Application with a modified version of
|
||||||
|
the Linked Version to produce a modified Combined Work, in the
|
||||||
|
manner specified by section 6 of the GNU GPL for conveying
|
||||||
|
Corresponding Source.
|
||||||
|
|
||||||
|
1) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (a) uses at run time
|
||||||
|
a copy of the Library already present on the user's computer
|
||||||
|
system, and (b) will operate properly with a modified version
|
||||||
|
of the Library that is interface-compatible with the Linked
|
||||||
|
Version.
|
||||||
|
|
||||||
|
e) Provide Installation Information, but only if you would otherwise
|
||||||
|
be required to provide such information under section 6 of the
|
||||||
|
GNU GPL, and only to the extent that such information is
|
||||||
|
necessary to install and execute a modified version of the
|
||||||
|
Combined Work produced by recombining or relinking the
|
||||||
|
Application with a modified version of the Linked Version. (If
|
||||||
|
you use option 4d0, the Installation Information must accompany
|
||||||
|
the Minimal Corresponding Source and Corresponding Application
|
||||||
|
Code. If you use option 4d1, you must provide the Installation
|
||||||
|
Information in the manner specified by section 6 of the GNU GPL
|
||||||
|
for conveying Corresponding Source.)
|
||||||
|
|
||||||
|
5. Combined Libraries.
|
||||||
|
|
||||||
|
You may place library facilities that are a work based on the
|
||||||
|
Library side by side in a single library together with other library
|
||||||
|
facilities that are not Applications and are not covered by this
|
||||||
|
License, and convey such a combined library under terms of your
|
||||||
|
choice, if you do both of the following:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work based
|
||||||
|
on the Library, uncombined with any other library facilities,
|
||||||
|
conveyed under the terms of this License.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library that part of it
|
||||||
|
is a work based on the Library, and explaining where to find the
|
||||||
|
accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
6. Revised Versions of the GNU Lesser General Public License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the GNU Lesser General Public License from time to time. Such new
|
||||||
|
versions will be similar in spirit to the present version, but may
|
||||||
|
differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Library as you received it specifies that a certain numbered version
|
||||||
|
of the GNU Lesser General Public License "or any later version"
|
||||||
|
applies to it, you have the option of following the terms and
|
||||||
|
conditions either of that published version or of any later version
|
||||||
|
published by the Free Software Foundation. If the Library as you
|
||||||
|
received it does not specify a version number of the GNU Lesser
|
||||||
|
General Public License, you may choose any version of the GNU Lesser
|
||||||
|
General Public License ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Library as you received it specifies that a proxy can decide
|
||||||
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
|
permanent authorization for you to choose that version for the
|
||||||
|
Library.
|
15
LICENSE.MIT
Normal file
15
LICENSE.MIT
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
Copyright (c) 2019 B0undarybreaker (Meredith Espinosa)\
|
||||||
|
Copyright (c) 2024 Adrien1106
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
43
README.md
Normal file
43
README.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# ReFramed
|
||||||
|
## Overview
|
||||||
|
This Project is an unofficial port of [FramedBlocks](https://github.com/XFactHD/FramedBlocks)
|
||||||
|
forked from [Templates 2](https://github.com/quat1024/templates-mod).
|
||||||
|
It aims to add the same mechanics as [FramedBlocks](https://github.com/XFactHD/FramedBlocks) into Fabric.
|
||||||
|
|
||||||
|
For a complete Feature list please have a look at the [Modrinth](https://modrinth.com/mod/reframed) page.
|
||||||
|
|
||||||
|
## Information
|
||||||
|
### Where to get it?
|
||||||
|
The mod can be downloaded on [Modrinth](https://modrinth.com/mod/reframed).
|
||||||
|
|
||||||
|
### Issues/requests
|
||||||
|
Any issues/requests may be addressed on this repository in the [Issues](https://github.com/DriHut/ReFramed/issues) section.
|
||||||
|
|
||||||
|
### Out of date?
|
||||||
|
I will be adding new shapes as time passes, but I am currently not planing on keeping up with the newer versions of the game.
|
||||||
|
That said this mod is under permissive licenses and make it easy for anyone to create their own fork.
|
||||||
|
If anyone in the future plans to do so, I will gladly either link it from here and the modrinth page,
|
||||||
|
or based on preferences add the person(s) to the project
|
||||||
|
|
||||||
|
### What Shapes are planed to be added
|
||||||
|
Currently, the list of shapes to be added is pretty simple as the mod is still under development:
|
||||||
|
- Wall
|
||||||
|
- Fence
|
||||||
|
- Pane
|
||||||
|
- Button
|
||||||
|
- Pressure Plate
|
||||||
|
- Trapdoor
|
||||||
|
- Door
|
||||||
|
- Carpet
|
||||||
|
- Post
|
||||||
|
- Half Slab (maybe redundant with Layer)
|
||||||
|
- Slabs Stair (a stair with one end being of a second theme, might be done in multiple blocks)
|
||||||
|
|
||||||
|
Any Ideas feel free to make a suggestion [here](https://github.com/DriHut/ReFramed/issues).
|
||||||
|
|
||||||
|
## License
|
||||||
|
This work is dual-licensed under MIT and LGPL 3.0 both applying to different part of this project:
|
||||||
|
- The LGPL 3.0 license applies to all the textures that can be found in [`assets/reframed/textures`](src/main/resources/assets/reframed/textures)
|
||||||
|
- The MIT license applied to everything else so including all the code present within this project
|
||||||
|
|
||||||
|
`SPDX-License-Identifier: MIT AND LGPL-3.0`
|
@ -9,7 +9,7 @@ loader_version=0.15.6
|
|||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
modrinth_id = jCpoCBpn
|
modrinth_id = jCpoCBpn
|
||||||
mod_version = 1.5
|
mod_version = 1.5.5
|
||||||
maven_group = fr.adrien1106
|
maven_group = fr.adrien1106
|
||||||
archives_base_name = ReFramed
|
archives_base_name = ReFramed
|
||||||
mod_id = reframed
|
mod_id = reframed
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package fr.adrien1106.reframed;
|
package fr.adrien1106.reframed;
|
||||||
|
|
||||||
import fr.adrien1106.reframed.block.*;
|
import fr.adrien1106.reframed.block.*;
|
||||||
|
import fr.adrien1106.reframed.item.ReFramedHammerItem;
|
||||||
|
import fr.adrien1106.reframed.item.ReFramedBlueprintItem;
|
||||||
|
import fr.adrien1106.reframed.item.ReFramedBlueprintWrittenItem;
|
||||||
|
import fr.adrien1106.reframed.item.ReFramedScrewdriverItem;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
|
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
|
||||||
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
|
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
|
||||||
@ -8,10 +12,7 @@ import net.minecraft.block.AbstractBlock;
|
|||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.block.entity.BlockEntityType;
|
import net.minecraft.block.entity.BlockEntityType;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.*;
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ItemGroup;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
import net.minecraft.registry.Registry;
|
import net.minecraft.registry.Registry;
|
||||||
import net.minecraft.sound.BlockSoundGroup;
|
import net.minecraft.sound.BlockSoundGroup;
|
||||||
@ -22,15 +23,12 @@ import net.minecraft.world.World;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.LIGHT;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.LIGHT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO make block pairable by right click -> for v1.6
|
* TODO make block pairable by right click -> for v1.6
|
||||||
* TODO add Hammer from framed ( removes theme ) -> for v1.5.5
|
|
||||||
* TODO add screwdriver ( iterate over theme states ) ?
|
|
||||||
* TODO add blueprint for survival friendly copy paste of a theme. -> for v1.5.5
|
|
||||||
* TODO add minecraft models like wall fence etc -> for v1.6
|
* TODO add minecraft models like wall fence etc -> for v1.6
|
||||||
* TODO better connected textures -> maybe v1.6 ?
|
* TODO better connected textures -> maybe v1.6 ?
|
||||||
*/
|
*/
|
||||||
@ -39,6 +37,10 @@ public class ReFramed implements ModInitializer {
|
|||||||
|
|
||||||
public static final ArrayList<Block> BLOCKS = new ArrayList<>();
|
public static final ArrayList<Block> BLOCKS = new ArrayList<>();
|
||||||
public static Block CUBE, SMALL_CUBE, SMALL_CUBES_STEP, STAIR, HALF_STAIR, STAIRS_CUBE, HALF_STAIRS_SLAB, HALF_STAIRS_STAIR, SLAB, SLABS_CUBE, STEP, STEPS_SLAB, LAYER;
|
public static Block CUBE, SMALL_CUBE, SMALL_CUBES_STEP, STAIR, HALF_STAIR, STAIRS_CUBE, HALF_STAIRS_SLAB, HALF_STAIRS_STAIR, SLAB, SLABS_CUBE, STEP, STEPS_SLAB, LAYER;
|
||||||
|
|
||||||
|
public static final ArrayList<Item> ITEMS = new ArrayList<>();
|
||||||
|
public static Item HAMMER, SCREWDRIVER, BLUEPRINT, BLUEPRINT_WRITTEN;
|
||||||
|
|
||||||
public static ItemGroup ITEM_GROUP;
|
public static ItemGroup ITEM_GROUP;
|
||||||
|
|
||||||
public static BlockEntityType<ReFramedEntity> REFRAMED_BLOCK_ENTITY;
|
public static BlockEntityType<ReFramedEntity> REFRAMED_BLOCK_ENTITY;
|
||||||
@ -48,19 +50,24 @@ public class ReFramed implements ModInitializer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
CUBE = registerReFramed("cube" , new ReFramedBlock(cp(Blocks.OAK_PLANKS)));
|
CUBE = registerBlock("cube" , new ReFramedBlock(cp(Blocks.OAK_PLANKS)));
|
||||||
SMALL_CUBE = registerReFramed("small_cube" , new ReFramedSmallCubeBlock(cp(Blocks.OAK_PLANKS)));
|
SMALL_CUBE = registerBlock("small_cube" , new ReFramedSmallCubeBlock(cp(Blocks.OAK_PLANKS)));
|
||||||
SMALL_CUBES_STEP = registerReFramed("small_cubes_step" , new ReFramedSmallCubesStepBlock(cp(Blocks.OAK_PLANKS)));
|
SMALL_CUBES_STEP = registerBlock("small_cubes_step" , new ReFramedSmallCubesStepBlock(cp(Blocks.OAK_PLANKS)));
|
||||||
STAIR = registerReFramed("stair" , new ReFramedStairBlock(cp(Blocks.OAK_STAIRS)));
|
STAIR = registerBlock("stair" , new ReFramedStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
STAIRS_CUBE = registerReFramed("stairs_cube" , new ReFramedStairsCubeBlock(cp(Blocks.OAK_STAIRS)));
|
STAIRS_CUBE = registerBlock("stairs_cube" , new ReFramedStairsCubeBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
HALF_STAIR = registerReFramed("half_stair" , new ReFramedHalfStairBlock(cp(Blocks.OAK_STAIRS)));
|
HALF_STAIR = registerBlock("half_stair" , new ReFramedHalfStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
HALF_STAIRS_SLAB = registerReFramed("half_stairs_slab" , new ReFramedHalfStairsSlabBlock(cp(Blocks.OAK_STAIRS)));
|
HALF_STAIRS_SLAB = registerBlock("half_stairs_slab" , new ReFramedHalfStairsSlabBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
HALF_STAIRS_STAIR = registerReFramed("half_stairs_stair" , new ReFramedHalfStairsStairBlock(cp(Blocks.OAK_STAIRS)));
|
HALF_STAIRS_STAIR = registerBlock("half_stairs_stair" , new ReFramedHalfStairsStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
LAYER = registerReFramed("layer" , new ReFramedLayerBlock(cp(Blocks.OAK_SLAB)));
|
LAYER = registerBlock("layer" , new ReFramedLayerBlock(cp(Blocks.OAK_SLAB)));
|
||||||
SLAB = registerReFramed("slab" , new ReFramedSlabBlock(cp(Blocks.OAK_SLAB)));
|
SLAB = registerBlock("slab" , new ReFramedSlabBlock(cp(Blocks.OAK_SLAB)));
|
||||||
SLABS_CUBE = registerReFramed("slabs_cube" , new ReFramedSlabsCubeBlock(cp(Blocks.OAK_SLAB)));
|
SLABS_CUBE = registerBlock("slabs_cube" , new ReFramedSlabsCubeBlock(cp(Blocks.OAK_SLAB)));
|
||||||
STEP = registerReFramed("step" , new ReFramedStepBlock(cp(Blocks.OAK_SLAB)));
|
STEP = registerBlock("step" , new ReFramedStepBlock(cp(Blocks.OAK_SLAB)));
|
||||||
STEPS_SLAB = registerReFramed("steps_slab" , new ReFramedStepsSlabBlock(cp(Blocks.OAK_SLAB)));
|
STEPS_SLAB = registerBlock("steps_slab" , new ReFramedStepsSlabBlock(cp(Blocks.OAK_SLAB)));
|
||||||
|
|
||||||
|
HAMMER = registerItem("hammer" , new ReFramedHammerItem(new Item.Settings().maxCount(1)));
|
||||||
|
SCREWDRIVER = registerItem("screwdriver" , new ReFramedScrewdriverItem(new Item.Settings().maxCount(1)));
|
||||||
|
BLUEPRINT = registerItem("blueprint" , new ReFramedBlueprintItem(new Item.Settings()));
|
||||||
|
BLUEPRINT_WRITTEN = registerItem("blueprint_written" , new ReFramedBlueprintWrittenItem(new Item.Settings().maxCount(1)));
|
||||||
|
|
||||||
REFRAMED_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("camo"),
|
REFRAMED_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("camo"),
|
||||||
FabricBlockEntityTypeBuilder.create(
|
FabricBlockEntityTypeBuilder.create(
|
||||||
@ -81,7 +88,12 @@ public class ReFramed implements ModInitializer {
|
|||||||
ITEM_GROUP = Registry.register(Registries.ITEM_GROUP, id("tab"), FabricItemGroup.builder()
|
ITEM_GROUP = Registry.register(Registries.ITEM_GROUP, id("tab"), FabricItemGroup.builder()
|
||||||
.displayName(Text.translatable("itemGroup.reframed.tab"))
|
.displayName(Text.translatable("itemGroup.reframed.tab"))
|
||||||
.icon(() -> new ItemStack(SLAB))
|
.icon(() -> new ItemStack(SLAB))
|
||||||
.entries((ctx, e) -> e.addAll(BLOCKS.stream().map(ItemStack::new).collect(Collectors.toList()))).build()
|
.entries((ctx, e) -> e.addAll(
|
||||||
|
Stream.concat(
|
||||||
|
ITEMS.stream().filter(item -> item != BLUEPRINT_WRITTEN),
|
||||||
|
BLOCKS.stream().map(Block::asItem)
|
||||||
|
).map(Item::getDefaultStack).toList())
|
||||||
|
).build()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +107,14 @@ public class ReFramed implements ModInitializer {
|
|||||||
.blockVision((a,b,c) -> false);
|
.blockVision((a,b,c) -> false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <B extends Block> B registerReFramed(String path, B block) {
|
private static <I extends Item> I registerItem(String path, I item) {
|
||||||
|
Identifier id = id(path);
|
||||||
|
Registry.register(Registries.ITEM, id, item);
|
||||||
|
ITEMS.add(item);
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <B extends Block> B registerBlock(String path, B block) {
|
||||||
Identifier id = id(path);
|
Identifier id = id(path);
|
||||||
|
|
||||||
Registry.register(Registries.BLOCK, id, block);
|
Registry.register(Registries.BLOCK, id, block);
|
||||||
|
@ -31,8 +31,11 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock {
|
|||||||
return ReFramed.REFRAMED_DOUBLE_BLOCK_ENTITY.instantiate(pos, state);
|
return ReFramed.REFRAMED_DOUBLE_BLOCK_ENTITY.instantiate(pos, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getHitShape(BlockState state, BlockHitResult hit) {
|
public int getHitShape(BlockState state, BlockHitResult hit) {
|
||||||
Direction side = hit.getSide();
|
return getHitShape(state, hit.getPos(), hit.getBlockPos(), hit.getSide());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getHitShape(BlockState state, Vec3d hit, BlockPos pos, Direction side) {
|
||||||
VoxelShape first_shape = getShape(state, 1);
|
VoxelShape first_shape = getShape(state, 1);
|
||||||
VoxelShape second_shape = getShape(state, 2);
|
VoxelShape second_shape = getShape(state, 2);
|
||||||
|
|
||||||
@ -40,10 +43,9 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock {
|
|||||||
if (isFaceFullSquare(first_shape, side)) return 1;
|
if (isFaceFullSquare(first_shape, side)) return 1;
|
||||||
if (isFaceFullSquare(second_shape, side)) return 2;
|
if (isFaceFullSquare(second_shape, side)) return 2;
|
||||||
|
|
||||||
Vec3d pos = BlockHelper.getRelativePos(hit.getPos(), hit.getBlockPos());
|
Vec3d rel = BlockHelper.getRelativePos(hit, pos);
|
||||||
// System.out.println(side.getAxis().choose(hit.getPos().x, hit.getPos().y, hit.getPos().z));
|
if (BlockHelper.cursorMatchesFace(first_shape, rel)) return 1;
|
||||||
if (BlockHelper.cursorMatchesFace(first_shape, pos)) return 1;
|
if (BlockHelper.cursorMatchesFace(second_shape, rel)) return 2;
|
||||||
if (BlockHelper.cursorMatchesFace(second_shape, pos)) return 2;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@ public class ReFramedModelProvider implements ModelResourceProvider, ModelVarian
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void dumpCache() {
|
public void dumpCache() {
|
||||||
|
CamoAppearanceManager.dumpCahe();
|
||||||
appearanceManager = null; //volatile write
|
appearanceManager = null; //volatile write
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,12 @@ import java.util.function.Function;
|
|||||||
@Environment(EnvType.CLIENT)
|
@Environment(EnvType.CLIENT)
|
||||||
public class CamoAppearanceManager {
|
public class CamoAppearanceManager {
|
||||||
|
|
||||||
|
|
||||||
|
protected static final SpriteIdentifier DEFAULT_SPRITE_MAIN = new SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, new Identifier(ReFramed.MODID, "block/framed_block"));
|
||||||
|
protected static final SpriteIdentifier DEFAULT_SPRITE_SECONDARY = new SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, new Identifier(ReFramed.MODID, "block/framed_accent_block"));
|
||||||
|
private static final SpriteIdentifier BARRIER_SPRITE_ID = new SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, new Identifier("minecraft:item/barrier"));
|
||||||
|
private static final Cache<BlockState, CamoAppearance> APPEARANCE_CACHE = CacheBuilder.newBuilder().maximumSize(2048).build();
|
||||||
|
|
||||||
public CamoAppearanceManager(Function<SpriteIdentifier, Sprite> spriteLookup) {
|
public CamoAppearanceManager(Function<SpriteIdentifier, Sprite> spriteLookup) {
|
||||||
MaterialFinder finder = ReFramedClient.HELPER.getFabricRenderer().materialFinder();
|
MaterialFinder finder = ReFramedClient.HELPER.getFabricRenderer().materialFinder();
|
||||||
for(BlendMode blend : BlendMode.values()) {
|
for(BlendMode blend : BlendMode.values()) {
|
||||||
@ -60,21 +66,19 @@ public class CamoAppearanceManager {
|
|||||||
this.barrierItemAppearance = new SingleSpriteAppearance(sprite, materials.get(BlendMode.CUTOUT), serial_number.getAndIncrement());
|
this.barrierItemAppearance = new SingleSpriteAppearance(sprite, materials.get(BlendMode.CUTOUT), serial_number.getAndIncrement());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static final SpriteIdentifier DEFAULT_SPRITE_MAIN = new SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, new Identifier(ReFramed.MODID, "block/framed_block"));
|
|
||||||
protected static final SpriteIdentifier DEFAULT_SPRITE_SECONDARY = new SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, new Identifier(ReFramed.MODID, "block/framed_accent_block"));
|
|
||||||
private static final SpriteIdentifier BARRIER_SPRITE_ID = new SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, new Identifier("minecraft:item/barrier"));
|
|
||||||
|
|
||||||
private final CamoAppearance default_appearance;
|
private final CamoAppearance default_appearance;
|
||||||
private final CamoAppearance accent_appearance;
|
private final CamoAppearance accent_appearance;
|
||||||
private final CamoAppearance barrierItemAppearance;
|
private final CamoAppearance barrierItemAppearance;
|
||||||
|
|
||||||
private static final Cache<BlockState, CamoAppearance> APPEARANCE_CACHE = CacheBuilder.newBuilder().maximumSize(2048).build();
|
|
||||||
|
|
||||||
private final AtomicInteger serial_number = new AtomicInteger(0); //Mutable
|
private final AtomicInteger serial_number = new AtomicInteger(0); //Mutable
|
||||||
|
|
||||||
private final EnumMap<BlendMode, RenderMaterial> ao_materials = new EnumMap<>(BlendMode.class);
|
private final EnumMap<BlendMode, RenderMaterial> ao_materials = new EnumMap<>(BlendMode.class);
|
||||||
private final EnumMap<BlendMode, RenderMaterial> materials = new EnumMap<>(BlendMode.class); //Immutable contents
|
private final EnumMap<BlendMode, RenderMaterial> materials = new EnumMap<>(BlendMode.class); //Immutable contents
|
||||||
|
|
||||||
|
public static void dumpCahe() {
|
||||||
|
APPEARANCE_CACHE.invalidateAll();
|
||||||
|
}
|
||||||
|
|
||||||
public CamoAppearance getDefaultAppearance(int appearance) {
|
public CamoAppearance getDefaultAppearance(int appearance) {
|
||||||
return appearance == 2 ? accent_appearance: default_appearance;
|
return appearance == 2 ? accent_appearance: default_appearance;
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,9 @@ public class GBlockstate extends FabricModelProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateItemModels(ItemModelGenerator itemModelGenerator) {}
|
public void generateItemModels(ItemModelGenerator model_generator) {
|
||||||
|
ReFramed.ITEMS.forEach(item -> model_generator.register(item, Models.GENERATED));
|
||||||
|
}
|
||||||
|
|
||||||
public static BlockStateVariant variant(Identifier model, boolean uv_lock, VariantSettings.Rotation x, VariantSettings.Rotation y) {
|
public static BlockStateVariant variant(Identifier model, boolean uv_lock, VariantSettings.Rotation x, VariantSettings.Rotation y) {
|
||||||
BlockStateVariant variant = BlockStateVariant.create().put(VariantSettings.MODEL, model);
|
BlockStateVariant variant = BlockStateVariant.create().put(VariantSettings.MODEL, model);
|
||||||
|
@ -18,6 +18,7 @@ public class GLanguage extends FabricLanguageProvider {
|
|||||||
builder.add(Registries.ITEM_GROUP.getKey(ReFramed.ITEM_GROUP).get(), "Frames");
|
builder.add(Registries.ITEM_GROUP.getKey(ReFramed.ITEM_GROUP).get(), "Frames");
|
||||||
builder.add("advancements.reframed.description", "Get all the frame types.");
|
builder.add("advancements.reframed.description", "Get all the frame types.");
|
||||||
ReFramed.BLOCKS.forEach(block -> builder.add(block, beautify(Registries.BLOCK.getId(block).getPath()) + " Frame"));
|
ReFramed.BLOCKS.forEach(block -> builder.add(block, beautify(Registries.BLOCK.getId(block).getPath()) + " Frame"));
|
||||||
|
ReFramed.ITEMS.forEach(block -> builder.add(block, beautify(Registries.ITEM.getId(block).getPath())));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String beautify(String name) {
|
private static String beautify(String name) {
|
||||||
|
@ -15,5 +15,8 @@ public class GRecipe extends FabricRecipeProvider {
|
|||||||
ReFramed.BLOCKS.forEach(block -> {
|
ReFramed.BLOCKS.forEach(block -> {
|
||||||
if (block instanceof RecipeSetter provider) provider.setRecipe(exporter);
|
if (block instanceof RecipeSetter provider) provider.setRecipe(exporter);
|
||||||
});
|
});
|
||||||
|
ReFramed.ITEMS.forEach(item -> {
|
||||||
|
if (item instanceof RecipeSetter provider) provider.setRecipe(exporter);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,55 @@
|
|||||||
|
package fr.adrien1106.reframed.item;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.block.ReFramedEntity;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUsageContext;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
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;
|
||||||
|
|
||||||
|
public class ReFramedBlueprintItem extends Item implements RecipeSetter {
|
||||||
|
public ReFramedBlueprintItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult useOnBlock(ItemUsageContext context) {
|
||||||
|
BlockPos pos = context.getBlockPos();
|
||||||
|
World world = context.getWorld();
|
||||||
|
if (!(world.getBlockEntity(pos) instanceof ReFramedEntity frame_entity)
|
||||||
|
|| frame_entity.getThemes().stream().noneMatch(state -> state.getBlock() != Blocks.AIR)
|
||||||
|
) return ActionResult.PASS;
|
||||||
|
|
||||||
|
context.getStack().decrement(1);
|
||||||
|
ItemStack stack = ReFramed.BLUEPRINT_WRITTEN.getDefaultStack();
|
||||||
|
frame_entity.setStackNbt(stack);
|
||||||
|
context.getPlayer().giveItemStack(stack);
|
||||||
|
world.playSound(context.getPlayer(), context.getPlayer().getBlockPos(), SoundEvents.ITEM_BOOK_PUT, SoundCategory.PLAYERS);
|
||||||
|
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter) {
|
||||||
|
ShapedRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, this, 3)
|
||||||
|
.pattern("PI")
|
||||||
|
.pattern("PP")
|
||||||
|
.input('P', Items.PAPER)
|
||||||
|
.input('I', Items.INK_SAC)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(Items.PAPER), FabricRecipeProvider.conditionsFromItem(Items.PAPER))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
package fr.adrien1106.reframed.item;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.block.ReFramedEntity;
|
||||||
|
import net.minecraft.block.AbstractBlock;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.entity.player.PlayerInventory;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUsageContext;
|
||||||
|
import net.minecraft.nbt.NbtCompound;
|
||||||
|
import net.minecraft.nbt.NbtHelper;
|
||||||
|
import net.minecraft.registry.Registries;
|
||||||
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
import net.minecraft.sound.SoundEvents;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Formatting;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.TypedActionResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedEntity.BLOCKSTATE_KEY;
|
||||||
|
|
||||||
|
public class ReFramedBlueprintWrittenItem extends Item {
|
||||||
|
public ReFramedBlueprintWrittenItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
if (!player.isSneaking() || !stack.hasNbt()) return super.use(world, player, hand);
|
||||||
|
stack.decrement(1);
|
||||||
|
player.giveItemStack(ReFramed.BLUEPRINT.getDefaultStack());
|
||||||
|
world.playSound(player, player.getBlockPos(), SoundEvents.ITEM_BOOK_PUT, SoundCategory.PLAYERS);
|
||||||
|
|
||||||
|
return TypedActionResult.success(stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult useOnBlock(ItemUsageContext context) {
|
||||||
|
BlockPos pos = context.getBlockPos();
|
||||||
|
World world = context.getWorld();
|
||||||
|
if (!(world.getBlockEntity(pos) instanceof ReFramedEntity frame_entity)
|
||||||
|
|| frame_entity.getThemes().stream().anyMatch(state -> state.getBlock() != Blocks.AIR)
|
||||||
|
|| !context.getStack().hasNbt()
|
||||||
|
) return ActionResult.PASS;
|
||||||
|
|
||||||
|
NbtCompound tag = BlockItem.getBlockEntityNbt(context.getStack());
|
||||||
|
if(tag == null) return ActionResult.FAIL;
|
||||||
|
|
||||||
|
PlayerEntity player = context.getPlayer();
|
||||||
|
if (!player.isCreative()) { // verify player has blocks and remove them
|
||||||
|
PlayerInventory inventory = player.getInventory();
|
||||||
|
List<ItemStack> stacks = getBlockStates(tag).values().stream()
|
||||||
|
.map(AbstractBlock.AbstractBlockState::getBlock)
|
||||||
|
.map(Block::asItem)
|
||||||
|
.map(Item::getDefaultStack)
|
||||||
|
.toList();
|
||||||
|
if (stacks.stream().anyMatch(stack -> !inventory.contains(stack)))
|
||||||
|
return ActionResult.FAIL;
|
||||||
|
stacks.stream().map(inventory::getSlotWithStack).forEach(index -> inventory.removeStack(index, 1));
|
||||||
|
player.playSound(SoundEvents.ENTITY_ITEM_PICKUP, 0.5f, 0.5f);
|
||||||
|
}
|
||||||
|
frame_entity.readNbt(tag);
|
||||||
|
world.playSound(player, player.getBlockPos(), SoundEvents.ITEM_BOOK_PAGE_TURN, SoundCategory.PLAYERS);
|
||||||
|
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void appendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context) {
|
||||||
|
NbtCompound tag = BlockItem.getBlockEntityNbt(stack);
|
||||||
|
if(tag == null) return;
|
||||||
|
|
||||||
|
Map<Integer, BlockState> states = getBlockStates(tag);
|
||||||
|
states.forEach((index, state) -> tooltip.add(
|
||||||
|
Text.literal("Theme " + index + ": ")
|
||||||
|
.append(
|
||||||
|
Text.translatable(state.getBlock().getTranslationKey())
|
||||||
|
.formatted(Formatting.GRAY)
|
||||||
|
)
|
||||||
|
));
|
||||||
|
super.appendTooltip(stack, world, tooltip, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<Integer, BlockState> getBlockStates(NbtCompound tag) {
|
||||||
|
return tag.getKeys().stream()
|
||||||
|
.filter(key ->
|
||||||
|
key.startsWith(BLOCKSTATE_KEY)
|
||||||
|
&& key.replace(BLOCKSTATE_KEY,"").chars().allMatch(Character::isDigit)
|
||||||
|
)
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
key -> Integer.parseInt(key.substring(BLOCKSTATE_KEY.length())),
|
||||||
|
key -> NbtHelper.toBlockState(
|
||||||
|
Registries.BLOCK.getReadOnlyWrapper(),
|
||||||
|
tag.getCompound(key)
|
||||||
|
)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package fr.adrien1106.reframed.item;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.block.ReFramedDoubleBlock;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.ThemeableBlockEntity;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUsageContext;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
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;
|
||||||
|
|
||||||
|
public class ReFramedHammerItem extends Item implements RecipeSetter {
|
||||||
|
public ReFramedHammerItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult useOnBlock(ItemUsageContext context) {
|
||||||
|
World world = context.getWorld();
|
||||||
|
BlockPos pos = context.getBlockPos();
|
||||||
|
if (!(world.getBlockEntity(pos) instanceof ThemeableBlockEntity frame_entity)) return ActionResult.PASS;
|
||||||
|
BlockState state = world.getBlockState(pos);
|
||||||
|
PlayerEntity player = context.getPlayer();
|
||||||
|
int theme_index = state.getBlock() instanceof ReFramedDoubleBlock b
|
||||||
|
? b.getHitShape(
|
||||||
|
state,
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
context.getSide()
|
||||||
|
)
|
||||||
|
: 1;
|
||||||
|
|
||||||
|
if (frame_entity.getTheme(theme_index).getBlock() == Blocks.AIR) return ActionResult.PASS;
|
||||||
|
|
||||||
|
if (!player.isCreative()) {
|
||||||
|
player.giveItemStack(new ItemStack(frame_entity.getTheme(theme_index).getBlock()));
|
||||||
|
world.playSound(player, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1f, 1.1f);
|
||||||
|
}
|
||||||
|
frame_entity.setTheme(Blocks.AIR.getDefaultState(), theme_index);
|
||||||
|
ReFramed.chunkRerenderProxy.accept(world, pos);
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter) {
|
||||||
|
ShapedRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, this)
|
||||||
|
.pattern(" CI")
|
||||||
|
.pattern(" ~C")
|
||||||
|
.pattern("~ ")
|
||||||
|
.input('I', Items.IRON_INGOT)
|
||||||
|
.input('C', ReFramed.CUBE)
|
||||||
|
.input('~', Items.STICK)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
package fr.adrien1106.reframed.item;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.block.ReFramedDoubleBlock;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.ThemeableBlockEntity;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemUsageContext;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
import net.minecraft.sound.BlockSoundGroup;
|
||||||
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
import net.minecraft.state.property.Properties;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
public class ReFramedScrewdriverItem extends Item implements RecipeSetter {
|
||||||
|
|
||||||
|
public ReFramedScrewdriverItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult useOnBlock(ItemUsageContext context) {
|
||||||
|
World world = context.getWorld();
|
||||||
|
BlockPos pos = context.getBlockPos();
|
||||||
|
if (!(world.getBlockEntity(pos) instanceof ThemeableBlockEntity frame_entity)) return ActionResult.PASS;
|
||||||
|
BlockState state = world.getBlockState(pos);
|
||||||
|
PlayerEntity player = context.getPlayer();
|
||||||
|
int theme_index = state.getBlock() instanceof ReFramedDoubleBlock b
|
||||||
|
? b.getHitShape(
|
||||||
|
state,
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
context.getSide()
|
||||||
|
)
|
||||||
|
: 1;
|
||||||
|
|
||||||
|
|
||||||
|
BlockState theme = frame_entity.getTheme(theme_index);
|
||||||
|
if (!theme.contains(Properties.AXIS)) return ActionResult.PASS;
|
||||||
|
|
||||||
|
Direction.Axis axis = theme.get(Properties.AXIS);
|
||||||
|
BlockSoundGroup group = theme.getSoundGroup();
|
||||||
|
world.playSound(player, pos, group.getPlaceSound(), SoundCategory.BLOCKS, group.getVolume(), group.getPitch());
|
||||||
|
frame_entity.setTheme(theme.with(
|
||||||
|
Properties.AXIS,
|
||||||
|
switch (axis) {
|
||||||
|
case X -> Direction.Axis.Y;
|
||||||
|
case Y -> Direction.Axis.Z;
|
||||||
|
case Z -> Direction.Axis.X;
|
||||||
|
}
|
||||||
|
), theme_index);
|
||||||
|
ReFramed.chunkRerenderProxy.accept(world, pos);
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter) {
|
||||||
|
ShapedRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, this)
|
||||||
|
.pattern(" I")
|
||||||
|
.pattern(" I ")
|
||||||
|
.pattern("C ")
|
||||||
|
.input('I', Items.IRON_INGOT)
|
||||||
|
.input('C', ReFramed.CUBE)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
}
|
@ -167,8 +167,8 @@ public class BlockHelper {
|
|||||||
public static ActionResult useCamo(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit, int theme_index) {
|
public static ActionResult useCamo(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit, int theme_index) {
|
||||||
if(!(world.getBlockEntity(pos) instanceof ReFramedEntity block_entity)) return ActionResult.PASS;
|
if(!(world.getBlockEntity(pos) instanceof ReFramedEntity block_entity)) return ActionResult.PASS;
|
||||||
|
|
||||||
// Changing the theme
|
|
||||||
ItemStack held = player.getStackInHand(hand);
|
ItemStack held = player.getStackInHand(hand);
|
||||||
|
// Changing the theme
|
||||||
if(held.getItem() instanceof BlockItem block_item && block_entity.getTheme(theme_index).getBlock() == Blocks.AIR) {
|
if(held.getItem() instanceof BlockItem block_item && block_entity.getTheme(theme_index).getBlock() == Blocks.AIR) {
|
||||||
Block block = block_item.getBlock();
|
Block block = block_item.getBlock();
|
||||||
ItemPlacementContext ctx = new ItemPlacementContext(new ItemUsageContext(player, hand, hit));
|
ItemPlacementContext ctx = new ItemPlacementContext(new ItemUsageContext(player, hand, hit));
|
||||||
|
BIN
src/main/resources/assets/reframed/textures/item/blueprint.png
Normal file
BIN
src/main/resources/assets/reframed/textures/item/blueprint.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.3 KiB |
BIN
src/main/resources/assets/reframed/textures/item/hammer.png
Normal file
BIN
src/main/resources/assets/reframed/textures/item/hammer.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 320 B |
BIN
src/main/resources/assets/reframed/textures/item/screwdriver.png
Normal file
BIN
src/main/resources/assets/reframed/textures/item/screwdriver.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 226 B |
@ -8,7 +8,7 @@
|
|||||||
"Adrien1106"
|
"Adrien1106"
|
||||||
],
|
],
|
||||||
"contact": {},
|
"contact": {},
|
||||||
"license": "MIT",
|
"license": "MIT AND LGPL-3.0",
|
||||||
"icon": "assets/reframed-icon.png",
|
"icon": "assets/reframed-icon.png",
|
||||||
"environment": "*",
|
"environment": "*",
|
||||||
"entrypoints": {
|
"entrypoints": {
|
||||||
|
Loading…
Reference in New Issue
Block a user