Rework the item scrubber

Add magical scrubber
Fix flight enchantment
Fix mob egging
Add mob egging stat to sword
This commit is contained in:
Aria 2023-02-13 00:08:29 -07:00
parent 3ae32798fe
commit da7898a0c2
96 changed files with 3805 additions and 1912 deletions

View file

@ -145,6 +145,8 @@ dependencies {
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html
api 'curse.maven:mariadb-jdbc-561883:3586357'
runtimeOnly fg.deobf("curse.maven:mekanism-268560:4385637")
}
// Example for how to get properties into the manifest for reading at runtime.

View file

@ -3,7 +3,7 @@
org.gradle.jvmargs=-Xmx8G
org.gradle.daemon=false
my_version=1.3.6.7
my_version=1.3.7.2
mc_version=1.19.2
forge_version=43.2.3

View file

@ -1,131 +1,141 @@
version:3120
autoJump:false
autoSuggestions:true
chatColors:true
chatLinks:true
chatLinksPrompt:true
enableVsync:true
entityShadows:true
forceUnicodeFont:false
discrete_mouse_scroll:false
invertYMouse:false
realmsNotifications:true
reducedDebugInfo:false
showSubtitles:true
directionalAudio:false
touchscreen:false
fullscreen:false
bobView:true
toggleCrouch:false
toggleSprint:false
darkMojangStudiosBackground:false
hideLightningFlashes:false
mouseSensitivity:0.5
fov:0.0
screenEffectScale:1.0
fovEffectScale:1.0
darknessEffectScale:1.0
gamma:1.0
renderDistance:12
simulationDistance:12
entityDistanceScaling:1.0
guiScale:3
particles:0
maxFps:120
graphicsMode:1
ao:2
prioritizeChunkUpdates:0
biomeBlendRadius:2
renderClouds:"true"
resourcePacks:[]
incompatibleResourcePacks:[]
lastServer:
lang:en_us
soundDevice:""
chatVisibility:0
chatOpacity:1.0
chatLineSpacing:0.0
textBackgroundOpacity:0.5
backgroundForChatOnly:true
hideServerAddress:false
advancedItemTooltips:true
pauseOnLostFocus:true
overrideWidth:0
overrideHeight:0
heldItemTooltips:true
chatHeightFocused:1.0
chatDelay:0.0
chatHeightUnfocused:0.4375
chatScale:1.0
chatWidth:1.0
mipmapLevels:4
useNativeTransport:true
mainHand:"right"
attackIndicator:1
narrator:0
tutorialStep:none
mouseWheelSensitivity:1.0
rawMouseInput:true
glDebugVerbosity:1
skipMultiplayerWarning:true
skipRealms32bitWarning:false
hideMatchedNames:true
joinedFirstServer:true
hideBundleTutorial:false
syncChunkWrites:true
showAutosaveIndicator:true
allowServerListing:true
chatPreview:1
onlyShowSecureChat:false
key_key.attack:key.mouse.left
key_key.use:key.mouse.right
key_key.forward:key.keyboard.w
key_key.left:key.keyboard.a
key_key.back:key.keyboard.s
key_key.right:key.keyboard.d
key_key.jump:key.keyboard.space
key_key.sneak:key.keyboard.left.shift
key_key.sprint:key.keyboard.left.control
key_key.drop:key.keyboard.q
key_key.inventory:key.keyboard.e
key_key.chat:key.keyboard.t
key_key.playerlist:key.keyboard.tab
key_key.pickItem:key.mouse.middle
key_key.command:key.keyboard.slash
key_key.socialInteractions:key.keyboard.p
key_key.screenshot:key.keyboard.f2
key_key.togglePerspective:key.keyboard.f5
key_key.smoothCamera:key.keyboard.unknown
key_key.fullscreen:key.keyboard.f11
key_key.spectatorOutlines:key.keyboard.unknown
key_key.swapOffhand:key.keyboard.f
key_key.saveToolbarActivator:key.keyboard.c
key_key.loadToolbarActivator:key.keyboard.x
key_key.advancements:key.keyboard.l
key_key.hotbar.1:key.keyboard.1
key_key.hotbar.2:key.keyboard.2
key_key.hotbar.3:key.keyboard.3
key_key.hotbar.4:key.keyboard.4
key_key.hotbar.5:key.keyboard.5
key_key.hotbar.6:key.keyboard.6
key_key.hotbar.7:key.keyboard.7
key_key.hotbar.8:key.keyboard.8
key_key.hotbar.9:key.keyboard.9
key_key.otemod.open_vault:key.keyboard.v:ALT
soundCategory_master:1.0
soundCategory_music:0.08862526
soundCategory_record:1.0
soundCategory_weather:1.0
soundCategory_block:1.0
soundCategory_hostile:1.0
soundCategory_neutral:1.0
soundCategory_player:1.0
soundCategory_ambient:1.0
soundCategory_voice:1.0
modelPart_cape:true
modelPart_jacket:true
modelPart_left_sleeve:true
modelPart_right_sleeve:true
modelPart_left_pants_leg:true
modelPart_right_pants_leg:true
modelPart_hat:true
version:3120
autoJump:false
autoSuggestions:true
chatColors:true
chatLinks:true
chatLinksPrompt:true
enableVsync:true
entityShadows:true
forceUnicodeFont:false
discrete_mouse_scroll:false
invertYMouse:false
realmsNotifications:true
reducedDebugInfo:false
showSubtitles:true
directionalAudio:false
touchscreen:false
fullscreen:false
bobView:true
toggleCrouch:false
toggleSprint:false
darkMojangStudiosBackground:false
hideLightningFlashes:false
mouseSensitivity:0.5
fov:0.0
screenEffectScale:1.0
fovEffectScale:1.0
darknessEffectScale:1.0
gamma:1.0
renderDistance:12
simulationDistance:12
entityDistanceScaling:1.0
guiScale:4
particles:0
maxFps:120
graphicsMode:1
ao:2
prioritizeChunkUpdates:0
biomeBlendRadius:2
renderClouds:"true"
resourcePacks:[]
incompatibleResourcePacks:[]
lastServer:127.0.0.1
lang:en_us
soundDevice:""
chatVisibility:0
chatOpacity:1.0
chatLineSpacing:0.0
textBackgroundOpacity:0.5
backgroundForChatOnly:true
hideServerAddress:false
advancedItemTooltips:true
pauseOnLostFocus:true
overrideWidth:0
overrideHeight:0
heldItemTooltips:true
chatHeightFocused:1.0
chatDelay:0.0
chatHeightUnfocused:0.4375
chatScale:1.0
chatWidth:1.0
mipmapLevels:4
useNativeTransport:true
mainHand:"right"
attackIndicator:1
narrator:0
tutorialStep:none
mouseWheelSensitivity:1.0
rawMouseInput:true
glDebugVerbosity:1
skipMultiplayerWarning:true
skipRealms32bitWarning:false
hideMatchedNames:true
joinedFirstServer:true
hideBundleTutorial:false
syncChunkWrites:true
showAutosaveIndicator:true
allowServerListing:true
chatPreview:1
onlyShowSecureChat:false
key_key.attack:key.mouse.left
key_key.use:key.mouse.right
key_key.forward:key.keyboard.w
key_key.left:key.keyboard.a
key_key.back:key.keyboard.s
key_key.right:key.keyboard.d
key_key.jump:key.keyboard.space
key_key.sneak:key.keyboard.left.shift
key_key.sprint:key.keyboard.left.control
key_key.drop:key.keyboard.q
key_key.inventory:key.keyboard.e
key_key.chat:key.keyboard.t
key_key.playerlist:key.keyboard.tab
key_key.pickItem:key.mouse.middle
key_key.command:key.keyboard.slash
key_key.socialInteractions:key.keyboard.p
key_key.screenshot:key.keyboard.f2
key_key.togglePerspective:key.keyboard.f5
key_key.smoothCamera:key.keyboard.unknown
key_key.fullscreen:key.keyboard.f11
key_key.spectatorOutlines:key.keyboard.unknown
key_key.swapOffhand:key.keyboard.f
key_key.saveToolbarActivator:key.keyboard.c
key_key.loadToolbarActivator:key.keyboard.x
key_key.advancements:key.keyboard.l
key_key.hotbar.1:key.keyboard.1
key_key.hotbar.2:key.keyboard.2
key_key.hotbar.3:key.keyboard.3
key_key.hotbar.4:key.keyboard.4
key_key.hotbar.5:key.keyboard.5
key_key.hotbar.6:key.keyboard.6
key_key.hotbar.7:key.keyboard.7
key_key.hotbar.8:key.keyboard.8
key_key.hotbar.9:key.keyboard.9
key_key.mekanism.mode:key.keyboard.n
key_key.mekanism.head_mode:key.keyboard.v
key_key.mekanism.chest_mode:key.keyboard.g
key_key.mekanism.legs_mode:key.keyboard.j
key_key.mekanism.feet_mode:key.keyboard.b
key_key.mekanism.details:key.keyboard.left.shift
key_key.mekanism.description:key.keyboard.n:SHIFT
key_key.mekanism.module_tweaker:key.keyboard.backslash
key_key.mekanism.key_boost:key.keyboard.left.control
key_key.mekanism.key_hud:key.keyboard.h
key_key.otemod.open_vault:key.keyboard.v:ALT
soundCategory_master:1.0
soundCategory_music:0.08862526
soundCategory_record:1.0
soundCategory_weather:1.0
soundCategory_block:1.0
soundCategory_hostile:1.0
soundCategory_neutral:1.0
soundCategory_player:1.0
soundCategory_ambient:1.0
soundCategory_voice:1.0
modelPart_cape:true
modelPart_jacket:true
modelPart_left_sleeve:true
modelPart_right_sleeve:true
modelPart_left_pants_leg:true
modelPart_right_pants_leg:true
modelPart_hat:true

View file

@ -1,57 +1,57 @@
#Minecraft server properties
#Mon Jan 16 18:19:06 MST 2023
allow-flight=false
allow-nether=true
broadcast-console-to-ops=true
broadcast-rcon-to-ops=true
difficulty=easy
enable-command-block=false
enable-jmx-monitoring=false
enable-query=false
enable-rcon=false
enable-status=true
enforce-secure-profile=true
enforce-whitelist=false
entity-broadcast-range-percentage=100
force-gamemode=false
function-permission-level=2
gamemode=survival
generate-structures=true
generator-settings={}
hardcore=false
hide-online-players=false
level-name=world
level-seed=
level-type=minecraft\:normal
max-chained-neighbor-updates=1000000
max-players=20
max-tick-time=60000
max-world-size=29999984
motd=A Minecraft Server
network-compression-threshold=256
online-mode=false
op-permission-level=4
player-idle-timeout=0
prevent-proxy-connections=false
previews-chat=false
pvp=true
query.port=25565
rate-limit=0
rcon.password=
rcon.port=25575
require-resource-pack=false
resource-pack=
resource-pack-prompt=
resource-pack-sha1=
server-ip=
server-port=25565
simulation-distance=10
spawn-animals=true
spawn-monsters=true
spawn-npcs=true
spawn-protection=16
sync-chunk-writes=true
text-filtering-config=
use-native-transport=true
view-distance=10
white-list=false
#Minecraft server properties
#Sun Feb 12 22:34:47 MST 2023
allow-flight=false
allow-nether=true
broadcast-console-to-ops=true
broadcast-rcon-to-ops=true
difficulty=easy
enable-command-block=false
enable-jmx-monitoring=false
enable-query=false
enable-rcon=false
enable-status=true
enforce-secure-profile=true
enforce-whitelist=false
entity-broadcast-range-percentage=100
force-gamemode=false
function-permission-level=2
gamemode=survival
generate-structures=true
generator-settings={}
hardcore=false
hide-online-players=false
level-name=world
level-seed=
level-type=minecraft\:normal
max-chained-neighbor-updates=1000000
max-players=20
max-tick-time=60000
max-world-size=29999984
motd=A Minecraft Server
network-compression-threshold=256
online-mode=false
op-permission-level=4
player-idle-timeout=0
prevent-proxy-connections=false
previews-chat=false
pvp=true
query.port=25565
rate-limit=0
rcon.password=
rcon.port=25575
require-resource-pack=false
resource-pack=
resource-pack-prompt=
resource-pack-sha1=
server-ip=
server-port=25565
simulation-distance=10
spawn-animals=true
spawn-monsters=true
spawn-npcs=true
spawn-protection=16
sync-chunk-writes=true
text-filtering-config=
use-native-transport=true
view-distance=10
white-list=false

View file

@ -54,7 +54,8 @@ import dev.zontreck.otemod.enchantments.ModEnchantments;
import dev.zontreck.otemod.events.EventHandler;
import dev.zontreck.otemod.events.LoreHandlers;
import dev.zontreck.otemod.implementation.inits.ModMenuTypes;
import dev.zontreck.otemod.implementation.scrubber.ScrubberScreen;
import dev.zontreck.otemod.implementation.scrubber.ItemScrubberScreen;
import dev.zontreck.otemod.implementation.scrubber.MagicalScrubberScreen;
import dev.zontreck.otemod.implementation.vault.VaultScreen;
import dev.zontreck.otemod.implementation.vault.VaultWatcher;
import dev.zontreck.otemod.items.ModItems;
@ -286,7 +287,8 @@ public class OTEMod
//LOGGER.info("MINECRAFT NAME >> {}", Minecraft.getInstance().getUser().getName());
MenuScreens.register(ModMenuTypes.VAULT.get(), VaultScreen::new);
MenuScreens.register(ModMenuTypes.SCRUBBER.get(), ScrubberScreen::new);
MenuScreens.register(ModMenuTypes.SCRUBBER.get(), ItemScrubberScreen::new);
MenuScreens.register(ModMenuTypes.MAGIC_SCRUBBER.get(), MagicalScrubberScreen::new);
//ItemBlockRenderTypes.setRenderLayer(ModBlocks.AURORA_DOOR.get(), RenderType.translucent());
}

View file

