Added golden and diamond randomizer bags (with container, screen, icon and recipe). Updated recipes for reach upgrades.
@@ -1,159 +0,0 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
// These repositories are only for Gradle plugins, put any other repositories in the repository block further below
|
||||
maven { url = 'https://maven.minecraftforge.net' }
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true
|
||||
}
|
||||
}
|
||||
apply plugin: 'net.minecraftforge.gradle'
|
||||
// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
|
||||
apply plugin: 'eclipse'
|
||||
apply plugin: 'maven-publish'
|
||||
|
||||
version = '1.17.1-2.24'
|
||||
group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||
archivesBaseName = 'effortlessbuilding'
|
||||
|
||||
// Mojang ships Java 16 to end users in 1.17+ instead of Java 8 in 1.16 or lower, so your mod should target Java 16.
|
||||
java.toolchain.languageVersion = JavaLanguageVersion.of(16)
|
||||
|
||||
minecraft {
|
||||
// The mappings can be changed at any time and must be in the following format.
|
||||
// Channel: Version:
|
||||
// snapshot YYYYMMDD Snapshot are built nightly.
|
||||
// stable # Stables are built at the discretion of the MCP team.
|
||||
// official MCVersion Official field/method names from Mojang mapping files
|
||||
//
|
||||
// You must be aware of the Mojang license when using the 'official' mappings.
|
||||
// See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md
|
||||
//
|
||||
// Use non-default mappings at your own risk. They may not always work.
|
||||
// Simply re-run your setup task after changing the mappings to update your workspace.
|
||||
mappings channel: 'official', version: '1.17.1'
|
||||
|
||||
// accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default.
|
||||
|
||||
// Default run configurations.
|
||||
// These can be tweaked, removed, or duplicated as needed.
|
||||
runs {
|
||||
client {
|
||||
workingDirectory project.file('run')
|
||||
|
||||
// Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP)
|
||||
property 'forge.logging.markers', 'REGISTRIES'
|
||||
|
||||
// Recommended logging level for the console
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
|
||||
mods {
|
||||
effortlessbuilding {
|
||||
source sourceSets.main
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
workingDirectory project.file('run')
|
||||
|
||||
// Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP)
|
||||
property 'forge.logging.markers', 'REGISTRIES'
|
||||
|
||||
// Recommended logging level for the console
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
|
||||
mods {
|
||||
effortlessbuilding {
|
||||
source sourceSets.main
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data {
|
||||
workingDirectory project.file('run')
|
||||
|
||||
// Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP)
|
||||
property 'forge.logging.markers', 'REGISTRIES'
|
||||
|
||||
// Recommended logging level for the console
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
|
||||
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
|
||||
args '--mod', 'effortlessbuilding', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')
|
||||
|
||||
mods {
|
||||
effortlessbuilding {
|
||||
source sourceSets.main
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Include resources generated by data generators.
|
||||
sourceSets.main.resources { srcDir 'src/generated/resources' }
|
||||
|
||||
repositories {
|
||||
// Put repositories for dependencies here
|
||||
// ForgeGradle automatically adds the Forge maven and Maven Central for you
|
||||
|
||||
// If you have mod jar dependencies in ./libs, you can declare them as a repository like so:
|
||||
// flatDir {
|
||||
// dir 'libs'
|
||||
// }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed
|
||||
// that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied.
|
||||
// The userdev artifact is a special name and will get all sorts of transformations applied to it.
|
||||
minecraft 'net.minecraftforge:forge:1.17.1-37.0.50'
|
||||
|
||||
// Real mod deobf dependency examples - these get remapped to your current mappings
|
||||
// compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency
|
||||
// runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency
|
||||
// implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency
|
||||
|
||||
// Examples using mod jars from ./libs
|
||||
// implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}")
|
||||
|
||||
// For more info...
|
||||
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
|
||||
// http://www.gradle.org/docs/current/userguide/dependency_management.html
|
||||
}
|
||||
|
||||
// Example for how to get properties into the manifest for reading by the runtime..
|
||||
jar {
|
||||
manifest {
|
||||
attributes([
|
||||
"Specification-Title": "effortlessbuilding",
|
||||
"Specification-Vendor": "requios",
|
||||
"Specification-Version": "1", // We are version 1 of ourselves
|
||||
"Implementation-Title": project.name,
|
||||
"Implementation-Version": "${version}",
|
||||
"Implementation-Vendor" :"requios",
|
||||
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
// Example configuration to allow publishing using the maven-publish task
|
||||
// This is the preferred method to reobfuscate your jar file
|
||||
jar.finalizedBy('reobfJar')
|
||||
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing
|
||||
//publish.dependsOn('reobfJar')
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
mavenJava(MavenPublication) {
|
||||
artifact jar
|
||||
}
|
||||
}
|
||||
repositories {
|
||||
maven {
|
||||
url "file:///${project.projectDir}/mcmodsrepo"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ apply plugin: 'net.minecraftforge.gradle'
|
||||
apply plugin: 'eclipse'
|
||||
apply plugin: 'maven-publish'
|
||||
|
||||
version = '1.17.1-2.24'
|
||||
version = '1.17.1-2.26'
|
||||
group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||
archivesBaseName = 'effortlessbuilding'
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ import net.minecraft.world.inventory.MenuType;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.network.chat.TextComponent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
@@ -18,18 +17,15 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||
import net.minecraftforge.fmllegacy.RegistryObject;
|
||||
import net.minecraftforge.fmllegacy.network.IContainerFactory;
|
||||
import net.minecraftforge.fmlserverevents.FMLServerStartingEvent;
|
||||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
import nl.requios.effortlessbuilding.capability.ModeCapabilityManager;
|
||||
import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager;
|
||||
import nl.requios.effortlessbuilding.command.CommandReach;
|
||||
import nl.requios.effortlessbuilding.compatibility.CompatHelper;
|
||||
import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagContainer;
|
||||
import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagContainer;
|
||||
import nl.requios.effortlessbuilding.gui.RandomizerBagContainer;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.item.ReachUpgrade1Item;
|
||||
import nl.requios.effortlessbuilding.item.ReachUpgrade2Item;
|
||||
import nl.requios.effortlessbuilding.item.ReachUpgrade3Item;
|
||||
import nl.requios.effortlessbuilding.item.*;
|
||||
import nl.requios.effortlessbuilding.network.PacketHandler;
|
||||
import nl.requios.effortlessbuilding.proxy.ClientProxy;
|
||||
import nl.requios.effortlessbuilding.proxy.IProxy;
|
||||
@@ -51,13 +47,15 @@ public class EffortlessBuilding {
|
||||
private static final DeferredRegister<MenuType<?>> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, EffortlessBuilding.MODID);
|
||||
|
||||
public static final RegistryObject<Item> RANDOMIZER_BAG_ITEM = ITEMS.register("randomizer_bag", RandomizerBagItem::new);
|
||||
public static final RegistryObject<Item> GOLDEN_RANDOMIZER_BAG_ITEM = ITEMS.register("golden_randomizer_bag", GoldenRandomizerBagItem::new);
|
||||
public static final RegistryObject<Item> DIAMOND_RANDOMIZER_BAG_ITEM = ITEMS.register("diamond_randomizer_bag", DiamondRandomizerBagItem::new);
|
||||
public static final RegistryObject<Item> REACH_UPGRADE_1_ITEM = ITEMS.register("reach_upgrade1", ReachUpgrade1Item::new);
|
||||
public static final RegistryObject<Item> REACH_UPGRADE_2_ITEM = ITEMS.register("reach_upgrade2", ReachUpgrade2Item::new);
|
||||
public static final RegistryObject<Item> REACH_UPGRADE_3_ITEM = ITEMS.register("reach_upgrade3", ReachUpgrade3Item::new);
|
||||
|
||||
public static final RegistryObject<MenuType<RandomizerBagContainer>> RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("randomizer_bag", () -> registerContainer(RandomizerBagContainer::new));
|
||||
|
||||
public static final ResourceLocation RANDOMIZER_BAG_GUI = new ResourceLocation(EffortlessBuilding.MODID, "randomizer_bag");
|
||||
public static final RegistryObject<MenuType<GoldenRandomizerBagContainer>> GOLDEN_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("golden_randomizer_bag", () -> registerContainer(GoldenRandomizerBagContainer::new));
|
||||
public static final RegistryObject<MenuType<DiamondRandomizerBagContainer>> DIAMOND_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("diamond_randomizer_bag", () -> registerContainer(DiamondRandomizerBagContainer::new));
|
||||
|
||||
public EffortlessBuilding() {
|
||||
instance = this;
|
||||
|
||||
@@ -9,7 +9,7 @@ import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.core.Vec3i;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -45,17 +45,19 @@ public class Array {
|
||||
Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ());
|
||||
|
||||
//Randomizer bag synergy
|
||||
AbstractRandomizerBagItem randomizerBagItem = null;
|
||||
IItemHandler bagInventory = null;
|
||||
if (!itemStack.isEmpty() && itemStack.getItem() instanceof RandomizerBagItem) {
|
||||
bagInventory = RandomizerBagItem.getBagInventory(itemStack);
|
||||
if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) {
|
||||
randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ;
|
||||
bagInventory = randomizerBagItem.getBagInventory(itemStack);
|
||||
}
|
||||
|
||||
for (int i = 0; i < a.count; i++) {
|
||||
pos = pos.offset(offset);
|
||||
|
||||
//Randomizer bag synergy
|
||||
if (bagInventory != null) {
|
||||
itemStack = RandomizerBagItem.pickRandomStack(bagInventory);
|
||||
if (randomizerBagItem != null) {
|
||||
itemStack = randomizerBagItem.pickRandomStack(bagInventory);
|
||||
blockState = BuildModifiers
|
||||
.getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vec3(0, 0, 0), InteractionHand.MAIN_HAND);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import net.minecraft.world.level.Level;
|
||||
import nl.requios.effortlessbuilding.compatibility.CompatHelper;
|
||||
import nl.requios.effortlessbuilding.helper.InventoryHelper;
|
||||
import nl.requios.effortlessbuilding.helper.SurvivalHelper;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.render.BlockPreviewRenderer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -29,7 +29,7 @@ public class BuildModifiers {
|
||||
//Called from BuildModes
|
||||
public static void onBlockPlaced(Player player, List<BlockPos> startCoordinates, Direction sideHit, Vec3 hitVec, boolean placeStartPos) {
|
||||
Level world = player.level;
|
||||
RandomizerBagItem.renewRandomness();
|
||||
AbstractRandomizerBagItem.renewRandomness();
|
||||
|
||||
//Format hitvec to 0.x
|
||||
hitVec = new Vec3(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), Math.abs(hitVec.z - ((int) hitVec.z)));
|
||||
@@ -192,7 +192,7 @@ public class BuildModifiers {
|
||||
ItemStack itemBlock = ItemStack.EMPTY;
|
||||
if (itemStack.getItem() instanceof BlockItem) itemBlock = itemStack;
|
||||
else itemBlock = CompatHelper.getItemBlockFromStack(itemStack);
|
||||
RandomizerBagItem.resetRandomness();
|
||||
AbstractRandomizerBagItem.resetRandomness();
|
||||
|
||||
//Add blocks in posList first
|
||||
for (BlockPos blockPos : posList) {
|
||||
|
||||
@@ -9,7 +9,7 @@ import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -70,9 +70,11 @@ public class Mirror {
|
||||
if (!isEnabled(m, startPos)) return blockStates;
|
||||
|
||||
//Randomizer bag synergy
|
||||
AbstractRandomizerBagItem randomizerBagItem = null;
|
||||
IItemHandler bagInventory = null;
|
||||
if (!itemStack.isEmpty() && itemStack.getItem() instanceof RandomizerBagItem) {
|
||||
bagInventory = RandomizerBagItem.getBagInventory(itemStack);
|
||||
if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) {
|
||||
randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ;
|
||||
bagInventory = randomizerBagItem.getBagInventory(itemStack);
|
||||
}
|
||||
|
||||
if (m.mirrorX)
|
||||
@@ -93,7 +95,7 @@ public class Mirror {
|
||||
|
||||
//Randomizer bag synergy
|
||||
if (bagInventory != null) {
|
||||
itemStack = RandomizerBagItem.pickRandomStack(bagInventory);
|
||||
itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory);
|
||||
oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand);
|
||||
}
|
||||
|
||||
@@ -118,7 +120,7 @@ public class Mirror {
|
||||
|
||||
//Randomizer bag synergy
|
||||
if (bagInventory != null) {
|
||||
itemStack = RandomizerBagItem.pickRandomStack(bagInventory);
|
||||
itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory);
|
||||
oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand);
|
||||
}
|
||||
|
||||
@@ -141,7 +143,7 @@ public class Mirror {
|
||||
|
||||
//Randomizer bag synergy
|
||||
if (bagInventory != null) {
|
||||
itemStack = RandomizerBagItem.pickRandomStack(bagInventory);
|
||||
itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory);
|
||||
oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -74,9 +74,11 @@ public class RadialMirror {
|
||||
blockState = rotateOriginalBlockState(startAngleToCenter, blockState);
|
||||
|
||||
//Randomizer bag synergy
|
||||
AbstractRandomizerBagItem randomizerBagItem = null;
|
||||
IItemHandler bagInventory = null;
|
||||
if (!itemStack.isEmpty() && itemStack.getItem() instanceof RandomizerBagItem) {
|
||||
bagInventory = RandomizerBagItem.getBagInventory(itemStack);
|
||||
if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) {
|
||||
randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ;
|
||||
bagInventory = randomizerBagItem.getBagInventory(itemStack);
|
||||
}
|
||||
|
||||
BlockState newBlockState;
|
||||
@@ -95,8 +97,8 @@ public class RadialMirror {
|
||||
coordinates.add(newBlockPos);
|
||||
|
||||
//Randomizer bag synergy
|
||||
if (bagInventory != null) {
|
||||
itemStack = RandomizerBagItem.pickRandomStack(bagInventory);
|
||||
if (randomizerBagItem != null) {
|
||||
itemStack = randomizerBagItem.pickRandomStack(bagInventory);
|
||||
newBlockState = BuildModifiers
|
||||
.getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vec3(0, 0, 0), InteractionHand.MAIN_HAND);
|
||||
|
||||
|
||||
@@ -8,13 +8,16 @@ import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class ItemHandlerCapabilityProvider implements ICapabilitySerializable<CompoundTag> {
|
||||
IItemHandler itemHandler = new ItemStackHandler(RandomizerBagItem.INV_SIZE);
|
||||
IItemHandler itemHandler;
|
||||
|
||||
public ItemHandlerCapabilityProvider(int size) {
|
||||
itemHandler = new ItemStackHandler(size);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
|
||||
@@ -9,7 +9,7 @@ import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import nl.requios.effortlessbuilding.EffortlessBuilding;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
|
||||
|
||||
public class CompatHelper {
|
||||
//TODO 1.13 compatibility
|
||||
@@ -40,7 +40,7 @@ public class CompatHelper {
|
||||
Item item = stack.getItem();
|
||||
if (item instanceof BlockItem)
|
||||
return true;
|
||||
return item instanceof RandomizerBagItem;
|
||||
return item instanceof AbstractRandomizerBagItem;
|
||||
//TODO 1.13 compatibility
|
||||
// if (item == dankNullItem)
|
||||
// return true;
|
||||
@@ -55,11 +55,11 @@ public class CompatHelper {
|
||||
return proxy;
|
||||
|
||||
//Randomizer Bag
|
||||
if (proxyItem instanceof RandomizerBagItem) {
|
||||
if (proxyItem instanceof AbstractRandomizerBagItem) {
|
||||
ItemStack itemStack = proxy;
|
||||
while (!(itemStack.getItem() instanceof BlockItem || itemStack.isEmpty())) {
|
||||
if (itemStack.getItem() instanceof RandomizerBagItem)
|
||||
itemStack = RandomizerBagItem.pickRandomStack(RandomizerBagItem.getBagInventory(itemStack));
|
||||
if (itemStack.getItem() instanceof AbstractRandomizerBagItem randomizerBagItem)
|
||||
itemStack = randomizerBagItem.pickRandomStack(randomizerBagItem.getBagInventory(itemStack));
|
||||
}
|
||||
return itemStack;
|
||||
}
|
||||
@@ -82,9 +82,9 @@ public class CompatHelper {
|
||||
Item blockItem = Item.byBlock(state.getBlock());
|
||||
if (stack.getItem() instanceof BlockItem)
|
||||
return stack;
|
||||
else if (stack.getItem() instanceof RandomizerBagItem) {
|
||||
IItemHandler bagInventory = RandomizerBagItem.getBagInventory(stack);
|
||||
return RandomizerBagItem.findStack(bagInventory, blockItem);
|
||||
else if (stack.getItem() instanceof AbstractRandomizerBagItem randomizerBagItem) {
|
||||
IItemHandler bagInventory = randomizerBagItem.getBagInventory(stack);
|
||||
return randomizerBagItem.findStack(bagInventory, blockItem);
|
||||
}
|
||||
//TODO 1.13 compatibility
|
||||
// else if (stack.getItem() == dankNullItem) {
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
package nl.requios.effortlessbuilding.gui;
|
||||
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.inventory.ClickType;
|
||||
import net.minecraft.world.inventory.MenuType;
|
||||
import net.minecraft.world.inventory.Slot;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
import net.minecraftforge.items.SlotItemHandler;
|
||||
import nl.requios.effortlessbuilding.EffortlessBuilding;
|
||||
import nl.requios.effortlessbuilding.item.DiamondRandomizerBagItem;
|
||||
|
||||
public class DiamondRandomizerBagContainer extends AbstractContainerMenu {
|
||||
|
||||
private static final int INV_START = DiamondRandomizerBagItem.INV_SIZE,
|
||||
INV_END = INV_START + 26,
|
||||
HOTBAR_START = INV_END + 1,
|
||||
HOTBAR_END = HOTBAR_START + 8;
|
||||
private final IItemHandler bagInventory;
|
||||
|
||||
public DiamondRandomizerBagContainer(MenuType<?> type, int id){
|
||||
super(type, id);
|
||||
bagInventory = null;
|
||||
}
|
||||
|
||||
//Client
|
||||
public DiamondRandomizerBagContainer(int id, Inventory playerInventory, FriendlyByteBuf packetBuffer) {
|
||||
this(id, playerInventory);
|
||||
}
|
||||
|
||||
//Server?
|
||||
public DiamondRandomizerBagContainer(int containerId, Inventory playerInventory) {
|
||||
this(containerId, playerInventory, new ItemStackHandler(DiamondRandomizerBagItem.INV_SIZE));
|
||||
}
|
||||
|
||||
public DiamondRandomizerBagContainer(int containerId, Inventory playerInventory, IItemHandler inventory) {
|
||||
super(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), containerId);
|
||||
bagInventory = inventory;
|
||||
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < 9; ++j) {
|
||||
this.addSlot(new SlotItemHandler(bagInventory, j + i * 9, 8 + j * 18, 18 + i * 18));
|
||||
}
|
||||
}
|
||||
|
||||
// add player inventory slots
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < 9; ++j) {
|
||||
addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
|
||||
}
|
||||
}
|
||||
|
||||
// add hotbar slots
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
addSlot(new Slot(playerInventory, i, 8 + i * 18, 142));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean stillValid(Player playerIn) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Slot getSlot(int parSlotIndex) {
|
||||
if (parSlotIndex >= slots.size())
|
||||
parSlotIndex = slots.size() - 1;
|
||||
return super.getSlot(parSlotIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack quickMoveStack(Player playerIn, int slotIndex) {
|
||||
ItemStack itemstack = ItemStack.EMPTY;
|
||||
Slot slot = this.slots.get(slotIndex);
|
||||
|
||||
if (slot != null && slot.hasItem()) {
|
||||
ItemStack itemstack1 = slot.getItem();
|
||||
itemstack = itemstack1.copy();
|
||||
|
||||
// If item is in our custom inventory
|
||||
if (slotIndex < INV_START) {
|
||||
// try to place in player inventory / action bar
|
||||
if (!this.moveItemStackTo(itemstack1, INV_START, HOTBAR_END + 1, true)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
slot.onQuickCraft(itemstack1, itemstack);
|
||||
}
|
||||
// Item is in inventory / hotbar, try to place in custom inventory or armor slots
|
||||
else {
|
||||
/**
|
||||
* Implementation number 1: Shift-click into your custom inventory
|
||||
*/
|
||||
if (slotIndex >= INV_START) {
|
||||
// place in custom inventory
|
||||
if (!this.moveItemStackTo(itemstack1, 0, INV_START, false)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (itemstack1.getCount() == 0) {
|
||||
slot.set(ItemStack.EMPTY);
|
||||
} else {
|
||||
slot.setChanged();
|
||||
}
|
||||
|
||||
if (itemstack1.getCount() == itemstack.getCount()) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
slot.onTake(playerIn, itemstack1);
|
||||
}
|
||||
|
||||
return itemstack;
|
||||
}
|
||||
|
||||
/**
|
||||
* You should override this method to prevent the player from moving the stack that
|
||||
* opened the inventory, otherwise if the player moves it, the inventory will not
|
||||
* be able to save properly
|
||||
*/
|
||||
@Override
|
||||
public void clicked(int slot, int dragType, ClickType clickTypeIn, Player player) {
|
||||
// this will prevent the player from interacting with the item that opened the inventory:
|
||||
if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) {
|
||||
//Do nothing;
|
||||
return;
|
||||
}
|
||||
super.clicked(slot, dragType, clickTypeIn, player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for when the crafting gui is closed.
|
||||
*/
|
||||
@Override
|
||||
public void removed(Player player) {
|
||||
super.removed(player);
|
||||
if (!player.level.isClientSide) {
|
||||
broadcastChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package nl.requios.effortlessbuilding.gui;
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import nl.requios.effortlessbuilding.EffortlessBuilding;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@ParametersAreNonnullByDefault
|
||||
public class DiamondRandomizerBagScreen extends AbstractContainerScreen<DiamondRandomizerBagContainer> {
|
||||
private Inventory inventory;
|
||||
|
||||
private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/diamondrandomizerbag.png");
|
||||
|
||||
public DiamondRandomizerBagScreen(DiamondRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) {
|
||||
super(randomizerBagContainer, playerInventory, title);
|
||||
this.inventory = playerInventory;
|
||||
imageHeight = 167;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
|
||||
renderBackground(ms);
|
||||
super.render(ms, mouseX, mouseY, partialTicks);
|
||||
this.renderTooltip(ms, mouseX, mouseY);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderLabels(PoseStack ms, int mouseX, int mouseY) {
|
||||
this.font.draw(ms, this.title, 8, 6, 0x404040);
|
||||
this.font.draw(ms, this.playerInventoryTitle, 8, imageHeight - 96 + 2, 0x404040);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1f);
|
||||
RenderSystem.setShaderTexture(0, guiTextures);
|
||||
int marginHorizontal = (width - imageWidth) / 2;
|
||||
int marginVertical = (height - imageHeight) / 2;
|
||||
blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
package nl.requios.effortlessbuilding.gui;
|
||||
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.inventory.ClickType;
|
||||
import net.minecraft.world.inventory.MenuType;
|
||||
import net.minecraft.world.inventory.Slot;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
import net.minecraftforge.items.SlotItemHandler;
|
||||
import nl.requios.effortlessbuilding.EffortlessBuilding;
|
||||
import nl.requios.effortlessbuilding.item.GoldenRandomizerBagItem;
|
||||
|
||||
public class GoldenRandomizerBagContainer extends AbstractContainerMenu {
|
||||
|
||||
private static final int INV_START = GoldenRandomizerBagItem.INV_SIZE,
|
||||
INV_END = INV_START + 26,
|
||||
HOTBAR_START = INV_END + 1,
|
||||
HOTBAR_END = HOTBAR_START + 8;
|
||||
private final IItemHandler bagInventory;
|
||||
|
||||
public GoldenRandomizerBagContainer(MenuType<?> type, int id){
|
||||
super(type, id);
|
||||
bagInventory = null;
|
||||
}
|
||||
|
||||
//Client
|
||||
public GoldenRandomizerBagContainer(int id, Inventory playerInventory, FriendlyByteBuf packetBuffer) {
|
||||
this(id, playerInventory);
|
||||
}
|
||||
|
||||
//Server?
|
||||
public GoldenRandomizerBagContainer(int containerId, Inventory playerInventory) {
|
||||
this(containerId, playerInventory, new ItemStackHandler(GoldenRandomizerBagItem.INV_SIZE));
|
||||
}
|
||||
|
||||
public GoldenRandomizerBagContainer(int containerId, Inventory playerInventory, IItemHandler inventory) {
|
||||
super(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), containerId);
|
||||
bagInventory = inventory;
|
||||
|
||||
for (int i = 0; i < GoldenRandomizerBagItem.INV_SIZE; ++i) {
|
||||
this.addSlot(new SlotItemHandler(bagInventory, i, 8 + (18 * i), 20));
|
||||
}
|
||||
|
||||
// add player inventory slots
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < 9; ++j) {
|
||||
addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 51 + i * 18));
|
||||
}
|
||||
}
|
||||
|
||||
// add hotbar slots
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
addSlot(new Slot(playerInventory, i, 8 + i * 18, 109));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean stillValid(Player playerIn) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Slot getSlot(int parSlotIndex) {
|
||||
if (parSlotIndex >= slots.size())
|
||||
parSlotIndex = slots.size() - 1;
|
||||
return super.getSlot(parSlotIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack quickMoveStack(Player playerIn, int slotIndex) {
|
||||
ItemStack itemstack = ItemStack.EMPTY;
|
||||
Slot slot = this.slots.get(slotIndex);
|
||||
|
||||
if (slot != null && slot.hasItem()) {
|
||||
ItemStack itemstack1 = slot.getItem();
|
||||
itemstack = itemstack1.copy();
|
||||
|
||||
// If item is in our custom inventory
|
||||
if (slotIndex < INV_START) {
|
||||
// try to place in player inventory / action bar
|
||||
if (!this.moveItemStackTo(itemstack1, INV_START, HOTBAR_END + 1, true)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
slot.onQuickCraft(itemstack1, itemstack);
|
||||
}
|
||||
// Item is in inventory / hotbar, try to place in custom inventory or armor slots
|
||||
else {
|
||||
/**
|
||||
* Implementation number 1: Shift-click into your custom inventory
|
||||
*/
|
||||
if (slotIndex >= INV_START) {
|
||||
// place in custom inventory
|
||||
if (!this.moveItemStackTo(itemstack1, 0, INV_START, false)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (itemstack1.getCount() == 0) {
|
||||
slot.set(ItemStack.EMPTY);
|
||||
} else {
|
||||
slot.setChanged();
|
||||
}
|
||||
|
||||
if (itemstack1.getCount() == itemstack.getCount()) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
slot.onTake(playerIn, itemstack1);
|
||||
}
|
||||
|
||||
return itemstack;
|
||||
}
|
||||
|
||||
/**
|
||||
* You should override this method to prevent the player from moving the stack that
|
||||
* opened the inventory, otherwise if the player moves it, the inventory will not
|
||||
* be able to save properly
|
||||
*/
|
||||
@Override
|
||||
public void clicked(int slot, int dragType, ClickType clickTypeIn, Player player) {
|
||||
// this will prevent the player from interacting with the item that opened the inventory:
|
||||
if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) {
|
||||
//Do nothing;
|
||||
return;
|
||||
}
|
||||
super.clicked(slot, dragType, clickTypeIn, player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for when the crafting gui is closed.
|
||||
*/
|
||||
@Override
|
||||
public void removed(Player player) {
|
||||
super.removed(player);
|
||||
if (!player.level.isClientSide) {
|
||||
broadcastChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package nl.requios.effortlessbuilding.gui;
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import nl.requios.effortlessbuilding.EffortlessBuilding;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@ParametersAreNonnullByDefault
|
||||
public class GoldenRandomizerBagScreen extends AbstractContainerScreen<GoldenRandomizerBagContainer> {
|
||||
private Inventory inventory;
|
||||
|
||||
private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/goldenrandomizerbag.png");
|
||||
|
||||
public GoldenRandomizerBagScreen(GoldenRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) {
|
||||
super(randomizerBagContainer, playerInventory, title);
|
||||
this.inventory = playerInventory;
|
||||
imageHeight = 134;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
|
||||
renderBackground(ms);
|
||||
super.render(ms, mouseX, mouseY, partialTicks);
|
||||
this.renderTooltip(ms, mouseX, mouseY);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderLabels(PoseStack ms, int mouseX, int mouseY) {
|
||||
this.font.draw(ms, this.title, 8, 6, 0x404040);
|
||||
this.font.draw(ms, this.playerInventoryTitle, 8, imageHeight - 96 + 2, 0x404040);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1f);
|
||||
RenderSystem.setShaderTexture(0, guiTextures);
|
||||
int marginHorizontal = (width - imageWidth) / 2;
|
||||
int marginVertical = (height - imageHeight) / 2;
|
||||
blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight);
|
||||
}
|
||||
}
|
||||
@@ -17,8 +17,10 @@ import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
|
||||
public class RandomizerBagContainer extends AbstractContainerMenu {
|
||||
|
||||
private static final int INV_START = RandomizerBagItem.INV_SIZE, INV_END = INV_START + 26,
|
||||
HOTBAR_START = INV_END + 1, HOTBAR_END = HOTBAR_START + 8;
|
||||
private static final int INV_START = RandomizerBagItem.INV_SIZE,
|
||||
INV_END = INV_START + 26,
|
||||
HOTBAR_START = INV_END + 1,
|
||||
HOTBAR_END = HOTBAR_START + 8;
|
||||
private final IItemHandler bagInventory;
|
||||
|
||||
public RandomizerBagContainer(MenuType<?> type, int id){
|
||||
@@ -45,15 +47,14 @@ public class RandomizerBagContainer extends AbstractContainerMenu {
|
||||
}
|
||||
|
||||
// add player inventory slots
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < 9; ++j) {
|
||||
addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 51 + i * 18));
|
||||
}
|
||||
}
|
||||
|
||||
// add hotbar slots
|
||||
for (i = 0; i < 9; ++i) {
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
addSlot(new Slot(playerInventory, i, 8 + i * 18, 109));
|
||||
}
|
||||
}
|
||||
@@ -99,7 +100,6 @@ public class RandomizerBagContainer extends AbstractContainerMenu {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (itemstack1.getCount() == 0) {
|
||||
@@ -128,6 +128,7 @@ public class RandomizerBagContainer extends AbstractContainerMenu {
|
||||
// this will prevent the player from interacting with the item that opened the inventory:
|
||||
if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) {
|
||||
//Do nothing;
|
||||
return;
|
||||
}
|
||||
super.clicked(slot, dragType, clickTypeIn, player);
|
||||
}
|
||||
|
||||
@@ -17,11 +17,10 @@ import javax.annotation.ParametersAreNonnullByDefault;
|
||||
public class RandomizerBagScreen extends AbstractContainerScreen<RandomizerBagContainer> {
|
||||
private Inventory inventory;
|
||||
|
||||
private static final ResourceLocation guiTextures =
|
||||
new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/randomizerbag.png");
|
||||
private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/randomizerbag.png");
|
||||
|
||||
public RandomizerBagScreen(RandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) {
|
||||
super(randomizerBagContainer, playerInventory, title);//new TranslationTextComponent("effortlessbuilding.screen.randomizer_bag"));
|
||||
super(randomizerBagContainer, playerInventory, title);
|
||||
this.inventory = playerInventory;
|
||||
imageHeight = 134;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
package nl.requios.effortlessbuilding.item;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.item.TooltipFlag;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.level.material.Fluids;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.MenuProvider;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.InteractionResultHolder;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TextComponent;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.fmllegacy.network.NetworkHooks;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import nl.requios.effortlessbuilding.buildmode.BuildModes;
|
||||
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
|
||||
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
|
||||
import nl.requios.effortlessbuilding.capability.ItemHandlerCapabilityProvider;
|
||||
import nl.requios.effortlessbuilding.gui.RandomizerBagContainer;
|
||||
import nl.requios.effortlessbuilding.helper.SurvivalHelper;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.world.item.CreativeModeTab;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.BlockPlaceContext;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
public abstract class AbstractRandomizerBagItem extends Item {
|
||||
|
||||
private static long currentSeed = 1337;
|
||||
private static final Random rand = new Random(currentSeed);
|
||||
|
||||
public AbstractRandomizerBagItem() {
|
||||
super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1));
|
||||
}
|
||||
|
||||
public abstract int getInventorySize();
|
||||
|
||||
public abstract MenuProvider getContainerProvider(ItemStack item);
|
||||
|
||||
/**
|
||||
* Get the inventory of a randomizer bag by checking the capability.
|
||||
*/
|
||||
public IItemHandler getBagInventory(ItemStack bag) {
|
||||
return bag.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pick a random slot from the bag. Empty slots will never get chosen.
|
||||
*/
|
||||
public ItemStack pickRandomStack(IItemHandler bagInventory) {
|
||||
//Find how many stacks are non-empty, and save them in a list
|
||||
int nonempty = 0;
|
||||
List<ItemStack> nonEmptyStacks = new ArrayList<>();
|
||||
List<Integer> originalSlots = new ArrayList<>(getInventorySize());
|
||||
for (int i = 0; i < bagInventory.getSlots(); i++) {
|
||||
ItemStack stack = bagInventory.getStackInSlot(i);
|
||||
if (!stack.isEmpty()) {
|
||||
nonempty++;
|
||||
nonEmptyStacks.add(stack);
|
||||
originalSlots.add(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (nonEmptyStacks.size() != originalSlots.size())
|
||||
throw new Error("NonEmptyStacks and OriginalSlots not same size");
|
||||
|
||||
if (nonempty == 0) return ItemStack.EMPTY;
|
||||
|
||||
//Pick random slot
|
||||
int randomSlot = rand.nextInt(nonempty);
|
||||
if (randomSlot < 0 || randomSlot > bagInventory.getSlots()) return ItemStack.EMPTY;
|
||||
|
||||
int originalSlot = originalSlots.get(randomSlot);
|
||||
if (originalSlot < 0 || originalSlot > bagInventory.getSlots()) return ItemStack.EMPTY;
|
||||
|
||||
return bagInventory.getStackInSlot(originalSlot);
|
||||
}
|
||||
|
||||
public ItemStack findStack(IItemHandler bagInventory, Item item) {
|
||||
for (int i = 0; i < bagInventory.getSlots(); i++) {
|
||||
ItemStack stack = bagInventory.getStackInSlot(i);
|
||||
if (!stack.isEmpty() && stack.getItem() == item) {
|
||||
return stack;
|
||||
}
|
||||
}
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
public static void resetRandomness() {
|
||||
rand.setSeed(currentSeed);
|
||||
}
|
||||
|
||||
public static void renewRandomness() {
|
||||
currentSeed = Calendar.getInstance().getTimeInMillis();
|
||||
rand.setSeed(currentSeed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult useOn(UseOnContext ctx) {
|
||||
Player player = ctx.getPlayer();
|
||||
Level world = ctx.getLevel();
|
||||
BlockPos pos = ctx.getClickedPos();
|
||||
Direction facing = ctx.getClickedFace();
|
||||
ItemStack item = ctx.getItemInHand();
|
||||
Vec3 hitVec = ctx.getClickLocation();
|
||||
|
||||
if (player == null) return InteractionResult.FAIL;
|
||||
|
||||
if (ctx.getPlayer() != null && ctx.getPlayer().isShiftKeyDown()) { //ctx.isPlacerSneaking()
|
||||
if (world.isClientSide) return InteractionResult.SUCCESS;
|
||||
//Open inventory
|
||||
NetworkHooks.openGui((ServerPlayer) player, getContainerProvider(item));
|
||||
} else {
|
||||
if (world.isClientSide) return InteractionResult.SUCCESS;
|
||||
|
||||
//Only place manually if in normal vanilla mode
|
||||
BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode();
|
||||
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
|
||||
if (buildMode != BuildModes.BuildModeEnum.NORMAL || modifierSettings.doQuickReplace()) {
|
||||
return InteractionResult.FAIL;
|
||||
}
|
||||
|
||||
//Use item
|
||||
//Get bag inventory
|
||||
//TODO offhand support
|
||||
ItemStack bag = player.getItemInHand(InteractionHand.MAIN_HAND);
|
||||
IItemHandler bagInventory = getBagInventory(bag);
|
||||
if (bagInventory == null)
|
||||
return InteractionResult.FAIL;
|
||||
|
||||
ItemStack toPlace = pickRandomStack(bagInventory);
|
||||
if (toPlace.isEmpty()) return InteractionResult.FAIL;
|
||||
|
||||
//Previously: use onItemUse to place block (no synergy)
|
||||
//bag.setItemDamage(toPlace.getMetadata());
|
||||
//toPlace.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ);
|
||||
|
||||
//TODO replaceable
|
||||
if (!world.getBlockState(pos).getBlock().canBeReplaced(world.getBlockState(pos), Fluids.EMPTY)) {
|
||||
pos = pos.relative(facing);
|
||||
}
|
||||
|
||||
BlockPlaceContext blockItemUseContext = new BlockPlaceContext(new UseOnContext(player, InteractionHand.MAIN_HAND, new BlockHitResult(hitVec, facing, pos, false)));
|
||||
BlockState blockState = Block.byItem(toPlace.getItem()).getStateForPlacement(blockItemUseContext);
|
||||
|
||||
SurvivalHelper.placeBlock(world, player, pos, blockState, toPlace, facing, hitVec, false, false, true);
|
||||
|
||||
//Synergy
|
||||
//Works without calling
|
||||
// BlockSnapshot blockSnapshot = new BlockSnapshot(player.world, pos, blockState);
|
||||
// BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, blockState, player, hand);
|
||||
// Mirror.onBlockPlaced(placeEvent);
|
||||
// Array.onBlockPlaced(placeEvent);
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) {
|
||||
ItemStack bag = player.getItemInHand(hand);
|
||||
|
||||
if (player.isShiftKeyDown()) {
|
||||
if (world.isClientSide) return new InteractionResultHolder<>(InteractionResult.SUCCESS, bag);
|
||||
//Open inventory
|
||||
NetworkHooks.openGui((ServerPlayer) player, getContainerProvider(bag));
|
||||
} else {
|
||||
//Use item
|
||||
//Get bag inventory
|
||||
IItemHandler bagInventory = getBagInventory(bag);
|
||||
if (bagInventory == null)
|
||||
return new InteractionResultHolder<>(InteractionResult.FAIL, bag);
|
||||
|
||||
ItemStack toUse = pickRandomStack(bagInventory);
|
||||
if (toUse.isEmpty()) return new InteractionResultHolder<>(InteractionResult.FAIL, bag);
|
||||
|
||||
return toUse.use(world, player, hand);
|
||||
}
|
||||
return new InteractionResultHolder<>(InteractionResult.PASS, bag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUseDuration(ItemStack p_77626_1_) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) {
|
||||
return new ItemHandlerCapabilityProvider(getInventorySize());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendHoverText(ItemStack stack, @Nullable Level world, List<Component> tooltip, TooltipFlag flag) {
|
||||
tooltip.add(new TextComponent(ChatFormatting.BLUE + "Rightclick" + ChatFormatting.GRAY + " to place a random block"));
|
||||
tooltip.add(new TextComponent(ChatFormatting.BLUE + "Sneak + rightclick" + ChatFormatting.GRAY + " to open inventory"));
|
||||
if (world != null && world.players().size() > 1) {
|
||||
tooltip.add(new TextComponent(ChatFormatting.YELLOW + "Experimental on servers: may lose inventory"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescriptionId() {
|
||||
return this.getRegistryName().toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package nl.requios.effortlessbuilding.item;
|
||||
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.world.MenuProvider;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagContainer;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class DiamondRandomizerBagItem extends AbstractRandomizerBagItem{
|
||||
public static final int INV_SIZE = 27;
|
||||
|
||||
@Override
|
||||
public int getInventorySize() {
|
||||
return 27;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MenuProvider getContainerProvider(ItemStack bag) {
|
||||
return new ContainerProvider(bag);
|
||||
}
|
||||
|
||||
public static class ContainerProvider implements MenuProvider {
|
||||
|
||||
private final ItemStack bag;
|
||||
|
||||
public ContainerProvider(ItemStack bag) {
|
||||
this.bag = bag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getDisplayName() {
|
||||
return new TranslatableComponent("effortlessbuilding:diamond_randomizer_bag");
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) {
|
||||
return new DiamondRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package nl.requios.effortlessbuilding.item;
|
||||
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.world.MenuProvider;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagContainer;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class GoldenRandomizerBagItem extends AbstractRandomizerBagItem{
|
||||
public static final int INV_SIZE = 9;
|
||||
|
||||
@Override
|
||||
public int getInventorySize() {
|
||||
return 9;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MenuProvider getContainerProvider(ItemStack bag) {
|
||||
return new ContainerProvider(bag);
|
||||
}
|
||||
|
||||
public static class ContainerProvider implements MenuProvider {
|
||||
|
||||
private final ItemStack bag;
|
||||
|
||||
public ContainerProvider(ItemStack bag) {
|
||||
this.bag = bag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getDisplayName() {
|
||||
return new TranslatableComponent("effortlessbuilding:golden_randomizer_bag");
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) {
|
||||
return new GoldenRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,235 +1,27 @@
|
||||
package nl.requios.effortlessbuilding.item;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.item.TooltipFlag;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.level.material.Fluids;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.MenuProvider;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.InteractionResultHolder;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TextComponent;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.fmllegacy.network.NetworkHooks;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import nl.requios.effortlessbuilding.EffortlessBuilding;
|
||||
import nl.requios.effortlessbuilding.buildmode.BuildModes;
|
||||
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
|
||||
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
|
||||
import nl.requios.effortlessbuilding.capability.ItemHandlerCapabilityProvider;
|
||||
import net.minecraft.world.MenuProvider;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import nl.requios.effortlessbuilding.gui.RandomizerBagContainer;
|
||||
import nl.requios.effortlessbuilding.helper.SurvivalHelper;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.world.item.CreativeModeTab;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.BlockPlaceContext;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
public class RandomizerBagItem extends Item {
|
||||
public class RandomizerBagItem extends AbstractRandomizerBagItem {
|
||||
public static final int INV_SIZE = 5;
|
||||
|
||||
private static long currentSeed = 1337;
|
||||
private static final Random rand = new Random(currentSeed);
|
||||
|
||||
public RandomizerBagItem() {
|
||||
super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the inventory of a randomizer bag by checking the capability.
|
||||
*
|
||||
* @param bag
|
||||
* @return
|
||||
*/
|
||||
public static IItemHandler getBagInventory(ItemStack bag) {
|
||||
return bag.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pick a random slot from the bag. Empty slots will never get chosen.
|
||||
*
|
||||
* @param bagInventory
|
||||
* @return
|
||||
*/
|
||||
public static ItemStack pickRandomStack(IItemHandler bagInventory) {
|
||||
//Find how many stacks are non-empty, and save them in a list
|
||||
int nonempty = 0;
|
||||
List<ItemStack> nonEmptyStacks = new ArrayList<>(INV_SIZE);
|
||||
List<Integer> originalSlots = new ArrayList<>(INV_SIZE);
|
||||
for (int i = 0; i < bagInventory.getSlots(); i++) {
|
||||
ItemStack stack = bagInventory.getStackInSlot(i);
|
||||
if (!stack.isEmpty()) {
|
||||
nonempty++;
|
||||
nonEmptyStacks.add(stack);
|
||||
originalSlots.add(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (nonEmptyStacks.size() != originalSlots.size())
|
||||
throw new Error("NonEmptyStacks and OriginalSlots not same size");
|
||||
|
||||
if (nonempty == 0) return ItemStack.EMPTY;
|
||||
|
||||
//Pick random slot
|
||||
int randomSlot = rand.nextInt(nonempty);
|
||||
if (randomSlot < 0 || randomSlot > bagInventory.getSlots()) return ItemStack.EMPTY;
|
||||
|
||||
int originalSlot = originalSlots.get(randomSlot);
|
||||
if (originalSlot < 0 || originalSlot > bagInventory.getSlots()) return ItemStack.EMPTY;
|
||||
|
||||
return bagInventory.getStackInSlot(originalSlot);
|
||||
}
|
||||
|
||||
public static ItemStack findStack(IItemHandler bagInventory, Item item) {
|
||||
for (int i = 0; i < bagInventory.getSlots(); i++) {
|
||||
ItemStack stack = bagInventory.getStackInSlot(i);
|
||||
if (!stack.isEmpty() && stack.getItem() == item) {
|
||||
return stack;
|
||||
}
|
||||
}
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
public static void resetRandomness() {
|
||||
rand.setSeed(currentSeed);
|
||||
}
|
||||
|
||||
public static void renewRandomness() {
|
||||
currentSeed = Calendar.getInstance().getTimeInMillis();
|
||||
rand.setSeed(currentSeed);
|
||||
@Override
|
||||
public int getInventorySize() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult useOn(UseOnContext ctx) {
|
||||
Player player = ctx.getPlayer();
|
||||
Level world = ctx.getLevel();
|
||||
BlockPos pos = ctx.getClickedPos();
|
||||
Direction facing = ctx.getClickedFace();
|
||||
ItemStack item = ctx.getItemInHand();
|
||||
Vec3 hitVec = ctx.getClickLocation();
|
||||
|
||||
if (player == null) return InteractionResult.FAIL;
|
||||
|
||||
if (ctx.getPlayer() != null && ctx.getPlayer().isShiftKeyDown()) { //ctx.isPlacerSneaking()
|
||||
if (world.isClientSide) return InteractionResult.SUCCESS;
|
||||
//Open inventory
|
||||
NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(item));
|
||||
} else {
|
||||
if (world.isClientSide) return InteractionResult.SUCCESS;
|
||||
|
||||
//Only place manually if in normal vanilla mode
|
||||
BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode();
|
||||
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
|
||||
if (buildMode != BuildModes.BuildModeEnum.NORMAL || modifierSettings.doQuickReplace()) {
|
||||
return InteractionResult.FAIL;
|
||||
}
|
||||
|
||||
//Use item
|
||||
//Get bag inventory
|
||||
//TODO offhand support
|
||||
ItemStack bag = player.getItemInHand(InteractionHand.MAIN_HAND);
|
||||
IItemHandler bagInventory = getBagInventory(bag);
|
||||
if (bagInventory == null)
|
||||
return InteractionResult.FAIL;
|
||||
|
||||
ItemStack toPlace = pickRandomStack(bagInventory);
|
||||
if (toPlace.isEmpty()) return InteractionResult.FAIL;
|
||||
|
||||
//Previously: use onItemUse to place block (no synergy)
|
||||
//bag.setItemDamage(toPlace.getMetadata());
|
||||
//toPlace.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ);
|
||||
|
||||
//TODO replaceable
|
||||
if (!world.getBlockState(pos).getBlock().canBeReplaced(world.getBlockState(pos), Fluids.EMPTY)) {
|
||||
pos = pos.relative(facing);
|
||||
}
|
||||
|
||||
BlockPlaceContext blockItemUseContext = new BlockPlaceContext(new UseOnContext(player, InteractionHand.MAIN_HAND, new BlockHitResult(hitVec, facing, pos, false)));
|
||||
BlockState blockState = Block.byItem(toPlace.getItem()).getStateForPlacement(blockItemUseContext);
|
||||
|
||||
SurvivalHelper.placeBlock(world, player, pos, blockState, toPlace, facing, hitVec, false, false, true);
|
||||
|
||||
//Synergy
|
||||
//Works without calling
|
||||
// BlockSnapshot blockSnapshot = new BlockSnapshot(player.world, pos, blockState);
|
||||
// BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, blockState, player, hand);
|
||||
// Mirror.onBlockPlaced(placeEvent);
|
||||
// Array.onBlockPlaced(placeEvent);
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) {
|
||||
ItemStack bag = player.getItemInHand(hand);
|
||||
|
||||
if (player.isShiftKeyDown()) {
|
||||
if (world.isClientSide) return new InteractionResultHolder<>(InteractionResult.SUCCESS, bag);
|
||||
//Open inventory
|
||||
NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(bag));
|
||||
} else {
|
||||
//Use item
|
||||
//Get bag inventory
|
||||
IItemHandler bagInventory = getBagInventory(bag);
|
||||
if (bagInventory == null)
|
||||
return new InteractionResultHolder<>(InteractionResult.FAIL, bag);
|
||||
|
||||
ItemStack toUse = pickRandomStack(bagInventory);
|
||||
if (toUse.isEmpty()) return new InteractionResultHolder<>(InteractionResult.FAIL, bag);
|
||||
|
||||
return toUse.use(world, player, hand);
|
||||
}
|
||||
return new InteractionResultHolder<>(InteractionResult.PASS, bag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUseDuration(ItemStack p_77626_1_) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) {
|
||||
return new ItemHandlerCapabilityProvider();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendHoverText(ItemStack stack, @Nullable Level world, List<Component> tooltip, TooltipFlag flag) {
|
||||
tooltip.add(new TextComponent(ChatFormatting.BLUE + "Rightclick" + ChatFormatting.GRAY + " to place a random block"));
|
||||
tooltip.add(new TextComponent(ChatFormatting.BLUE + "Sneak + rightclick" + ChatFormatting.GRAY + " to open inventory"));
|
||||
if (world != null && world.players().size() > 1) {
|
||||
tooltip.add(new TextComponent(ChatFormatting.YELLOW + "Experimental on servers: may lose inventory"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescriptionId() {
|
||||
return this.getRegistryName().toString();
|
||||
public MenuProvider getContainerProvider(ItemStack bag) {
|
||||
return new ContainerProvider(bag);
|
||||
}
|
||||
|
||||
public static class ContainerProvider implements MenuProvider {
|
||||
@@ -242,13 +34,13 @@ public class RandomizerBagItem extends Item {
|
||||
|
||||
@Override
|
||||
public Component getDisplayName() {
|
||||
return new TranslatableComponent("effortlessbuilding.screen.randomizer_bag");
|
||||
return new TranslatableComponent("effortlessbuilding:randomizer_bag");
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) {
|
||||
return new RandomizerBagContainer(containerId, playerInventory, RandomizerBagItem.getBagInventory(bag));
|
||||
return new RandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package nl.requios.effortlessbuilding.proxy;
|
||||
|
||||
import com.mojang.blaze3d.platform.ScreenManager;
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
import net.minecraft.client.gui.screens.MenuScreens;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
@@ -42,7 +41,8 @@ import nl.requios.effortlessbuilding.buildmode.ModeOptions;
|
||||
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
|
||||
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
|
||||
import nl.requios.effortlessbuilding.compatibility.CompatHelper;
|
||||
import nl.requios.effortlessbuilding.gui.RandomizerBagContainer;
|
||||
import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagScreen;
|
||||
import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagScreen;
|
||||
import nl.requios.effortlessbuilding.gui.RandomizerBagScreen;
|
||||
import nl.requios.effortlessbuilding.gui.buildmode.PlayerSettingsGui;
|
||||
import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu;
|
||||
@@ -359,6 +359,8 @@ public class ClientProxy implements IProxy {
|
||||
}
|
||||
|
||||
MenuScreens.register(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), RandomizerBagScreen::new);
|
||||
MenuScreens.register(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), GoldenRandomizerBagScreen::new);
|
||||
MenuScreens.register(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), DiamondRandomizerBagScreen::new);
|
||||
}
|
||||
|
||||
public Player getPlayerEntityFromContext(Supplier<NetworkEvent.Context> ctx) {
|
||||
|
||||
@@ -32,7 +32,7 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.Modif
|
||||
import nl.requios.effortlessbuilding.compatibility.CompatHelper;
|
||||
import nl.requios.effortlessbuilding.helper.ReachHelper;
|
||||
import nl.requios.effortlessbuilding.helper.SurvivalHelper;
|
||||
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
|
||||
import nl.requios.effortlessbuilding.proxy.ClientProxy;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -168,7 +168,7 @@ public class BlockPreviewRenderer {
|
||||
previousSecondPos = secondPos;
|
||||
|
||||
//if so, renew randomness of randomizer bag
|
||||
RandomizerBagItem.renewRandomness();
|
||||
AbstractRandomizerBagItem.renewRandomness();
|
||||
//and play sound (max once every tick)
|
||||
if (newCoordinates.size() > 1 && blockStates.size() > 1 && soundTime < ClientProxy.ticksInGame - 0) {
|
||||
soundTime = ClientProxy.ticksInGame;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"effortlessbuilding.screen.modifier_settings": "Modifier Settings",
|
||||
"effortlessbuilding.screen.radial_menu": "Build Modes",
|
||||
"effortlessbuilding.screen.randomizer_bag": "Randomizer Bag",
|
||||
"effortlessbuilding.screen.player_settings": "Player Settings",
|
||||
|
||||
"key.effortlessbuilding.category": "Effortless Building",
|
||||
@@ -13,7 +12,9 @@
|
||||
"key.effortlessbuilding.redo.desc": "Redo",
|
||||
"key.effortlessbuilding.altplacement.desc": "Alternative placement",
|
||||
|
||||
"effortlessbuilding:randomizer_bag": "Randomizer Bag",
|
||||
"effortlessbuilding:randomizer_bag": "Leather Randomizer Bag",
|
||||
"effortlessbuilding:golden_randomizer_bag": "Golden Randomizer Bag",
|
||||
"effortlessbuilding:diamond_randomizer_bag": "Diamond Randomizer Bag",
|
||||
"effortlessbuilding:reach_upgrade1": "Reach Upgrade 1",
|
||||
"effortlessbuilding:reach_upgrade2": "Reach Upgrade 2",
|
||||
"effortlessbuilding:reach_upgrade3": "Reach Upgrade 3",
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "effortlessbuilding:items/diamondrandomizerbag"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "effortlessbuilding:items/goldenrandomizerbag"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 920 B |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 625 B After Width: | Height: | Size: 603 B |
|
Before Width: | Height: | Size: 603 B After Width: | Height: | Size: 625 B |
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"x#x",
|
||||
"#O#",
|
||||
"x#x"
|
||||
],
|
||||
"key": {
|
||||
"O": {
|
||||
"item": "minecraft:leather"
|
||||
},
|
||||
"#": {
|
||||
"item": "minecraft:diamond"
|
||||
},
|
||||
"x": {
|
||||
"item": "minecraft:amethyst_shard"
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "effortlessbuilding:diamond_randomizer_bag"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"x#x",
|
||||
"#O#",
|
||||
"x#x"
|
||||
],
|
||||
"key": {
|
||||
"O": {
|
||||
"item": "minecraft:leather"
|
||||
},
|
||||
"#": {
|
||||
"item": "minecraft:gold_ingot"
|
||||
},
|
||||
"x": {
|
||||
"item": "minecraft:quartz"
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "effortlessbuilding:golden_randomizer_bag"
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,16 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
" S",
|
||||
"/ "
|
||||
" # ",
|
||||
"#O#",
|
||||
" # "
|
||||
],
|
||||
"key": {
|
||||
"S": {
|
||||
"item": "minecraft:string"
|
||||
"O": {
|
||||
"item": "minecraft:ender_pearl"
|
||||
},
|
||||
"/": {
|
||||
"item": "minecraft:stick"
|
||||
"#": {
|
||||
"item": "minecraft:prismarine_crystals"
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
" M",
|
||||
"/ "
|
||||
"x#x",
|
||||
"#O#",
|
||||
"x#x"
|
||||
],
|
||||
"key": {
|
||||
"M": {
|
||||
"item": "minecraft:magma_cream"
|
||||
"O": {
|
||||
"item": "minecraft:ender_pearl"
|
||||
},
|
||||
"/": {
|
||||
"item": "minecraft:bone"
|
||||
}
|
||||
"#": {
|
||||
"item": "minecraft:slime_ball"
|
||||
},
|
||||
"x": {
|
||||
"item": "minecraft:chorus_fruit"
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "effortlessbuilding:reach_upgrade2"
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
" FE",
|
||||
" /F",
|
||||
"/ "
|
||||
"x#x",
|
||||
"#O#",
|
||||
"x#x"
|
||||
],
|
||||
"key": {
|
||||
"E": {
|
||||
"item": "minecraft:ender_eye"
|
||||
"O": {
|
||||
"item": "minecraft:nether_star"
|
||||
},
|
||||
"F": {
|
||||
"item": "minecraft:feather"
|
||||
"#": {
|
||||
"item": "minecraft:diamond"
|
||||
},
|
||||
"/": {
|
||||
"item": "minecraft:blaze_rod"
|
||||
}
|
||||
"x": {
|
||||
"item": "minecraft:amethyst_shard"
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "effortlessbuilding:reach_upgrade3"
|
||||
|
||||