@ -4,6 +4,8 @@ import javax.annotation.Nullable;
import dev.zontreck.otemod.blocks.entity.ItemScrubberBlockEntity;
import dev.zontreck.otemod.blocks.entity.ModEntities;
import dev.zontreck.otemod.networking.ModMessages;
import dev.zontreck.otemod.networking.packets.EnergySyncS2CPacket;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
@ -62,7 +64,11 @@ public class ItemScrubberBlock extends BaseEntityBlock
BlockEntity be = lvl.getBlockEntity(pos);
if(be instanceof ItemScrubberBlockEntity)
{
NetworkHooks.openScreen(((ServerPlayer)player), (ItemScrubberBlockEntity)be, pos);
ItemScrubberBlockEntity entity = (ItemScrubberBlockEntity)be;
NetworkHooks.openScreen(((ServerPlayer)player), entity, pos);
ModMessages.sendToPlayer(new EnergySyncS2CPacket(entity.getEnergyStorage().getEnergyStored(), entity.getBlockPos()), (ServerPlayer)player);
}else{
throw new IllegalStateException("Our container is missing!");
}

View file

@ -0,0 +1,92 @@
package dev.zontreck.otemod.blocks;
import javax.annotation.Nullable;
import dev.zontreck.otemod.blocks.entity.ItemScrubberBlockEntity;
import dev.zontreck.otemod.blocks.entity.MagicalScrubberBlockEntity;
import dev.zontreck.otemod.blocks.entity.ModEntities;
import dev.zontreck.otemod.networking.ModMessages;
import dev.zontreck.otemod.networking.packets.EnergySyncS2CPacket;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BaseEntityBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraftforge.network.NetworkHooks;
public class MagicalScrubberBlock extends BaseEntityBlock
{
public MagicalScrubberBlock(Properties p_54120_) {
super(p_54120_);
}
@Override
public RenderShape getRenderShape(BlockState state)
{
return RenderShape.MODEL;
}
@Override
public void onRemove(BlockState state, Level lvl, BlockPos pos, BlockState newState, boolean isMoving)
{
if(state.getBlock()!=newState.getBlock())
{
BlockEntity bE = lvl.getBlockEntity(pos);
if(bE instanceof MagicalScrubberBlockEntity)
{
((MagicalScrubberBlockEntity)bE).doDrop();
}
}
super.onRemove(state, lvl, pos, newState, isMoving);
}
@Override
public InteractionResult use(BlockState state, Level lvl, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit)
{
if(!lvl.isClientSide())
{
BlockEntity be = lvl.getBlockEntity(pos);
if(be instanceof MagicalScrubberBlockEntity)
{
MagicalScrubberBlockEntity entity = (MagicalScrubberBlockEntity)be;
NetworkHooks.openScreen(((ServerPlayer)player), entity, pos);
ModMessages.sendToPlayer(new EnergySyncS2CPacket(entity.getEnergyStorage().getEnergyStored(), entity.getBlockPos()), (ServerPlayer)player);
}else{
throw new IllegalStateException("Our container is missing!");
}
}
return InteractionResult.sidedSuccess(lvl.isClientSide);
}
@Override
@Nullable
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new MagicalScrubberBlockEntity(pos, state);
}
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level lvl, BlockState state, BlockEntityType<T> type)
{
return createTickerHelper(type, ModEntities.MAGICAL_SCRUBBER.get(), MagicalScrubberBlockEntity::tick);
}
}

View file

@ -91,9 +91,18 @@ public class ModBlocks {
public static final RegistryObject<Item> ITEM_SCRUBBER_I = ITEMS.register("item_scrubber", ()->new BlockItem(ITEM_SCRUBBER.get(), new Item.Properties().tab(CreativeModeTab.TAB_REDSTONE)));
public static final RegistryObject<Block> MAGICAL_SCRUBBER = BLOCKS.register("magical_scrubber", ()->new MagicalScrubberBlock(BlockBehaviour.Properties.copy(ModBlocks.AURORA_BLOCK.get()).noOcclusion().isViewBlocking(ModBlocks::never)));
public static final RegistryObject<Item> MAGICAL_SCRUBBER_I = ITEMS.register("magical_scrubber", ()->new BlockItem(MAGICAL_SCRUBBER.get(), new Item.Properties().tab(CreativeModeTab.TAB_REDSTONE)));
private static boolean never(BlockState p_50806_, BlockGetter p_50807_, BlockPos p_50808_) {
return false;
}
public static final RegistryObject<Block> STABLE_SINGULARITY = BLOCKS.register("stable_singularity", ()->new Block(BlockBehaviour.Properties.copy(ModBlocks.AURORA_BLOCK.get()).noOcclusion().isViewBlocking(ModBlocks::never)));
public static final RegistryObject<Item> STABLE_SINGULARITY_I = ITEMS.register("stable_singularity", ()->new BlockItem(STABLE_SINGULARITY.get(), new Item.Properties().tab(CreativeModeTab.TAB_REDSTONE)));
private static boolean never(BlockState p_50806_, BlockGetter p_50807_, BlockPos p_50808_) {
return false;
}
}

View file

@ -3,7 +3,10 @@ package dev.zontreck.otemod.blocks.entity;
import javax.annotation.Nullable;
import dev.zontreck.otemod.implementation.OutputItemStackHandler;
import dev.zontreck.otemod.implementation.scrubber.ScrubberMenu;
import dev.zontreck.otemod.implementation.energy.OTEEnergy;
import dev.zontreck.otemod.implementation.scrubber.ItemScrubberMenu;
import dev.zontreck.otemod.networking.ModMessages;
import dev.zontreck.otemod.networking.packets.EnergySyncS2CPacket;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
@ -23,6 +26,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.IEnergyStorage;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
@ -45,6 +49,20 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
};
private ItemStackHandler outputSlot;
private final OTEEnergy ENERGY_STORAGE = new OTEEnergy(ENERGY_REQ*3, ENERGY_REQ+512) {
@Override
public void onChanged() {
setChanged();
ModMessages.sendToAll(new EnergySyncS2CPacket(energy, getBlockPos()));
}
};
private static final int ENERGY_REQ = 15000;
private LazyOptional<IEnergyStorage> lazyEnergyHandler = LazyOptional.empty();
private LazyOptional<IItemHandler> lazyItemHandler = LazyOptional.empty();
private LazyOptional<IItemHandler> lazyOutputItems = LazyOptional.empty();
@ -88,7 +106,7 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
@Override
@Nullable
public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) {
return new ScrubberMenu(id, inv, this, this.data);
return new ItemScrubberMenu(id, inv, this, this.data);
}
@Override
@ -99,6 +117,10 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side)
{
if(cap == ForgeCapabilities.ENERGY)
{
return lazyEnergyHandler.cast();
}
if(side == Direction.DOWN && cap == ForgeCapabilities.ITEM_HANDLER)
{
// Return the output slot only
@ -119,6 +141,7 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
super.onLoad();
lazyItemHandler = LazyOptional.of(()->itemsHandler);
lazyOutputItems = LazyOptional.of(()->outputSlot);
lazyEnergyHandler = LazyOptional.of(()->ENERGY_STORAGE);
}
@ -128,6 +151,7 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
super.invalidateCaps();
lazyItemHandler.invalidate();
lazyOutputItems.invalidate();
lazyEnergyHandler.invalidate();
}
@Override
@ -136,6 +160,7 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
nbt.put("inventory", itemsHandler.serializeNBT());
nbt.put("output", outputItems.serializeNBT());
nbt.putInt("prog", progress);
nbt.putInt("energy", ENERGY_STORAGE.getEnergyStored());
super.saveAdditional(nbt);
}
@ -147,6 +172,7 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
itemsHandler.deserializeNBT(nbt.getCompound("inventory"));
outputItems.deserializeNBT(nbt.getCompound("output"));
progress = nbt.getInt("prog");
ENERGY_STORAGE.setEnergy(nbt.getInt("energy"));
}
public void doDrop()
@ -167,10 +193,13 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
{
if(lvl.isClientSide())return;
if(hasRecipe(entity))
{
if(!hasEnergy(entity))return; // Halt until sufficient energy has been received
entity.progress++;
setChanged(lvl, pos, state);
drain(entity);
if(entity.progress >= ItemScrubberBlockEntity.MAXIMUM_PROCESSING_TICKS)
{
@ -184,6 +213,14 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
}
}
private static void drain(ItemScrubberBlockEntity entity) {
entity.ENERGY_STORAGE.extractEnergy(ENERGY_REQ, false);
}
private static boolean hasEnergy(ItemScrubberBlockEntity entity) {
return (entity.ENERGY_STORAGE.getEnergyStored() >= ENERGY_REQ);
}
private static void craftItem(ItemScrubberBlockEntity entity) {
if(hasRecipe(entity))
{
@ -244,4 +281,12 @@ public class ItemScrubberBlockEntity extends BlockEntity implements MenuProvider
ItemStack newItem = new ItemStack(original.getItem(),1);
return newItem;
}
public IEnergyStorage getEnergyStorage() {
return ENERGY_STORAGE;
}
public void setEnergy(int energy) {
ENERGY_STORAGE.setEnergy(energy);
}
}

View file

@ -0,0 +1,331 @@
package dev.zontreck.otemod.blocks.entity;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import dev.zontreck.otemod.implementation.OutputItemStackHandler;
import dev.zontreck.otemod.implementation.energy.OTEEnergy;
import dev.zontreck.otemod.implementation.scrubber.MagicalScrubberMenu;
import dev.zontreck.otemod.networking.ModMessages;
import dev.zontreck.otemod.networking.packets.EnergySyncS2CPacket;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.network.chat.Component;
import net.minecraft.world.Containers;
import net.minecraft.world.MenuProvider;
import net.minecraft.world.SimpleContainer;
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.ContainerData;
import net.minecraft.world.item.EnchantedBookItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.Item.Properties;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.EnchantmentInstance;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.IEnergyStorage;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
public class MagicalScrubberBlockEntity extends BlockEntity implements MenuProvider
{
protected final ItemStackHandler itemsHandler = new ItemStackHandler(1){
@Override
protected void onContentsChanged(int slot)
{
setChanged();
}
};
protected final ItemStackHandler outputItems = new ItemStackHandler(1){
@Override
protected void onContentsChanged(int slot)
{
setChanged();
}
};
private ItemStackHandler outputSlot;
private final OTEEnergy ENERGY_STORAGE = new OTEEnergy(ENERGY_REQ*3, ENERGY_REQ+512) {
@Override
public void onChanged() {
setChanged();
ModMessages.sendToAll(new EnergySyncS2CPacket(energy, getBlockPos()));
}
};
private static final int ENERGY_REQ = 10000;
private LazyOptional<IEnergyStorage> lazyEnergyHandler = LazyOptional.empty();
private LazyOptional<IItemHandler> lazyItemHandler = LazyOptional.empty();
private LazyOptional<IItemHandler> lazyOutputItems = LazyOptional.empty();
public MagicalScrubberBlockEntity(BlockPos pos, BlockState state) {
super(ModEntities.MAGICAL_SCRUBBER.get(), pos, state);
outputSlot = new OutputItemStackHandler(outputItems);
this.data = new ContainerData() {
@Override
public int get(int p_39284_) {
return switch(p_39284_){
case 0 -> MagicalScrubberBlockEntity.this.progress;
default -> 0;
};
}
@Override
public void set(int p_39285_, int p_39286_) {
switch(p_39285_)
{
case 0 -> MagicalScrubberBlockEntity.this.progress = p_39286_;
}
}
@Override
public int getCount() {
return 1;
}
};
}
protected final ContainerData data;
private int progress = 0;
public static final int MAXIMUM_PROCESSING_TICKS = 1750;
@Override
@Nullable
public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) {
return new MagicalScrubberMenu(id, inv, this, this.data);
}
@Override
public Component getDisplayName() {
return Component.translatable("block.otemod.magical_scrubber");
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side)
{
if(cap == ForgeCapabilities.ENERGY)
{
return lazyEnergyHandler.cast();
}
if(side == Direction.DOWN && cap == ForgeCapabilities.ITEM_HANDLER)
{
// Return the output slot only
return lazyOutputItems.cast();
}
if(cap == ForgeCapabilities.ITEM_HANDLER)
{
return lazyItemHandler.cast();
}
return super.getCapability(cap,side);
}
@Override
public void onLoad()
{
super.onLoad();
lazyItemHandler = LazyOptional.of(()->itemsHandler);
lazyOutputItems = LazyOptional.of(()->outputSlot);
lazyEnergyHandler = LazyOptional.of(()->ENERGY_STORAGE);
}
@Override
public void invalidateCaps()
{
super.invalidateCaps();
lazyItemHandler.invalidate();
lazyOutputItems.invalidate();
lazyEnergyHandler.invalidate();
}
@Override
protected void saveAdditional(CompoundTag nbt)
{
nbt.put("inventory", itemsHandler.serializeNBT());
nbt.put("output", outputItems.serializeNBT());
nbt.putInt("prog", progress);
nbt.putInt("energy", ENERGY_STORAGE.getEnergyStored());
super.saveAdditional(nbt);
}
@Override
public void load(CompoundTag nbt){
super.load(nbt);
itemsHandler.deserializeNBT(nbt.getCompound("inventory"));
outputItems.deserializeNBT(nbt.getCompound("output"));
progress = nbt.getInt("prog");
ENERGY_STORAGE.setEnergy(nbt.getInt("energy"));
}
public void doDrop()
{
SimpleContainer cont = new SimpleContainer(itemsHandler.getSlots());
for (int i = 0; i < itemsHandler.getSlots(); i++) {
cont.setItem(i, itemsHandler.getStackInSlot(i));
}
cont = new SimpleContainer(outputItems.getSlots());
for (int i = 0; i < outputItems.getSlots(); i++) {
cont.setItem(i, outputItems.getStackInSlot(i));
}
Containers.dropContents(this.level, this.worldPosition, cont);
}
public static void tick(Level lvl, BlockPos pos, BlockState state, MagicalScrubberBlockEntity entity)
{
if(lvl.isClientSide())return;
if(hasRecipe(entity))
{
if(!hasEnergy(entity))return; // Halt until sufficient energy has been received
entity.progress++;
setChanged(lvl, pos, state);
drain(entity);
if(entity.progress >= MagicalScrubberBlockEntity.MAXIMUM_PROCESSING_TICKS)
{
craftItem(entity);
}
}else {
if(entity.progress>0){
entity.resetProgress();
setChanged(lvl, pos, state);
}
}
}
private static void drain(MagicalScrubberBlockEntity entity) {
entity.ENERGY_STORAGE.extractEnergy(ENERGY_REQ, false);
}
private static boolean hasEnergy(MagicalScrubberBlockEntity entity) {
return (entity.ENERGY_STORAGE.getEnergyStored() >= ENERGY_REQ);
}
private static void craftItem(MagicalScrubberBlockEntity entity) {
if(hasRecipe(entity))
{
ItemStack existing = entity.outputItems.getStackInSlot(0);
ItemStack main = entity.itemsHandler.getStackInSlot(0);
Map<Enchantment, Integer> enchants = main.getAllEnchantments();
if(enchants.size()>0)
{
Iterator<Map.Entry<Enchantment,Integer>> iEntries = enchants.entrySet().iterator();
Map.Entry<Enchantment,Integer> entry = iEntries.next();
EnchantmentInstance eInst = new EnchantmentInstance(entry.getKey(), entry.getValue());
existing = EnchantedBookItem.createForEnchantment(eInst);
main.getAllEnchantments().remove(entry.getKey());
//iEntries.remove();
main = makeOutputItem(main);
while(iEntries.hasNext())
{
entry = iEntries.next();
main.enchant(entry.getKey(), entry.getValue());
}
if(main.getAllEnchantments().size()==0){
entity.itemsHandler.extractItem(0, 1, false);
}else entity.itemsHandler.setStackInSlot(0, main);
}else{
existing.setCount(existing.getCount()+1);
if(existing.is(Items.AIR))
{
existing = makeOutputItem(entity.itemsHandler.getStackInSlot(0));
}
entity.itemsHandler.extractItem(0, 1, false);
}
entity.outputItems.setStackInSlot(0, existing);
entity.resetProgress();
}
}
private static boolean hasRecipe(MagicalScrubberBlockEntity entity) {
SimpleContainer inventory = new SimpleContainer(entity.itemsHandler.getSlots());
for(int i=0;i<entity.itemsHandler.getSlots();i++)
{
inventory.setItem(i, entity.itemsHandler.getStackInSlot(i));
}
SimpleContainer output = new SimpleContainer(entity.outputItems.getSlots());
for(int i=0;i<entity.outputItems.getSlots();i++)
{
output.setItem(i, entity.outputItems.getStackInSlot(i));
}
boolean hasAnItem = !entity.itemsHandler.getStackInSlot(0).isEmpty();
ItemStack result = null;
if(hasAnItem)
{
result = makeOutputItem(entity.itemsHandler.getStackInSlot(0));
}
return hasAnItem && canInsertIntoOutput(output, result);
}
private static boolean canInsertIntoOutput(SimpleContainer inventory, ItemStack result) {
ItemStack existing = inventory.getItem(0);
boolean stackCompat = (existing.getMaxStackSize() > existing.getCount());
boolean sameType = (existing.getItem() == result.getItem());
boolean outputEmpty = existing.isEmpty();
if(outputEmpty)return true;
return (stackCompat && sameType);
}
private void resetProgress() {
progress=0;
}
protected static ItemStack makeOutputItem(ItemStack original)
{
ItemStack newItem = new ItemStack(original.getItem(),1);
return newItem;
}
public IEnergyStorage getEnergyStorage() {
return ENERGY_STORAGE;
}
public void setEnergy(int energy) {
ENERGY_STORAGE.setEnergy(energy);
}
}

View file

@ -2,8 +2,6 @@ package dev.zontreck.otemod.blocks.entity;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.blocks.ModBlocks;
import dev.zontreck.otemod.implementation.vault.VaultMenu;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
@ -16,6 +14,8 @@ public class ModEntities {
public static final RegistryObject <BlockEntityType <ItemScrubberBlockEntity>> ITEM_SCRUBBER = ENTITIES.register("item_scrubber", ()-> BlockEntityType.Builder.of(ItemScrubberBlockEntity::new, ModBlocks.ITEM_SCRUBBER.get()).build(null));
public static final RegistryObject <BlockEntityType <MagicalScrubberBlockEntity>> MAGICAL_SCRUBBER = ENTITIES.register("magical_scrubber", ()-> BlockEntityType.Builder.of(MagicalScrubberBlockEntity::new, ModBlocks.MAGICAL_SCRUBBER.get()).build(null));
public static void register(IEventBus eventBus)
{

View file

@ -14,7 +14,7 @@ public class OTEServerConfig {
public static final ForgeConfigSpec SPEC;
public static final ForgeConfigSpec.ConfigValue<List<ItemStack>> INITIAL_ITEMS_TO_GIVE_ON_FIRST_JOIN;
public static final ForgeConfigSpec.ConfigValue<Float> SPAWN_EGG_CHANCE;
public static final ForgeConfigSpec.ConfigValue<Double> SPAWN_EGG_CHANCE;
public static final ForgeConfigSpec.ConfigValue<String> HOST_ADDR;
public static final ForgeConfigSpec.ConfigValue<Integer> PORT;
@ -46,7 +46,7 @@ public class OTEServerConfig {
BUILDER.push("OTE");
INITIAL_ITEMS_TO_GIVE_ON_FIRST_JOIN = BUILDER.comment("What items, identified by modid:item, to give to a brand new user on the server").define("New Player Gear", defaults);
SPAWN_EGG_CHANCE = BUILDER.comment("What is the chance for a spawn egg to drop from a mob when looting 3 is used? Default: 0.25").define("spawn_egg_chance", 0.25F);
SPAWN_EGG_CHANCE = BUILDER.comment("What is the chance for a spawn egg to drop from a mob when looting 3 is used? Default: 0.25").define("spawn_egg_chance", 0.25);
BUILDER.pop();
BUILDER.push("DATABASE");

View file

@ -1,15 +1,22 @@
package dev.zontreck.otemod.enchantments;
import dev.zontreck.otemod.OTEMod;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerPlayerGameMode;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.player.Abilities;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.EnchantmentCategory;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.item.enchantment.SoulSpeedEnchantment;
import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.common.Mod;
public class FlightEnchantment extends Enchantment
@ -23,39 +30,52 @@ public class FlightEnchantment extends Enchantment
{
if(ev.getEntity().level.isClientSide)return;
ServerPlayer sp = (ServerPlayer)ev.getEntity();
ItemStack feet = sp.getItemBySlot(EquipmentSlot.FEET);
ItemStack legs = sp.getItemBySlot(EquipmentSlot.LEGS);
recheck(sp);
}
}
boolean hasFlight = false;
private static void recheck(ServerPlayer sp)
{
if(sp.gameMode.isCreative())return; // Don't mess with the creative mode attributes
if(feet.getEnchantmentLevel(ModEnchantments.FLIGHT_ENCHANTMENT.get())>0)hasFlight=true;
if(legs.getEnchantmentLevel(ModEnchantments.FLIGHT_ENCHANTMENT.get())>0)hasFlight=true;
ItemStack feet = sp.getItemBySlot(EquipmentSlot.FEET);
Abilities playerAbilities = sp.getAbilities();
if(playerAbilities.mayfly == false)
{
if(hasFlight){
playerAbilities.mayfly=true;
sp.onUpdateAbilities();
}
}else {
if(!hasFlight){
boolean hasFlight = false;
playerAbilities.mayfly=false;
playerAbilities.flying=false;
if(feet.getEnchantmentLevel(ModEnchantments.FLIGHT_ENCHANTMENT.get())>0)hasFlight=true;
sp.onUpdateAbilities();
}
Abilities playerAbilities = sp.getAbilities();
if(playerAbilities.mayfly == false)
{
if(hasFlight){
playerAbilities.mayfly=true;
sp.onUpdateAbilities();
}
}else {
if(!hasFlight){
playerAbilities.mayfly=false;
playerAbilities.flying=false;
sp.onUpdateAbilities();
}
}
}
@SubscribeEvent
public static void onGameModeChange(PlayerEvent.PlayerChangeGameModeEvent ev)
{
if(ev.getEntity().level.isClientSide)return;
recheck((ServerPlayer)ev.getEntity());
}
}
public FlightEnchantment()
public FlightEnchantment(EquipmentSlot... slots)
{
super(Rarity.RARE, EnchantmentCategory.ARMOR, new EquipmentSlot[] {EquipmentSlot.FEET, EquipmentSlot.LEGS});
super(Rarity.VERY_RARE, EnchantmentCategory.ARMOR_FEET, slots);
}
@Override
@ -75,11 +95,7 @@ public class FlightEnchantment extends Enchantment
{
return this.getMinCost(level) + 15;
}
@Override
public boolean canApplyAtEnchantingTable(ItemStack stack)
{
return false;
}
@Override
public boolean isTreasureOnly(){
return true;
@ -90,7 +106,8 @@ public class FlightEnchantment extends Enchantment
return true;
}
// Not a bug. Flight is meant to be a permanent upgrade to a item. It is considered a curse due to unstable behavior that can randomly happen if the enchantment level is now maxxed out.
// Not a bug. Flight is meant to be a permanent upgrade to a item. It is considered a curse due to unstable behavior. Flight will eat up durability and forge energy
// Flight should NOT be able to be removed via the grindstone
@Override
public boolean isCurse()
{

View file

@ -1,5 +1,9 @@
package dev.zontreck.otemod.enchantments;
import java.util.Random;
import dev.zontreck.otemod.configs.OTEServerConfig;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SwordItem;
@ -8,6 +12,7 @@ import net.minecraft.world.item.enchantment.EnchantmentCategory;
public class MobEggEnchantment extends Enchantment
{
public static final String TAG_BIAS = "mob_egging_bias";
public MobEggEnchantment()
{
@ -54,5 +59,15 @@ public class MobEggEnchantment extends Enchantment
{
return false;
}
public static boolean givesEgg(int level, int bias)
{
double CHANCE = OTEServerConfig.SPAWN_EGG_CHANCE.get() * 100;
CHANCE *= (level / 0.5);
CHANCE += bias;
double rng = Math.random()*100000;
return (rng <= CHANCE);
}
}

View file

@ -1,6 +1,7 @@
package dev.zontreck.otemod.enchantments;
import dev.zontreck.otemod.OTEMod;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
@ -8,11 +9,13 @@ import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public class ModEnchantments {
protected static final EquipmentSlot[] ARMOR_SLOTS = new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET};
public static final DeferredRegister<Enchantment> REGISTERS = DeferredRegister.create(ForgeRegistries.ENCHANTMENTS, OTEMod.MOD_ID);
public static final RegistryObject<Enchantment> MOB_EGGING_ENCHANTMENT = REGISTERS.register("mob_egging", ()->new MobEggEnchantment());
public static final RegistryObject<Enchantment> FLIGHT_ENCHANTMENT = REGISTERS.register("player_flight", ()->new FlightEnchantment());
public static final RegistryObject<Enchantment> FLIGHT_ENCHANTMENT = REGISTERS.register("player_flight", ()->new FlightEnchantment(EquipmentSlot.FEET));
public static void register(IEventBus bus){
REGISTERS.register(bus);

View file

@ -0,0 +1,13 @@
package dev.zontreck.otemod.entities;
import dev.zontreck.otemod.OTEMod;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
public class ModEntities {
public static final DeferredRegister<EntityType<?>> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, OTEMod.MOD_ID);
}

View file

@ -0,0 +1,95 @@
// Made with Blockbench 4.6.4
// Exported for Minecraft version 1.17 or later with Mojang mappings
// Paste this class into your mod and generate all required imports
package dev.zontreck.otemod.entities;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeDeformation;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
public class PossumEntity<T extends Entity> extends EntityModel<T> {
// This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor
public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "possum"), "main");
private final ModelPart tail;
private final ModelPart body;
private final ModelPart feet;
private final ModelPart head;
private final ModelPart ears;
public PossumEntity(ModelPart root) {
this.tail = root.getChild("tail");
this.body = root.getChild("body");
this.feet = root.getChild("feet");
this.head = root.getChild("head");
this.ears = root.getChild("ears");
}
public static LayerDefinition createBodyLayer() {
MeshDefinition meshdefinition = new MeshDefinition();
PartDefinition partdefinition = meshdefinition.getRoot();
PartDefinition tail = partdefinition.addOrReplaceChild("tail", CubeListBuilder.create().texOffs(10, 29).addBox(-12.0F, -5.0F, -9.0F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(10, 29).addBox(-12.0F, -4.0F, -8.0F, 2.0F, 1.0F, 1.0F, new CubeDeformation(0.0F))
.texOffs(14, 25).addBox(-12.0F, -2.0F, -11.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(14, 25).addBox(-12.0F, -1.0F, -12.0F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(14, 25).addBox(-11.0F, -2.0F, -12.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(14, 25).addBox(-12.0F, -1.0F, -13.0F, 2.0F, 1.0F, 1.0F, new CubeDeformation(0.0F))
.texOffs(0, 0).addBox(-13.0F, -4.0F, -10.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 0).addBox(-12.0F, -4.0F, -9.0F, 1.0F, 2.0F, 1.0F, new CubeDeformation(0.0F))
.texOffs(6, 25).addBox(-12.0F, -4.0F, -11.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 4).addBox(-14.0F, -3.0F, -12.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 32).addBox(-12.0F, -2.0F, -13.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(16, 31).addBox(-13.0F, -1.0F, -16.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(10, 29).addBox(-13.0F, -2.0F, -14.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(14, 25).addBox(-13.0F, 2.0F, -18.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(6, 25).addBox(-12.0F, -1.0F, -15.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 4).addBox(-13.0F, 0.0F, -17.0F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 4).addBox(-12.0F, 1.0F, -17.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 32).addBox(-13.0F, 1.0F, -18.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(16, 31).addBox(-14.0F, 1.0F, -18.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(5.0F, 23.0F, 10.0F));
PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(14, 14).addBox(-4.0F, -7.0F, 6.0F, 7.0F, 4.0F, 1.0F, new CubeDeformation(0.0F))
.texOffs(0, 0).addBox(-5.0F, -7.75F, -2.0F, 9.0F, 6.0F, 8.0F, new CubeDeformation(0.0F))
.texOffs(20, 19).addBox(-4.0F, -7.0F, -3.0F, 7.0F, 4.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F));
PartDefinition feet = partdefinition.addOrReplaceChild("feet", CubeListBuilder.create().texOffs(26, 0).addBox(-5.0F, -2.0F, -1.9F, 3.0F, 1.0F, 3.0F, new CubeDeformation(0.0F))
.texOffs(22, 24).addBox(-5.0F, -2.0F, 3.0F, 3.0F, 1.0F, 3.0F, new CubeDeformation(0.0F))
.texOffs(26, 4).addBox(1.0F, -2.0F, -1.9F, 3.0F, 1.0F, 3.0F, new CubeDeformation(0.0F))
.texOffs(23, 28).addBox(1.0F, -2.0F, 3.1F, 3.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F));
PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 14).addBox(2.0F, -12.0F, -1.0F, 4.0F, 5.0F, 6.0F, new CubeDeformation(0.0F))
.texOffs(0, 25).addBox(6.0F, -10.0F, 0.0F, 1.0F, 3.0F, 4.0F, new CubeDeformation(0.0F))
.texOffs(31, 24).addBox(7.0F, -9.0F, 1.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(16, 24).addBox(1.0F, -11.0F, 0.0F, 1.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F));
PartDefinition ears = partdefinition.addOrReplaceChild("ears", CubeListBuilder.create().texOffs(30, 14).addBox(3.0F, -13.0F, -2.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 14).addBox(3.0F, -13.0F, 4.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F));
return LayerDefinition.create(meshdefinition, 64, 64);
}
@Override
public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
}
@Override
public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) {
tail.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
body.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
feet.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
head.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
ears.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
}
}

View file

@ -3,7 +3,7 @@ package dev.zontreck.otemod.events;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.integrations.KeyBindings;
import dev.zontreck.otemod.networking.ModMessages;
import dev.zontreck.otemod.networking.packets.OpenVaultPacket;
import dev.zontreck.otemod.networking.packets.OpenVaultC2SPacket;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.InputEvent;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
@ -21,7 +21,7 @@ public class ClientEvents {
//OTEMod.LOGGER.info("KEY PRESS: "+event.getKey());
if(KeyBindings.OPEN_VAULT.consumeClick())
{
ModMessages.sendToServer(new OpenVaultPacket(0, false, 0));
ModMessages.sendToServer(new OpenVaultC2SPacket(0, false, 0));
}
}
}

View file

@ -2,10 +2,14 @@ package dev.zontreck.otemod.events;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.configs.OTEServerConfig;
import dev.zontreck.otemod.enchantments.MobEggEnchantment;
import dev.zontreck.otemod.enchantments.ModEnchantments;
import dev.zontreck.otemod.items.tags.ItemStatType;
import dev.zontreck.otemod.items.tags.ItemStatistics;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
@ -35,19 +39,29 @@ public class EventHandler {
ServerPlayer play = (ServerPlayer)ent;
LivingEntity killed = ev.getEntity();
int levelOfEgging = play.getMainHandItem().getEnchantmentLevel(ModEnchantments.MOB_EGGING_ENCHANTMENT.get());
float CHANCE = (OTEServerConfig.SPAWN_EGG_CHANCE.get()*1000);
ItemStack stack = play.getMainHandItem();
int levelOfEgging = stack.getEnchantmentLevel(ModEnchantments.MOB_EGGING_ENCHANTMENT.get());
if(levelOfEgging==0)return;
CompoundTag tag = stack.getTag();
int bias = tag.getInt(MobEggEnchantment.TAG_BIAS);
CHANCE += (levelOfEgging * 0.5f);
if(killed.level.random.nextInt(0,100000) <= CHANCE)
if(MobEggEnchantment.givesEgg(levelOfEgging, bias))
{
bias=0;
tag.putInt(MobEggEnchantment.TAG_BIAS, bias);
// .25% chance
// Check enchantment level for looting
int level = play.getMainHandItem().getEnchantmentLevel(Enchantments.MOB_LOOTING);
int level = stack.getEnchantmentLevel(Enchantments.MOB_LOOTING);
if(level==3){
ItemStack egg = new ItemStack(ForgeSpawnEggItem.fromEntityType(killed.getType()));
ev.getDrops().add(new ItemEntity(killed.level, killed.getX(), killed.getY(), killed.getZ(), egg));
LoreHandlers.updateItem(stack, ItemStatType.EGGING);
}
}else{
bias += 1;
tag.putInt(MobEggEnchantment.TAG_BIAS, bias);
}
}
}

View file

@ -134,7 +134,8 @@ public class LoreHandlers {
}
private void updateItem(ItemStack weaponUsed, ItemStatType type)
// Only valid to be used by OTEMod
protected static void updateItem(ItemStack weaponUsed, ItemStatType type)
{
// Update the mob kill count

View file

@ -0,0 +1,19 @@
package dev.zontreck.otemod.implementation;
public class MouseHelpers {
public static boolean isMouseOver(double mouseX, double mouseY, int x, int y, int sizeX, int sizeY)
{
return (mouseX>=x && mouseX <= x+sizeX) && (mouseY >= y && mouseY <= y+sizeY);
}
public static boolean isMouseOver(double mouseX, double mouseY, int x, int y, int size)
{
return isMouseOver(mouseX, mouseY, x, y, size,size);
}
public static boolean isMouseOver(double mouseX, double mouseY, int x, int y)
{
return isMouseOver(mouseX, mouseY, x, y, 16);
}
}

View file

@ -1,4 +1,4 @@
package dev.zontreck.otemod.implementation;
package dev.zontreck.otemod.implementation.energy;
import net.minecraftforge.energy.EnergyStorage;

View file

@ -0,0 +1,49 @@
package dev.zontreck.otemod.implementation.energy.screenrenderer;
import java.util.List;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.network.chat.Component;
import net.minecraftforge.energy.IEnergyStorage;
/*
* BluSunrize
* Copyright (c) 2021
*
* This code is licensed under "Blu's License of Common Sense"
* Details can be found in the license file in the root folder of this project
*/
public class EnergyInfoArea extends InfoArea {
private final IEnergyStorage energy;
public EnergyInfoArea(int xMin, int yMin) {
this(xMin, yMin, null,8,64);
}
public EnergyInfoArea(int xMin, int yMin, IEnergyStorage energy) {
this(xMin, yMin, energy,8,64);
}
public EnergyInfoArea(int xMin, int yMin, IEnergyStorage energy, int width, int height) {
super(new Rect2i(xMin, yMin, width, height));
this.energy = energy;
}
public List<Component> getTooltips() {
return List.of(Component.literal(energy.getEnergyStored()+"/"+energy.getMaxEnergyStored()+" FE"));
}
@Override
public void draw(PoseStack transform) {
final int height = area.getHeight();
int stored = (int)(height*(energy.getEnergyStored()/(float)energy.getMaxEnergyStored()));
fillGradient(
transform,
area.getX(), area.getY()+(height-stored),
area.getX() + area.getWidth(), area.getY() +area.getHeight(),
0xffb51500, 0xff600b00
);
}
}

View file

@ -0,0 +1,24 @@
package dev.zontreck.otemod.implementation.energy.screenrenderer;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.client.renderer.Rect2i;
/*
* BluSunrize
* Copyright (c) 2021
*
* This code is licensed under "Blu's License of Common Sense"
* Details can be found in the license file in the root folder of this project
*/
public abstract class InfoArea extends GuiComponent {
protected final Rect2i area;
protected InfoArea(Rect2i area) {
this.area = area;
}
public abstract void draw(PoseStack transform);
}

View file

@ -1,7 +1,8 @@
package dev.zontreck.otemod.implementation.inits;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.implementation.scrubber.ScrubberMenu;
import dev.zontreck.otemod.implementation.scrubber.ItemScrubberMenu;
import dev.zontreck.otemod.implementation.scrubber.MagicalScrubberMenu;
import dev.zontreck.otemod.implementation.vault.VaultMenu;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType;
@ -18,7 +19,8 @@ public final class ModMenuTypes
public static final RegistryObject <MenuType <VaultMenu>> VAULT = CONTAINERS.register("vault", ()-> new MenuType<>(VaultMenu::new));
public static final RegistryObject<MenuType<ScrubberMenu>> SCRUBBER = registerMenuType(ScrubberMenu::new, "item_scrubber_menu");
public static final RegistryObject<MenuType<ItemScrubberMenu>> SCRUBBER = registerMenuType(ItemScrubberMenu::new, "item_scrubber_menu");
public static final RegistryObject<MenuType<MagicalScrubberMenu>> MAGIC_SCRUBBER = registerMenuType(MagicalScrubberMenu::new, "magical_scrubber_menu");
private static <T extends AbstractContainerMenu> RegistryObject<MenuType<T>> registerMenuType(IContainerFactory<T> factory, String name)

View file

@ -18,18 +18,18 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.items.SlotItemHandler;
public class ScrubberMenu extends AbstractContainerMenu
public class ItemScrubberMenu extends AbstractContainerMenu
{
public final ItemScrubberBlockEntity entity;
private final Level level;
private final ContainerData data;
public ScrubberMenu(int id, Inventory inv, FriendlyByteBuf buf)
public ItemScrubberMenu(int id, Inventory inv, FriendlyByteBuf buf)
{
this(id, inv, inv.player.level.getBlockEntity(buf.readBlockPos()), new SimpleContainerData(1));
}
public ScrubberMenu(int id, Inventory inv, BlockEntity entity, ContainerData data){
public ItemScrubberMenu(int id, Inventory inv, BlockEntity entity, ContainerData data){
super(ModMenuTypes.SCRUBBER.get(), id);
checkContainerSize(inv, 1);

View file

@ -1,34 +1,48 @@
package dev.zontreck.otemod.implementation.scrubber;
import java.util.Optional;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.implementation.MouseHelpers;
import dev.zontreck.otemod.implementation.energy.screenrenderer.EnergyInfoArea;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
public class ScrubberScreen extends AbstractContainerScreen<ScrubberMenu>
public class ItemScrubberScreen extends AbstractContainerScreen<ItemScrubberMenu>
{
private static final ResourceLocation TEXTURE = new ResourceLocation(OTEMod.MOD_ID, "textures/gui/item_scrubber_gui.png");
public ScrubberScreen(ScrubberMenu p_97741_, Inventory p_97742_, Component p_97743_) {
private EnergyInfoArea EIA;
public ItemScrubberScreen(ItemScrubberMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
this.topPos=0;
this.leftPos=0;
this.imageWidth = 207;
this.imageHeight = 164;
this.imageWidth = 208;
this.imageHeight = 165;
}
@Override
protected void init()
{
super.init();
assignEnergyArea();
}
private void assignEnergyArea() {
int x = (width - imageWidth )/2;
int y = (height - imageHeight)/2;
EIA = new EnergyInfoArea(x+188, y+69, menu.entity.getEnergyStorage(), 7, 72);
}
@Override
@ -40,6 +54,7 @@ public class ScrubberScreen extends AbstractContainerScreen<ScrubberMenu>
blit(poseStack, this.leftPos, this.topPos, 0,0, imageWidth, imageHeight);
renderUncraftingProgress(poseStack);
EIA.draw(poseStack);
}
@ -48,9 +63,18 @@ public class ScrubberScreen extends AbstractContainerScreen<ScrubberMenu>
{
this.font.draw(stack, this.title.getString(), 63, 12, 0xFFFFFF);
int x = (width - imageWidth )/2;
int y = (height - imageHeight)/2;
renderEnergy(stack, mouseX, mouseY, x, y);
//this.font.draw(stack, this.playerInventoryTitle.getString(), this.leftPos + 17, this.topPos + 123, 0xFFFFFF);
}
private void renderEnergy(PoseStack stack, int mouseX, int mouseY, int x, int y) {
if(isMouseAbove(mouseX, mouseY, x, y, 188, 69, 7, 72)){
renderTooltip(stack, EIA.getTooltips(), Optional.empty(), mouseX-x, mouseY-y);
}
}
private void renderUncraftingProgress(PoseStack stack)
{
if(menu.isCrafting())
@ -66,5 +90,10 @@ public class ScrubberScreen extends AbstractContainerScreen<ScrubberMenu>
super.render(stack, mouseX, mouseY, delta);
renderTooltip(stack, mouseX, mouseY);
}
private boolean isMouseAbove(int mouseX, int mouseY, int x, int y, int offsetX, int offsetY, int width, int height)
{
return MouseHelpers.isMouseOver(mouseX, mouseY, x+offsetX, y+offsetY, width, height);
}
}

View file

@ -0,0 +1,154 @@
package dev.zontreck.otemod.implementation.scrubber;
import dev.zontreck.otemod.blocks.ModBlocks;
import dev.zontreck.otemod.blocks.entity.MagicalScrubberBlockEntity;
import dev.zontreck.otemod.implementation.inits.ModMenuTypes;
import net.minecraft.core.Direction;
import net.minecraft.network.FriendlyByteBuf;
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.ContainerData;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.SimpleContainerData;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.items.SlotItemHandler;
public class MagicalScrubberMenu extends AbstractContainerMenu
{
public final MagicalScrubberBlockEntity entity;
private final Level level;
private final ContainerData data;
public MagicalScrubberMenu(int id, Inventory inv, FriendlyByteBuf buf)
{
this(id, inv, inv.player.level.getBlockEntity(buf.readBlockPos()), new SimpleContainerData(1));
}
public MagicalScrubberMenu(int id, Inventory inv, BlockEntity entity, ContainerData data){
super(ModMenuTypes.MAGIC_SCRUBBER.get(), id);
checkContainerSize(inv, 1);
this.entity = (MagicalScrubberBlockEntity)entity;
this.data=data;
this.level = inv.player.level;
addPlayerInventory(inv);
addPlayerHotbar(inv);
this.entity.getCapability(ForgeCapabilities.ITEM_HANDLER, Direction.UP).ifPresent(handler->{
addSlot(new SlotItemHandler(handler, 0, 16, 41));
});
this.entity.getCapability(ForgeCapabilities.ITEM_HANDLER, Direction.DOWN).ifPresent(handler->{
addSlot(new SlotItemHandler(handler, 0, 177, 41));
});
addDataSlots(data);
}
public boolean isCrafting()
{
return data.get(0) > 0;
}
public int getScaledProgress()
{
if(!isCrafting())return 0;
int progress = this.data.get(0);
int max = MagicalScrubberBlockEntity.MAXIMUM_PROCESSING_TICKS;
int progressArrow = 125;
if(progress != 0 && max != 0)
{
int percent = progress * progressArrow / max;
return percent;
}
return 0;
}
// CREDIT GOES TO: diesieben07 | https://github.com/diesieben07/SevenCommons
// must assign a slot number to each of the slots used by the GUI.
// For this container, we can see both the tile inventory's slots as well as the player inventory slots and the hotbar.
// Each time we add a Slot to the container, it automatically increases the slotIndex, which means
// 0 - 8 = hotbar slots (which will map to the InventoryPlayer slot numbers 0 - 8)
// 9 - 35 = player inventory slots (which map to the InventoryPlayer slot numbers 9 - 35)
// 36 - 44 = TileInventory slots, which map to our TileEntity slot numbers 0 - 8)
private static final int HOTBAR_SLOT_COUNT = 9;
private static final int PLAYER_INVENTORY_ROW_COUNT = 3;
private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9;
private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_COLUMN_COUNT * PLAYER_INVENTORY_ROW_COUNT;
private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT;
private static final int VANILLA_FIRST_SLOT_INDEX = 0;
private static final int TE_INVENTORY_FIRST_SLOT_INDEX = VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT;
// THIS YOU HAVE TO DEFINE!
private static final int TE_INVENTORY_SLOT_COUNT = 2; // must be the number of slots you have!
@Override
public ItemStack quickMoveStack(Player playerIn, int index) {
Slot sourceSlot = slots.get(index);
if (sourceSlot == null || !sourceSlot.hasItem()) return ItemStack.EMPTY; //EMPTY_ITEM
ItemStack sourceStack = sourceSlot.getItem();
ItemStack copyOfSourceStack = sourceStack.copy();
// Check if the slot clicked is one of the vanilla container slots
if (index < VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT) {
// This is a vanilla container slot so merge the stack into the tile inventory
if (!moveItemStackTo(sourceStack, TE_INVENTORY_FIRST_SLOT_INDEX, TE_INVENTORY_FIRST_SLOT_INDEX
+ TE_INVENTORY_SLOT_COUNT, false)) {
return ItemStack.EMPTY; // EMPTY_ITEM
}
} else if (index < TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT) {
// This is a TE slot so merge the stack into the players inventory
if (!moveItemStackTo(sourceStack, VANILLA_FIRST_SLOT_INDEX, VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT, false)) {
return ItemStack.EMPTY;
}
} else {
System.out.println("Invalid slotIndex:" + index);
return ItemStack.EMPTY;
}
// If stack size == 0 (the entire stack was moved) set slot contents to null
if (sourceStack.getCount() == 0) {
sourceSlot.set(ItemStack.EMPTY);
} else {
sourceSlot.setChanged();
}
sourceSlot.onTake(playerIn, sourceStack);
return copyOfSourceStack;
}
@Override
public boolean stillValid(Player player) {
return stillValid(ContainerLevelAccess.create(level, entity.getBlockPos()), player, ModBlocks.MAGICAL_SCRUBBER.get());
}
private static final int PLAYER_INVENTORY_FIRST_SLOT_HEIGHT = 69;
private static final int PLAYER_INVENTORY_FIRST_SLOT_LEFT = 24;
private static final int PLAYER_HOTBAR_FIRST_SLOT = 125;
private void addPlayerInventory(Inventory inv)
{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j++) {
this.addSlot(new Slot(inv, j+i*9+9, PLAYER_INVENTORY_FIRST_SLOT_LEFT+j*18, PLAYER_INVENTORY_FIRST_SLOT_HEIGHT+i*18));
}
}
}
private void addPlayerHotbar(Inventory inv)
{
for (int index = 0; index < 9; index++) {
this.addSlot(new Slot(inv, index, PLAYER_INVENTORY_FIRST_SLOT_LEFT+index*18, PLAYER_HOTBAR_FIRST_SLOT));
}
}
}

View file

@ -0,0 +1,99 @@
package dev.zontreck.otemod.implementation.scrubber;
import java.util.Optional;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.implementation.MouseHelpers;
import dev.zontreck.otemod.implementation.energy.screenrenderer.EnergyInfoArea;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
public class MagicalScrubberScreen extends AbstractContainerScreen<MagicalScrubberMenu>
{
private static final ResourceLocation TEXTURE = new ResourceLocation(OTEMod.MOD_ID, "textures/gui/item_scrubber_gui.png");
private EnergyInfoArea EIA;
public MagicalScrubberScreen(MagicalScrubberMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
this.topPos=0;
this.leftPos=0;
this.imageWidth = 208;
this.imageHeight = 165;
}
@Override
protected void init()
{
super.init();
assignEnergyArea();
}
private void assignEnergyArea() {
int x = (width - imageWidth )/2;
int y = (height - imageHeight)/2;
EIA = new EnergyInfoArea(x+188, y+69, menu.entity.getEnergyStorage(), 7, 72);
}
@Override
protected void renderBg(PoseStack poseStack, float partialTick, int mouseX, int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, TEXTURE);
blit(poseStack, this.leftPos, this.topPos, 0,0, imageWidth, imageHeight);
renderUncraftingProgress(poseStack);
EIA.draw(poseStack);
}
@Override
protected void renderLabels(PoseStack stack, int mouseX, int mouseY)
{
this.font.draw(stack, this.title.getString(), 63, 12, 0xFFFFFF);
int x = (width - imageWidth )/2;
int y = (height - imageHeight)/2;
renderEnergy(stack, mouseX, mouseY, x, y);
//this.font.draw(stack, this.playerInventoryTitle.getString(), this.leftPos + 17, this.topPos + 123, 0xFFFFFF);
}
private void renderEnergy(PoseStack stack, int mouseX, int mouseY, int x, int y) {
if(isMouseAbove(mouseX, mouseY, x, y, 188, 69, 7, 72)){
renderTooltip(stack, EIA.getTooltips(), Optional.empty(), mouseX-x, mouseY-y);
}
}
private void renderUncraftingProgress(PoseStack stack)
{
if(menu.isCrafting())
{
blit(stack, leftPos+42, topPos+45, 1, 168, menu.getScaledProgress(),6);
}
}
@Override
public void render(PoseStack stack, int mouseX, int mouseY, float delta)
{
renderBackground(stack);
super.render(stack, mouseX, mouseY, delta);
renderTooltip(stack, mouseX, mouseY);
}
private boolean isMouseAbove(int mouseX, int mouseY, int x, int y, int offsetX, int offsetY, int width, int height)
{
return MouseHelpers.isMouseOver(mouseX, mouseY, x+offsetX, y+offsetY, width, height);
}
}

View file

@ -8,7 +8,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.commands.vaults.VaultCommand;
import dev.zontreck.otemod.networking.ModMessages;
import dev.zontreck.otemod.networking.packets.OpenVaultPacket;
import dev.zontreck.otemod.networking.packets.OpenVaultC2SPacket;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.Button.OnPress;
import net.minecraft.client.gui.font.TextFieldHelper;
@ -72,12 +72,12 @@ public class VaultScreen extends AbstractContainerScreen <VaultMenu>
this.addWidget(new Button(this.leftPos+7,this.topPos+84,16,16,Component.literal(""), (button)->{
thePlayer.closeContainer();
ModMessages.sendToServer(new OpenVaultPacket(0,true,-1));
ModMessages.sendToServer(new OpenVaultC2SPacket(0,true,-1));
} ));
this.addWidget(new Button(this.leftPos+187,this.topPos+84,16,16,Component.literal(""), (button)->{
thePlayer.closeContainer();
ModMessages.sendToServer(new OpenVaultPacket(0, true, 1));
ModMessages.sendToServer(new OpenVaultC2SPacket(0, true, 1));
} ));
}

View file

@ -3,6 +3,8 @@ package dev.zontreck.otemod.items;
import dev.zontreck.otemod.OTEMod;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.SimpleFoiledItem;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
@ -28,6 +30,16 @@ public class ModItems {
public static final RegistryObject<Item> PATTERN = ITEMS.register("pattern", () -> new Item(new Item.Properties().tab(CreativeModeTab.TAB_MISC)));
public static final RegistryObject<Item> SCORCHED_BRICK = ITEMS.register("scorched_brick", () -> new Item(new Item.Properties().tab(CreativeModeTab.TAB_MISC)));
public static final RegistryObject<Item> COPPER_CAN = ITEMS.register("copper_can", () -> new Item(new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(16)));
public static final RegistryObject<Item> ETERNIUM_INGOT = ITEMS.register("eternium_ingot", ()-> new SimpleFoiledItem(new Item.Properties().tab(CreativeModeTab.TAB_MATERIALS)));
public static final RegistryObject<Item> MELTED_NETHER_STAR = ITEMS.register("melted_nether_star", () -> new SimpleFoiledItem(new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(64)));
public static final RegistryObject<Item> SINGULARITY = ITEMS.register("singularity", () -> new Item(new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(1)));
public static final RegistryObject<Item> ETERNIUM_ROD = ITEMS.register("eternium_rod", () -> new SimpleFoiledItem(new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(64)));
public static final RegistryObject<Item> SCRUBBER_FRAME_PIECE = ITEMS.register("scrubber_frame_piece", () -> new Item(new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(64)));
public static final RegistryObject<Item> SCRUBBER_FRAME = ITEMS.register("scrubber_frame", () -> new Item(new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(64)));
public static void register(IEventBus bus){

View file

@ -8,5 +8,6 @@ public enum ItemStatType {
SHOVEL,
SHOVELPATH,
HOE,
SHEARS
SHEARS,
EGGING
}

View file

@ -37,6 +37,9 @@ public class ItemStatistics {
case SHEARS -> {
lore += "Sheep Shaved: ";
}
case EGGING -> {
lore += "Mobs Egged: ";
}
}
lore += ChatColor.doColors("!Green!"+val);
return lore;

View file

@ -1,7 +1,8 @@
package dev.zontreck.otemod.networking;
import dev.zontreck.otemod.OTEMod;
import dev.zontreck.otemod.networking.packets.OpenVaultPacket;
import dev.zontreck.otemod.networking.packets.EnergySyncS2CPacket;
import dev.zontreck.otemod.networking.packets.OpenVaultC2SPacket;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkDirection;
@ -28,10 +29,16 @@ public class ModMessages {
INSTANCE=net;
net.messageBuilder(OpenVaultPacket.class, id(), NetworkDirection.PLAY_TO_SERVER)
.decoder(OpenVaultPacket::new)
.encoder(OpenVaultPacket::toBytes)
.consumerMainThread(OpenVaultPacket::handle)
net.messageBuilder(OpenVaultC2SPacket.class, id(), NetworkDirection.PLAY_TO_SERVER)
.decoder(OpenVaultC2SPacket::new)
.encoder(OpenVaultC2SPacket::toBytes)
.consumerMainThread(OpenVaultC2SPacket::handle)
.add();
net.messageBuilder(EnergySyncS2CPacket.class, id(), NetworkDirection.PLAY_TO_CLIENT)
.decoder(EnergySyncS2CPacket::new)
.encoder(EnergySyncS2CPacket::toBytes)
.consumerMainThread(EnergySyncS2CPacket::handle)
.add();
}
@ -43,4 +50,9 @@ public class ModMessages {
{
INSTANCE.send(PacketDistributor.PLAYER.with(()->player), message);
}
public static <MSG> void sendToAll(MSG message)
{
INSTANCE.send(PacketDistributor.ALL.noArg(), message);
}
}

View file

@ -0,0 +1,51 @@
package dev.zontreck.otemod.networking.packets;
import java.util.function.Supplier;
import dev.zontreck.otemod.blocks.entity.ItemScrubberBlockEntity;
import dev.zontreck.otemod.blocks.entity.MagicalScrubberBlockEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;
public class EnergySyncS2CPacket {
private int energy;
private BlockPos pos;
public EnergySyncS2CPacket(int amount, BlockPos pos)
{
this.energy=amount;
this.pos=pos;
}
public EnergySyncS2CPacket(FriendlyByteBuf buf)
{
energy = buf.readInt();
pos = buf.readBlockPos();
}
public void toBytes(FriendlyByteBuf buf)
{
buf.writeInt(energy);
buf.writeBlockPos(pos);
}
public void handle(Supplier<NetworkEvent.Context> ctx)
{
NetworkEvent.Context context = ctx.get();
context.enqueueWork(()->
{
// WE ARE NOW ON THE CLIENT
if(Minecraft.getInstance().level.getBlockEntity(pos) instanceof ItemScrubberBlockEntity entity)
{
entity.setEnergy(energy);
} else if(Minecraft.getInstance().level.getBlockEntity(pos) instanceof MagicalScrubberBlockEntity entity)
{
entity.setEnergy(energy);
}
});
}
}

View file

@ -6,22 +6,21 @@ import dev.zontreck.otemod.commands.vaults.VaultCommand;
import dev.zontreck.otemod.implementation.vault.VaultContainer;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.event.level.NoteBlockEvent.Change;
import net.minecraftforge.network.NetworkEvent;
// This packet is only ever sent from the client to the server when requesting to open vaults using the EaseOfUse Buttons
public class OpenVaultPacket {
public class OpenVaultC2SPacket {
private int vault=0;
private boolean change = false; // This is set to true when going previous or next.
private int changeDir = 0; // This is only in the packet when change is true. This is either a 1 or a -1.
public OpenVaultPacket(int vaultNum, boolean change, int changeDir)
public OpenVaultC2SPacket(int vaultNum, boolean change, int changeDir)
{
this.vault = vaultNum;
this.change = change;
this.changeDir=changeDir;
}
public OpenVaultPacket(FriendlyByteBuf buf)
public OpenVaultC2SPacket(FriendlyByteBuf buf)
{
this.change = buf.readBoolean();
if(this.change)

View file

@ -19,7 +19,7 @@ modId="otemod" #mandatory
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata
# see the associated build.gradle script for how to populate this completely automatically during a build
version="1.3.6.7" #mandatory
version="1.3.7.2" #mandatory
# A display name for the mod
displayName="OTEMod" #mandatory
# A URL to query for updates for this mod. See the JSON update specification https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "otemod:block/magical_scrubber"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "otemod:block/stable_singularity"
}
}
}

View file

@ -22,6 +22,13 @@
"item.otemod.pattern": "Pattern",
"item.otemod.scorched_brick": "Scorched Brick",
"item.otemod.copper_can": "Copper Can",
"item.otemod.melted_nether_star": "Melted Nether Star",
"item.otemod.eternium_ingot": "Eternium Ingot",
"item.otemod.eternium_rod": "Eternium Rod",
"item.otemod.singularity": "Singularity",
"item.otemod.scrubber_frame_piece": "Scrubber Frame Component",
"item.otemod.scrubber_frame": "Scrubber Frame",
"block.otemod.eternium_ore_block": "Eternium Ore",
"block.otemod.deepslate_eternium_ore_block": "Deepslate Eternium Ore",
@ -35,6 +42,9 @@
"block.otemod.nether_grout": "Nether Grout",
"block.otemod.scorched_table": "Scorched Table",
"block.otemod.item_scrubber": "Item Scrubber",
"block.otemod.magical_scrubber": "Magical Scrubber",
"block.otemod.stable_singularity": "Stable Singularity",
"enchantment.otemod.mob_egging": "Mob Egging",
"enchantment.otemod.player_flight": "Flight",

View file

@ -1,6 +1,322 @@
{
"parent": "block/cube_all",
"textures": {
"all": "otemod:block/aurora_block"
}
}
"credit": "Made with Blockbench",
"render_type": "minecraft:translucent",
"texture_size": [64, 64],
"textures": {
"0": "otemod:block/aurora/body",
"1": "otemod:block/aurora/inside",
"particle": "otemod:block/aurora/body"
},
"elements": [
{
"from": [9, 15, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [12.5, 6, 14.25, 6.25], "texture": "#0"},
"east": {"uv": [11, 3, 15, 3.25], "texture": "#0"},
"south": {"uv": [12.75, 12.25, 14.5, 12.5], "texture": "#0"},
"west": {"uv": [11, 3.25, 15, 3.5], "texture": "#0"},
"up": {"uv": [1.75, 4, 0, 0], "texture": "#0"},
"down": {"uv": [3.5, 0, 1.75, 4], "texture": "#0"}
}
},
{
"from": [0, 0, 0],
"to": [7, 1, 16],
"faces": {
"north": {"uv": [12.75, 12.5, 14.5, 12.75], "texture": "#0"},
"east": {"uv": [11, 3.5, 15, 3.75], "texture": "#0"},
"south": {"uv": [12.75, 12.75, 14.5, 13], "texture": "#0"},
"west": {"uv": [11, 3.75, 15, 4], "texture": "#0"},
"up": {"uv": [5.25, 4, 3.5, 0], "texture": "#0"},
"down": {"uv": [1.75, 4, 0, 8], "texture": "#0"}
}
},
{
"from": [7, 0, 0],
"to": [9, 1, 7],
"faces": {
"north": {"uv": [5.75, 8, 6.25, 8.25], "texture": "#0"},
"east": {"uv": [0.5, 13, 2.25, 13.25], "texture": "#0"},
"south": {"uv": [6.25, 8, 6.75, 8.25], "texture": "#0"},
"west": {"uv": [6, 13, 7.75, 13.25], "texture": "#0"},
"up": {"uv": [5, 13.75, 4.5, 12], "texture": "#0"},
"down": {"uv": [12.5, 4.5, 12, 6.25], "texture": "#0"}
}
},
{
"from": [7, 0, 9],
"to": [9, 1, 16],
"faces": {
"north": {"uv": [5.75, 8.25, 6.25, 8.5], "texture": "#0"},
"east": {"uv": [7.75, 13, 9.5, 13.25], "texture": "#0"},
"south": {"uv": [6.25, 8.25, 6.75, 8.5], "texture": "#0"},
"west": {"uv": [9.5, 13, 11.25, 13.25], "texture": "#0"},
"up": {"uv": [5.5, 13.75, 5, 12], "texture": "#0"},
"down": {"uv": [6, 12, 5.5, 13.75], "texture": "#0"}
}
},
{
"from": [9, 0, 0],
"to": [16, 1, 16],
"faces": {
"north": {"uv": [12.75, 13, 14.5, 13.25], "texture": "#0"},
"east": {"uv": [11, 4, 15, 4.25], "texture": "#0"},
"south": {"uv": [0.5, 13.25, 2.25, 13.5], "texture": "#0"},
"west": {"uv": [11, 4.25, 15, 4.5], "texture": "#0"},
"up": {"uv": [3.5, 8, 1.75, 4], "texture": "#0"},
"down": {"uv": [5.25, 4, 3.5, 8], "texture": "#0"}
}
},
{
"from": [0, 1, 0],
"to": [1, 7, 16],
"faces": {
"north": {"uv": [10.25, 13.25, 10.5, 14.75], "texture": "#0"},
"east": {"uv": [7, 0, 11, 1.5], "texture": "#0"},
"south": {"uv": [10.5, 13.25, 10.75, 14.75], "texture": "#0"},
"west": {"uv": [7, 1.5, 11, 3], "texture": "#0"},
"up": {"uv": [11.25, 8.5, 11, 4.5], "texture": "#0"},
"down": {"uv": [11.5, 4.5, 11.25, 8.5], "texture": "#0"}
}
},
{
"from": [0, 7, 13],
"to": [1, 9, 16],
"faces": {
"north": {"uv": [6.75, 8, 7, 8.5], "texture": "#0"},
"east": {"uv": [4, 8, 5.75, 8.5], "texture": "#0"},
"south": {"uv": [5.75, 8.5, 6, 9], "texture": "#0"},
"west": {"uv": [4, 8.5, 5.75, 9], "texture": "#0"},
"up": {"uv": [2.5, 14.75, 2.25, 13], "texture": "#0"},
"down": {"uv": [2.75, 13, 2.5, 14.75], "texture": "#0"}
}
},
{
"from": [0, 9, 0],
"to": [1, 15, 16],
"faces": {
"north": {"uv": [10.75, 13.25, 11, 14.75], "texture": "#0"},
"east": {"uv": [7, 3, 11, 4.5], "texture": "#0"},
"south": {"uv": [11, 13.25, 11.25, 14.75], "texture": "#0"},
"west": {"uv": [7, 4.5, 11, 6], "texture": "#0"},
"up": {"uv": [11.75, 8.5, 11.5, 4.5], "texture": "#0"},
"down": {"uv": [12, 4.5, 11.75, 8.5], "texture": "#0"}
}
},
{
"from": [0, 7, 0],
"to": [1, 9, 7],
"faces": {
"north": {"uv": [6, 8.5, 6.25, 9], "texture": "#0"},
"east": {"uv": [11.5, 9, 13.25, 9.5], "texture": "#0"},
"south": {"uv": [6.25, 8.5, 6.5, 9], "texture": "#0"},
"west": {"uv": [11.5, 9.5, 13.25, 10], "texture": "#0"},
"up": {"uv": [3, 14.75, 2.75, 13], "texture": "#0"},
"down": {"uv": [3.25, 13, 3, 14.75], "texture": "#0"}
}
},
{
"from": [15, 12, 0],
"to": [16, 15, 16],
"faces": {
"north": {"uv": [12.75, 13.25, 13, 14.75], "texture": "#0"},
"east": {"uv": [7, 6, 11, 7.5], "texture": "#0"},
"south": {"uv": [13, 13.25, 13.25, 14.75], "texture": "#0"},
"west": {"uv": [7, 7.5, 11, 9], "texture": "#0"},
"up": {"uv": [3.75, 16, 3.5, 12], "texture": "#0"},
"down": {"uv": [4, 12, 3.75, 16], "texture": "#0"}
}
},
{
"from": [15, 7, 12],
"to": [16, 12, 16],
"faces": {
"north": {"uv": [6.5, 8.5, 6.75, 9], "texture": "#0"},
"east": {"uv": [11.5, 10, 13.25, 10.5], "texture": "#0"},
"south": {"uv": [6.75, 8.5, 7, 9], "texture": "#0"},
"west": {"uv": [6, 12, 7.75, 12.5], "texture": "#0"},
"up": {"uv": [3.5, 14.75, 3.25, 13], "texture": "#0"},
"down": {"uv": [6.25, 13.25, 6, 15], "texture": "#0"}
}
},
{
"from": [15, 7, 0],
"to": [16, 12, 7],
"faces": {
"north": {"uv": [3.5, 9.5, 3.75, 10], "texture": "#0"},
"east": {"uv": [12, 6.25, 13.75, 6.75], "texture": "#0"},
"south": {"uv": [3.75, 9.5, 4, 10], "texture": "#0"},
"west": {"uv": [12, 6.75, 13.75, 7.25], "texture": "#0"},
"up": {"uv": [6.5, 15, 6.25, 13.25], "texture": "#0"},
"down": {"uv": [6.75, 13.25, 6.5, 15], "texture": "#0"}
}
},
{
"from": [15, 1, 0],
"to": [16, 7, 16],
"faces": {
"north": {"uv": [13.25, 13.25, 13.5, 14.75], "texture": "#0"},
"east": {"uv": [0, 8, 4, 9.5], "texture": "#0"},
"south": {"uv": [0.5, 13.5, 0.75, 15], "texture": "#0"},
"west": {"uv": [4, 9, 8, 10.5], "texture": "#0"},
"up": {"uv": [4.25, 16, 4, 12], "texture": "#0"},
"down": {"uv": [4.5, 12, 4.25, 16], "texture": "#0"}
}
},
{
"from": [1, 9, 0],
"to": [15, 15, 1],
"faces": {
"north": {"uv": [8, 9, 11.5, 10.5], "texture": "#0"},
"east": {"uv": [0.75, 13.5, 1, 15], "texture": "#0"},
"south": {"uv": [0, 9.5, 3.5, 11], "texture": "#0"},
"west": {"uv": [1, 13.5, 1.25, 15], "texture": "#0"},
"up": {"uv": [15.5, 7.5, 12, 7.25], "texture": "#0"},
"down": {"uv": [15.5, 7.5, 12, 7.75], "texture": "#0"}
}
},
{
"from": [9, 7, 0],
"to": [15, 9, 1],
"faces": {
"north": {"uv": [0.5, 12.5, 2, 13], "texture": "#0"},
"east": {"uv": [3.5, 10, 3.75, 10.5], "texture": "#0"},
"south": {"uv": [2, 12.5, 3.5, 13], "texture": "#0"},
"west": {"uv": [3.75, 10, 4, 10.5], "texture": "#0"},
"up": {"uv": [14.75, 10.25, 13.25, 10], "texture": "#0"},
"down": {"uv": [14.75, 10.25, 13.25, 10.5], "texture": "#0"}
}
},
{
"from": [1, 3, 0],
"to": [7, 9, 1],
"faces": {
"north": {"uv": [12.5, 4.5, 14, 5], "texture": "#0"},
"east": {"uv": [10.5, 12.5, 10.75, 13], "texture": "#0"},
"south": {"uv": [12.5, 5, 14, 5.5], "texture": "#0"},
"west": {"uv": [10.75, 12.5, 11, 13], "texture": "#0"},
"up": {"uv": [8.25, 13.75, 6.75, 13.5], "texture": "#0"},
"down": {"uv": [9.75, 13.5, 8.25, 13.75], "texture": "#0"}
}
},
{
"from": [1, 1, 0],
"to": [15, 3, 1],
"faces": {
"north": {"uv": [3.5, 10.5, 7, 12], "texture": "#0"},
"east": {"uv": [1.25, 13.5, 1.5, 15], "texture": "#0"},
"south": {"uv": [7, 10.5, 10.5, 12], "texture": "#0"},
"west": {"uv": [1.5, 13.5, 1.75, 15], "texture": "#0"},
"up": {"uv": [11.25, 12.25, 7.75, 12], "texture": "#0"},
"down": {"uv": [15.5, 7.75, 12, 8], "texture": "#0"}
}
},
{
"from": [1, 1, 15],
"to": [15, 5, 16],
"faces": {
"north": {"uv": [10.5, 10.5, 14, 12], "texture": "#0"},
"east": {"uv": [1.75, 13.5, 2, 15], "texture": "#0"},
"south": {"uv": [0, 11, 3.5, 12.5], "texture": "#0"},
"west": {"uv": [2, 13.5, 2.25, 15], "texture": "#0"},
"up": {"uv": [15.5, 8.25, 12, 8], "texture": "#0"},
"down": {"uv": [15.5, 8.25, 12, 8.5], "texture": "#0"}
}
},
{
"from": [1, 5, 15],
"to": [5, 11, 16],
"faces": {
"north": {"uv": [12.5, 5.5, 14, 6], "texture": "#0"},
"east": {"uv": [11, 12.5, 11.25, 13], "texture": "#0"},
"south": {"uv": [6, 12.5, 7.5, 13], "texture": "#0"},
"west": {"uv": [13.75, 6.5, 14, 7], "texture": "#0"},
"up": {"uv": [15, 13.5, 13.5, 13.25], "texture": "#0"},
"down": {"uv": [15, 13.5, 13.5, 13.75], "texture": "#0"}
}
},
{
"from": [11, 5, 15],
"to": [15, 11, 16],
"faces": {
"north": {"uv": [7.5, 12.5, 9, 13], "texture": "#0"},
"east": {"uv": [6.75, 13.75, 7, 14.25], "texture": "#0"},
"south": {"uv": [9, 12.5, 10.5, 13], "texture": "#0"},
"west": {"uv": [7, 13.75, 7.25, 14.25], "texture": "#0"},
"up": {"uv": [6, 14, 4.5, 13.75], "texture": "#0"},
"down": {"uv": [15.25, 6.25, 13.75, 6.5], "texture": "#0"}
}
},
{
"from": [1, 11, 15],
"to": [15, 15, 16],
"faces": {
"north": {"uv": [11, 0, 14.5, 1.5], "texture": "#0"},
"east": {"uv": [9.75, 13.5, 10, 15], "texture": "#0"},
"south": {"uv": [11, 1.5, 14.5, 3], "texture": "#0"},
"west": {"uv": [10, 13.5, 10.25, 15], "texture": "#0"},
"up": {"uv": [14.75, 12.25, 11.25, 12], "texture": "#0"},
"down": {"uv": [11.25, 12.25, 7.75, 12.5], "texture": "#0"}
}
},
{
"from": [7, 15, 9],
"to": [9, 16, 16],
"faces": {
"north": {"uv": [13.75, 7, 14.25, 7.25], "texture": "#0"},
"east": {"uv": [6.75, 13.25, 8.5, 13.5], "texture": "#0"},
"south": {"uv": [7.25, 13.75, 7.75, 14], "texture": "#0"},
"west": {"uv": [8.5, 13.25, 10.25, 13.5], "texture": "#0"},
"up": {"uv": [11.75, 14, 11.25, 12.25], "texture": "#0"},
"down": {"uv": [12.25, 12.25, 11.75, 14], "texture": "#0"}
}
},
{
"from": [7, 15, 0],
"to": [9, 16, 7],
"faces": {
"north": {"uv": [7.75, 13.75, 8.25, 14], "texture": "#0"},
"east": {"uv": [13.25, 9, 15, 9.25], "texture": "#0"},
"south": {"uv": [8.25, 13.75, 8.75, 14], "texture": "#0"},
"west": {"uv": [13.25, 9.25, 15, 9.5], "texture": "#0"},
"up": {"uv": [12.75, 14, 12.25, 12.25], "texture": "#0"},
"down": {"uv": [0.5, 12.5, 0, 14.25], "texture": "#0"}
}
},
{
"from": [0, 15, 0],
"to": [7, 16, 16],
"faces": {
"north": {"uv": [13.25, 9.5, 15, 9.75], "texture": "#0"},
"east": {"uv": [11, 8.5, 15, 8.75], "texture": "#0"},
"south": {"uv": [13.25, 9.75, 15, 10], "texture": "#0"},
"west": {"uv": [11, 8.75, 15, 9], "texture": "#0"},
"up": {"uv": [7, 4, 5.25, 0], "texture": "#0"},
"down": {"uv": [7, 4, 5.25, 8], "texture": "#0"}
}
},
{
"name": "inner",
"from": [1, 1, 1],
"to": [15, 15, 15],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#1"},
"east": {"uv": [0, 0, 16, 16], "texture": "#1"},
"south": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"},
"west": {"uv": [0, 0, 16, 16], "texture": "#1"},
"up": {"uv": [16, 16, 0, 0], "texture": "#1"},
"down": {"uv": [16, 0, 0, 16], "texture": "#1"}
}
}
],
"groups": [
{
"name": "Outer Panels",
"origin": [0, 0, 0],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
},
24
]
}

View file

@ -1,14 +1,16 @@
{
"credit": "Made with Blockbench",
"render_type": "minecraft:translucent",
"render_type": "minecraft:translucent",
"texture_size": [64, 64],
"textures": {
"0": "otemod:block/scrubber/scrubber_top"
"0": "otemod:block/scrubber/scrubber_top",
"1": "otemod:block/scrubber/scrubber_old_internal_cube",
"particle": "otemod:block/scrubber/scrubber_old_internal_cube"
},
"elements": [
{
"from": [0, 0, 0],
"to": [2, 2, 2],
"color": 2,
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -21,7 +23,6 @@
{
"from": [0, 0, 14],
"to": [2, 2, 16],
"color": 2,
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -32,9 +33,8 @@
}
},
{
"from": [0, 10, 0],
"to": [2, 12, 2],
"color": 2,
"from": [0, 14, 0],
"to": [2, 16, 2],
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -45,9 +45,8 @@
}
},
{
"from": [0, 10, 14],
"to": [2, 12, 16],
"color": 2,
"from": [0, 14, 14],
"to": [2, 16, 16],
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -59,8 +58,7 @@
},
{
"from": [0, 2, 0],
"to": [1, 10, 1],
"color": 7,
"to": [1, 14, 1],
"faces": {
"north": {"uv": [0, 0, 1, 8], "texture": "#0"},
"east": {"uv": [0, 0, 1, 8], "texture": "#0"},
@ -72,8 +70,7 @@
},
{
"from": [0, 2, 15],
"to": [1, 10, 16],
"color": 7,
"to": [1, 14, 16],
"faces": {
"north": {"uv": [0, 0, 1, 8], "texture": "#0"},
"east": {"uv": [0, 0, 1, 8], "texture": "#0"},
@ -86,7 +83,6 @@
{
"from": [0, 0, 2],
"to": [1, 1, 14],
"color": 7,
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#0"},
"east": {"uv": [0, 0, 12, 1], "texture": "#0"},
@ -97,9 +93,8 @@
}
},
{
"from": [0, 11, 2],
"to": [1, 12, 14],
"color": 7,
"from": [0, 15, 2],
"to": [1, 16, 14],
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#0"},
"east": {"uv": [0, 0, 12, 1], "texture": "#0"},
@ -112,7 +107,6 @@
{
"from": [14, 0, 14],
"to": [16, 2, 16],
"color": 2,
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -125,7 +119,6 @@
{
"from": [14, 0, 0],
"to": [16, 2, 2],
"color": 2,
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -136,9 +129,8 @@
}
},
{
"from": [14, 10, 14],
"to": [16, 12, 16],
"color": 2,
"from": [14, 14, 14],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -149,9 +141,8 @@
}
},
{
"from": [14, 10, 0],
"to": [16, 12, 2],
"color": 2,
"from": [14, 14, 0],
"to": [16, 16, 2],
"faces": {
"north": {"uv": [0, 0, 2, 2], "texture": "#0"},
"east": {"uv": [0, 0, 2, 2], "texture": "#0"},
@ -163,8 +154,7 @@
},
{
"from": [15, 2, 15],
"to": [16, 10, 16],
"color": 7,
"to": [16, 14, 16],
"faces": {
"north": {"uv": [0, 0, 1, 8], "texture": "#0"},
"east": {"uv": [0, 0, 1, 8], "texture": "#0"},
@ -177,7 +167,6 @@
{
"from": [2, 0, 15],
"to": [14, 1, 16],
"color": 7,
"faces": {
"north": {"uv": [0, 0, 12, 1], "texture": "#0"},
"east": {"uv": [0, 0, 1, 1], "texture": "#0"},
@ -188,9 +177,8 @@
}
},
{
"from": [2, 11, 15],
"to": [14, 12, 16],
"color": 7,
"from": [2, 15, 15],
"to": [14, 16, 16],
"faces": {
"north": {"uv": [0, 0, 12, 1], "texture": "#0"},
"east": {"uv": [0, 0, 1, 1], "texture": "#0"},
@ -201,9 +189,8 @@
}
},
{
"from": [2, 11, 0],
"to": [14, 12, 1],
"color": 7,
"from": [2, 15, 0],
"to": [14, 16, 1],
"faces": {
"north": {"uv": [0, 0, 12, 1], "texture": "#0"},
"east": {"uv": [0, 0, 1, 1], "texture": "#0"},
@ -216,7 +203,6 @@
{
"from": [2, 0, 0],
"to": [14, 1, 1],
"color": 7,
"faces": {
"north": {"uv": [0, 0, 12, 1], "texture": "#0"},
"east": {"uv": [0, 0, 1, 1], "texture": "#0"},
@ -228,8 +214,7 @@
},
{
"from": [15, 2, 0],
"to": [16, 10, 1],
"color": 7,
"to": [16, 14, 1],
"faces": {
"north": {"uv": [0, 0, 1, 8], "texture": "#0"},
"east": {"uv": [0, 0, 1, 8], "texture": "#0"},
@ -242,7 +227,6 @@
{
"from": [15, 0, 2],
"to": [16, 1, 14],
"color": 7,
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#0"},
"east": {"uv": [0, 0, 12, 1], "texture": "#0"},
@ -253,9 +237,8 @@
}
},
{
"from": [15, 11, 2],
"to": [16, 12, 14],
"color": 7,
"from": [15, 15, 2],
"to": [16, 16, 14],
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#0"},
"east": {"uv": [0, 0, 12, 1], "texture": "#0"},
@ -264,6 +247,28 @@
"up": {"uv": [0, 0, 1, 12], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 0, 1, 12], "rotation": 180, "texture": "#0"}
}
},
{
"name": "internal",
"from": [2, 2, 2],
"to": [14, 14, 14],
"faces": {
"north": {"uv": [0, 0, 3, 3], "texture": "#1"},
"east": {"uv": [0, 3, 3, 6], "texture": "#1"},
"south": {"uv": [3, 0, 6, 3], "texture": "#1"},
"west": {"uv": [3, 3, 6, 6], "texture": "#1"},
"up": {"uv": [3, 9, 0, 6], "texture": "#1"},
"down": {"uv": [9, 0, 6, 3], "texture": "#1"}
}
}
],
"groups": [
{
"name": "scrubber",
"origin": [0, 0, 0],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
},
20
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,321 @@
{
"credit": "Made with Blockbench",
"render_type": "minecraft:translucent",
"textures": {
"0": "otemod:block/scrubber/stable_singularity_body",
"1": "otemod:block/scrubber/stable_singularity_inner",
"particle": "otemod:block/scrubber/stable_singularity_body"
},
"elements": [
{
"from": [10, 14, 2],
"to": [14, 15, 14],
"faces": {
"north": {"uv": [12.5, 6, 14.25, 6.25], "texture": "#0"},
"east": {"uv": [11, 3, 15, 3.25], "texture": "#0"},
"south": {"uv": [12.75, 12.25, 14.5, 12.5], "texture": "#0"},
"west": {"uv": [11, 3.25, 15, 3.5], "texture": "#0"},
"up": {"uv": [1.75, 4, 0, 0], "texture": "#0"},
"down": {"uv": [3.5, 0, 1.75, 4], "texture": "#0"}
}
},
{
"from": [1, 0, 1],
"to": [6, 1, 15],
"faces": {
"north": {"uv": [12.75, 12.5, 14.5, 12.75], "texture": "#0"},
"east": {"uv": [11, 3.5, 15, 3.75], "texture": "#0"},
"south": {"uv": [12.75, 12.75, 14.5, 13], "texture": "#0"},
"west": {"uv": [11, 3.75, 15, 4], "texture": "#0"},
"up": {"uv": [5.25, 4, 3.5, 0], "texture": "#0"},
"down": {"uv": [1.75, 4, 0, 8], "texture": "#0"}
}
},
{
"from": [6, 0, 1],
"to": [10, 1, 6],
"faces": {
"north": {"uv": [5.75, 8, 6.25, 8.25], "texture": "#0"},
"east": {"uv": [0.5, 13, 2.25, 13.25], "texture": "#0"},
"south": {"uv": [6.25, 8, 6.75, 8.25], "texture": "#0"},
"west": {"uv": [6, 13, 7.75, 13.25], "texture": "#0"},
"up": {"uv": [5, 13.75, 4.5, 12], "texture": "#0"},
"down": {"uv": [12.5, 4.5, 12, 6.25], "texture": "#0"}
}
},
{
"from": [6, 0, 10],
"to": [10, 1, 15],
"faces": {
"north": {"uv": [5.75, 8.25, 6.25, 8.5], "texture": "#0"},
"east": {"uv": [7.75, 13, 9.5, 13.25], "texture": "#0"},
"south": {"uv": [6.25, 8.25, 6.75, 8.5], "texture": "#0"},
"west": {"uv": [9.5, 13, 11.25, 13.25], "texture": "#0"},
"up": {"uv": [5.5, 13.75, 5, 12], "texture": "#0"},
"down": {"uv": [6, 12, 5.5, 13.75], "texture": "#0"}
}
},
{
"from": [10, 0, 1],
"to": [15, 1, 15],
"faces": {
"north": {"uv": [12.75, 13, 14.5, 13.25], "texture": "#0"},
"east": {"uv": [11, 4, 15, 4.25], "texture": "#0"},
"south": {"uv": [0.5, 13.25, 2.25, 13.5], "texture": "#0"},
"west": {"uv": [11, 4.25, 15, 4.5], "texture": "#0"},
"up": {"uv": [3.5, 8, 1.75, 4], "texture": "#0"},
"down": {"uv": [5.25, 4, 3.5, 8], "texture": "#0"}
}
},
{
"from": [1, 1, 2],
"to": [2, 6, 15],
"faces": {
"north": {"uv": [10.25, 13.25, 10.5, 14.75], "texture": "#0"},
"east": {"uv": [7, 0, 11, 1.5], "texture": "#0"},
"south": {"uv": [10.5, 13.25, 10.75, 14.75], "texture": "#0"},
"west": {"uv": [7, 1.5, 11, 3], "texture": "#0"},
"up": {"uv": [11.25, 8.5, 11, 4.5], "texture": "#0"},
"down": {"uv": [11.5, 4.5, 11.25, 8.5], "texture": "#0"}
}
},
{
"from": [1, 6, 11],
"to": [2, 10, 15],
"faces": {
"north": {"uv": [6.75, 8, 7, 8.5], "texture": "#0"},
"east": {"uv": [4, 8, 5.75, 8.5], "texture": "#0"},
"south": {"uv": [5.75, 8.5, 6, 9], "texture": "#0"},
"west": {"uv": [4, 8.5, 5.75, 9], "texture": "#0"},
"up": {"uv": [2.5, 14.75, 2.25, 13], "texture": "#0"},
"down": {"uv": [2.75, 13, 2.5, 14.75], "texture": "#0"}
}
},
{
"from": [1, 10, 2],
"to": [2, 15, 15],
"faces": {
"north": {"uv": [10.75, 13.25, 11, 14.75], "texture": "#0"},
"east": {"uv": [7, 3, 11, 4.5], "texture": "#0"},
"south": {"uv": [11, 13.25, 11.25, 14.75], "texture": "#0"},
"west": {"uv": [7, 4.5, 11, 6], "texture": "#0"},
"up": {"uv": [11.75, 8.5, 11.5, 4.5], "texture": "#0"},
"down": {"uv": [12, 4.5, 11.75, 8.5], "texture": "#0"}
}
},
{
"from": [1, 6, 2],
"to": [2, 10, 6],
"faces": {
"north": {"uv": [6, 8.5, 6.25, 9], "texture": "#0"},
"east": {"uv": [11.5, 9, 13.25, 9.5], "texture": "#0"},
"south": {"uv": [6.25, 8.5, 6.5, 9], "texture": "#0"},
"west": {"uv": [11.5, 9.5, 13.25, 10], "texture": "#0"},
"up": {"uv": [3, 14.75, 2.75, 13], "texture": "#0"},
"down": {"uv": [3.25, 13, 3, 14.75], "texture": "#0"}
}
},
{
"from": [14, 10, 1],
"to": [15, 15, 15],
"faces": {
"north": {"uv": [12.75, 13.25, 13, 14.75], "texture": "#0"},
"east": {"uv": [7, 6, 11, 7.5], "texture": "#0"},
"south": {"uv": [13, 13.25, 13.25, 14.75], "texture": "#0"},
"west": {"uv": [7, 7.5, 11, 9], "texture": "#0"},
"up": {"uv": [3.75, 16, 3.5, 12], "texture": "#0"},
"down": {"uv": [4, 12, 3.75, 16], "texture": "#0"}
}
},
{
"from": [14, 6, 10],
"to": [15, 10, 15],
"faces": {
"north": {"uv": [6.5, 8.5, 6.75, 9], "texture": "#0"},
"east": {"uv": [11.5, 10, 13.25, 10.5], "texture": "#0"},
"south": {"uv": [6.75, 8.5, 7, 9], "texture": "#0"},
"west": {"uv": [6, 12, 7.75, 12.5], "texture": "#0"},
"up": {"uv": [3.5, 14.75, 3.25, 13], "texture": "#0"},
"down": {"uv": [6.25, 13.25, 6, 15], "texture": "#0"}
}
},
{
"from": [14, 6, 1],
"to": [15, 10, 6],
"faces": {
"north": {"uv": [3.5, 9.5, 3.75, 10], "texture": "#0"},
"east": {"uv": [12, 6.25, 13.75, 6.75], "texture": "#0"},
"south": {"uv": [3.75, 9.5, 4, 10], "texture": "#0"},
"west": {"uv": [12, 6.75, 13.75, 7.25], "texture": "#0"},
"up": {"uv": [6.5, 15, 6.25, 13.25], "texture": "#0"},
"down": {"uv": [6.75, 13.25, 6.5, 15], "texture": "#0"}
}
},
{
"from": [14, 1, 1],
"to": [15, 6, 15],
"faces": {
"north": {"uv": [13.25, 13.25, 13.5, 14.75], "texture": "#0"},
"east": {"uv": [0, 8, 4, 9.5], "texture": "#0"},
"south": {"uv": [0.5, 13.5, 0.75, 15], "texture": "#0"},
"west": {"uv": [4, 9, 8, 10.5], "texture": "#0"},
"up": {"uv": [4.25, 16, 4, 12], "texture": "#0"},
"down": {"uv": [4.5, 12, 4.25, 16], "texture": "#0"}
}
},
{
"from": [1, 10, 1],
"to": [14, 15, 2],
"faces": {
"north": {"uv": [8, 9, 11.5, 10.5], "texture": "#0"},
"east": {"uv": [0.75, 13.5, 1, 15], "texture": "#0"},
"south": {"uv": [0, 9.5, 3.5, 11], "texture": "#0"},
"west": {"uv": [1, 13.5, 1.25, 15], "texture": "#0"},
"up": {"uv": [15.5, 7.5, 12, 7.25], "texture": "#0"},
"down": {"uv": [15.5, 7.5, 12, 7.75], "texture": "#0"}
}
},
{
"from": [9, 6, 1],
"to": [14, 10, 2],
"faces": {
"north": {"uv": [0.5, 12.5, 2, 13], "texture": "#0"},
"east": {"uv": [3.5, 10, 3.75, 10.5], "texture": "#0"},
"south": {"uv": [2, 12.5, 3.5, 13], "texture": "#0"},
"west": {"uv": [3.75, 10, 4, 10.5], "texture": "#0"},
"up": {"uv": [14.75, 10.25, 13.25, 10], "texture": "#0"},
"down": {"uv": [14.75, 10.25, 13.25, 10.5], "texture": "#0"}
}
},
{
"from": [1, 6, 1],
"to": [5, 10, 2],
"faces": {
"north": {"uv": [12.5, 4.5, 14, 5], "texture": "#0"},
"east": {"uv": [10.5, 12.5, 10.75, 13], "texture": "#0"},
"south": {"uv": [12.5, 5, 14, 5.5], "texture": "#0"},
"west": {"uv": [10.75, 12.5, 11, 13], "texture": "#0"},
"up": {"uv": [8.25, 13.75, 6.75, 13.5], "texture": "#0"},
"down": {"uv": [9.75, 13.5, 8.25, 13.75], "texture": "#0"}
}
},
{
"from": [1, 1, 1],
"to": [14, 6, 2],
"faces": {
"north": {"uv": [3.5, 10.5, 7, 12], "texture": "#0"},
"east": {"uv": [1.25, 13.5, 1.5, 15], "texture": "#0"},
"south": {"uv": [7, 10.5, 10.5, 12], "texture": "#0"},
"west": {"uv": [1.5, 13.5, 1.75, 15], "texture": "#0"},
"up": {"uv": [11.25, 12.25, 7.75, 12], "texture": "#0"},
"down": {"uv": [15.5, 7.75, 12, 8], "texture": "#0"}
}
},
{
"from": [2, 1, 15],
"to": [14, 6, 15],
"faces": {
"north": {"uv": [10.5, 10.5, 14, 12], "texture": "#0"},
"east": {"uv": [1.75, 13.5, 2, 15], "texture": "#0"},
"south": {"uv": [0, 11, 3.5, 12.5], "texture": "#0"},
"west": {"uv": [2, 13.5, 2.25, 15], "texture": "#0"},
"up": {"uv": [15.5, 8.25, 12, 8], "texture": "#0"},
"down": {"uv": [15.5, 8.25, 12, 8.5], "texture": "#0"}
}
},
{
"from": [2, 6, 14],
"to": [6, 10, 15],
"faces": {
"north": {"uv": [12.5, 5.5, 14, 6], "texture": "#0"},
"east": {"uv": [11, 12.5, 11.25, 13], "texture": "#0"},
"south": {"uv": [6, 12.5, 7.5, 13], "texture": "#0"},
"west": {"uv": [13.75, 6.5, 14, 7], "texture": "#0"},
"up": {"uv": [15, 13.5, 13.5, 13.25], "texture": "#0"},
"down": {"uv": [15, 13.5, 13.5, 13.75], "texture": "#0"}
}
},
{
"from": [10, 6, 14],
"to": [14, 10, 15],
"faces": {
"north": {"uv": [7.5, 12.5, 9, 13], "texture": "#0"},
"east": {"uv": [6.75, 13.75, 7, 14.25], "texture": "#0"},
"south": {"uv": [9, 12.5, 10.5, 13], "texture": "#0"},
"west": {"uv": [7, 13.75, 7.25, 14.25], "texture": "#0"},
"up": {"uv": [6, 14, 4.5, 13.75], "texture": "#0"},
"down": {"uv": [15.25, 6.25, 13.75, 6.5], "texture": "#0"}
}
},
{
"from": [2, 10, 14],
"to": [14, 15, 15],
"faces": {
"north": {"uv": [11, 0, 14.5, 1.5], "texture": "#0"},
"east": {"uv": [9.75, 13.5, 10, 15], "texture": "#0"},
"south": {"uv": [11, 1.5, 14.5, 3], "texture": "#0"},
"west": {"uv": [10, 13.5, 10.25, 15], "texture": "#0"},
"up": {"uv": [14.75, 12.25, 11.25, 12], "texture": "#0"},
"down": {"uv": [11.25, 12.25, 7.75, 12.5], "texture": "#0"}
}
},
{
"from": [6, 14, 10],
"to": [10, 15, 14],
"faces": {
"north": {"uv": [13.75, 7, 14.25, 7.25], "texture": "#0"},
"east": {"uv": [6.75, 13.25, 8.5, 13.5], "texture": "#0"},
"south": {"uv": [7.25, 13.75, 7.75, 14], "texture": "#0"},
"west": {"uv": [8.5, 13.25, 10.25, 13.5], "texture": "#0"},
"up": {"uv": [11.75, 14, 11.25, 12.25], "texture": "#0"},
"down": {"uv": [12.25, 12.25, 11.75, 14], "texture": "#0"}
}
},
{
"from": [6, 14, 2],
"to": [10, 15, 6],
"faces": {
"north": {"uv": [7.75, 13.75, 8.25, 14], "texture": "#0"},
"east": {"uv": [13.25, 9, 15, 9.25], "texture": "#0"},
"south": {"uv": [8.25, 13.75, 8.75, 14], "texture": "#0"},
"west": {"uv": [13.25, 9.25, 15, 9.5], "texture": "#0"},
"up": {"uv": [12.75, 14, 12.25, 12.25], "texture": "#0"},
"down": {"uv": [0.5, 12.5, 0, 14.25], "texture": "#0"}
}
},
{
"from": [2, 14, 2],
"to": [6, 15, 14],
"faces": {
"north": {"uv": [13.25, 9.5, 15, 9.75], "texture": "#0"},
"east": {"uv": [11, 8.5, 15, 8.75], "texture": "#0"},
"south": {"uv": [13.25, 9.75, 15, 10], "texture": "#0"},
"west": {"uv": [11, 8.75, 15, 9], "texture": "#0"},
"up": {"uv": [7, 4, 5.25, 0], "texture": "#0"},
"down": {"uv": [7, 4, 5.25, 8], "texture": "#0"}
}
},
{
"name": "inner",
"from": [2, 1, 2],
"to": [14, 13, 14],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#1"},
"east": {"uv": [0, 0, 16, 16], "texture": "#1"},
"south": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"},
"west": {"uv": [0, 0, 16, 16], "texture": "#1"},
"up": {"uv": [16, 16, 0, 0], "texture": "#1"},
"down": {"uv": [16, 0, 0, 16], "texture": "#1"}
}
}
],
"groups": [
{
"name": "Outer Panels",
"origin": [0, 0, 0],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
},
24
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "otemod:item/eternium_ingot"
}
}

View file

@ -1,6 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "otemod:item/eternium_dust"
"layer0": "otemod:item/eternium_rod"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "otemod:block/magical_scrubber"
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "otemod:item/melted_nether_star"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "otemod:item/scrubber_frame"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "otemod:item/scrubber_frame_piece"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "otemod:item/singularity"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "otemod:block/stable_singularity"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 B

View file

@ -1,5 +1,6 @@
{
"values": [
"#forge:ores/cobalt"
"#forge:ores/cobalt",
"#forge:ores/eternium"
]
}

View file

@ -0,0 +1,6 @@
{
"values": [
"otemod:eternium_ore_block",
"otemod:deepslate_eternium_ore_block"
]
}

View file

@ -1,5 +1,6 @@
{
"values": [
"#forge:ingots/cobalt"
"#forge:ingots/cobalt",
"#forge:ingots/eternium"
]
}

View file

@ -0,0 +1,5 @@
{
"values": [
"otemod:eternium_ingot"
]
}

View file

@ -1,5 +1,6 @@
{
"values": [
"#forge:raw_materials/cobalt"
"#forge:raw_materials/cobalt",
"#forge:raw_materials/eternium"
]
}

View file

@ -0,0 +1,5 @@
{
"values": [
"otemod:eternium_ore"
]
}

View file

@ -0,0 +1,5 @@
{
"values": [
"#forge:rods/eternium"
]
}

View file

@ -0,0 +1,5 @@
{
"values": [
"otemod:eternium_rod"
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "otemod:magical_scrubber"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "otemod:stable_singularity"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -1,9 +1,9 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"CC ",
"CC ",
"CC "
"CC",
"CC",
"CC"
],
"key": {
"C": {

View file

@ -1,10 +0,0 @@
{
"type": "minecraft:blasting",
"ingredient": {
"item": "otemod:eternium_fragment"
},
"result": "otemod:eternium_dust",
"experience": 25,
"cookingtime": 60
}

View file

@ -9,12 +9,9 @@
},
{
"item": "otemod:deepslate_eternium_ore_block"
},
{
"item": "otemod:eternium_dust"
}
],
"result": "otemod:eternium_fragment",
"result": "otemod:eternium_ingot",
"experience": 0.5,
"cookingtime": 25
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:crafting_shaped",
"pattern":
[
"ccc",
"ggg",
"ccc"],
"key": {
"c": {
"item": "minecraft:obsidian"
},
"g": {
"tag": "forge:ingots/eternium"
}
},
"result": {
"item": "otemod:eternium_rod",
"count": 2
}
}

View file

@ -2,16 +2,16 @@
"type": "minecraft:crafting_shaped",
"key": {
"A": {
"tag": "forge:unusual/experience_blocks"
"item": "otemod:scrubber_frame"
},
"B": {
"tag": "forge:ingots/cobalt"
"item": "otemod:singularity"
}
},
"pattern": [
"AAA",
"ABA",
"B B",
"ABA"
"AAA"
],
"result":{
"item": "otemod:item_scrubber"

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"A": {
"item": "otemod:scrubber_frame"
},
"B": {
"item": "otemod:item_scrubber"
}
},
"pattern": [
"AAA",
"ABA",
"AAA"
],
"result":{
"item": "otemod:magical_scrubber"
}
}

View file

@ -0,0 +1,11 @@
{
"type": "minecraft:smelting",
"ingredient": [
{
"item": "minecraft:nether_star"
}
],
"result": "otemod:melted_nether_star",
"experience": 3,
"cookingtime": 60
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
" c ",
"r r",
" c "
],
"key": {
"c": {
"item": "otemod:scrubber_frame_piece"
},
"r": {
"tag": "forge:rods/eternium"
}
},
"result": {
"item": "otemod:scrubber_frame",
"count": 1
}
}

View file

@ -0,0 +1,16 @@
{
"type": "minecraft:crafting_shaped",
"pattern": ["cgc"],
"key": {
"c": {
"item": "otemod:stable_singularity"
},
"g": {
"tag": "forge:rods/eternium"
}
},
"result": {
"item": "otemod:scrubber_frame_piece",
"count": 1
}
}

View file

@ -0,0 +1,13 @@
{
"type": "minecraft:crafting_shaped",
"pattern": ["ccc", "c c", "ccc"],
"key": {
"c": {
"item": "otemod:melted_nether_star"
}
},
"result": {
"item": "otemod:singularity",
"count": 1
}
}

View file

@ -0,0 +1,16 @@
{
"type": "minecraft:crafting_shaped",
"pattern": ["ccc", "cbc", "ccc"],
"key": {
"c": {
"item": "minecraft:obsidian"
},
"b": {
"item": "otemod:singularity"
}
},
"result": {
"item": "otemod:stable_singularity",
"count": 1
}
}