Compare commits

...

11 Commits

76 changed files with 338 additions and 150 deletions

1
.gitignore vendored
View File

@ -32,3 +32,4 @@ forge*changelog.txt
shapegen_output.java shapegen_output.java
/runs /runs
/.kotlin

View File

@ -15,7 +15,6 @@ import ru.dbotthepony.mc.otm.capability.matter.IReplicationTaskProvider;
import ru.dbotthepony.mc.otm.capability.matter.IPatternStorage; import ru.dbotthepony.mc.otm.capability.matter.IPatternStorage;
import ru.dbotthepony.mc.otm.graph.matter.MatterNode; import ru.dbotthepony.mc.otm.graph.matter.MatterNode;
import ru.dbotthepony.mc.otm.graph.storage.StorageNode; import ru.dbotthepony.mc.otm.graph.storage.StorageNode;
import ru.dbotthepony.mc.otm.storage.StorageStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@ -70,4 +69,8 @@ public class MatteryCapability {
@Nonnull @Nonnull
@NotNull @NotNull
public static final ItemCapability<IMatteryUpgrade, Void> UPGRADE = ItemCapability.createVoid(ResourceLocation.fromNamespaceAndPath(OverdriveThatMatters.MOD_ID, "machine_upgrade"), IMatteryUpgrade.class); public static final ItemCapability<IMatteryUpgrade, Void> UPGRADE = ItemCapability.createVoid(ResourceLocation.fromNamespaceAndPath(OverdriveThatMatters.MOD_ID, "machine_upgrade"), IMatteryUpgrade.class);
@Nonnull
@NotNull
public static final BlockCapability<IQuickStackContainer, Void> QUICK_STACK_CONTAINER = BlockCapability.createVoid(ResourceLocation.fromNamespaceAndPath(OverdriveThatMatters.MOD_ID, "quick_stack_container"), IQuickStackContainer.class);
} }

View File

@ -118,7 +118,7 @@ val isPaused: Boolean get() {
return isPausedImpl return isPausedImpl
} }
fun recordClientThread() { internal fun recordClientThread() {
clientThreads.add(Thread.currentThread()) clientThreads.add(Thread.currentThread())
} }
@ -186,19 +186,19 @@ var SERVER_IS_LIVE = false
private val LOGGER = LogManager.getLogger() private val LOGGER = LogManager.getLogger()
fun onServerTickPre(event: ServerTickEvent.Pre) { internal fun onServerTickPre(event: ServerTickEvent.Pre) {
preServerTick.tick() preServerTick.tick()
serverThreads.add(Thread.currentThread()) serverThreads.add(Thread.currentThread())
} }
fun onServerTickPost(event: ServerTickEvent.Post) { internal fun onServerTickPost(event: ServerTickEvent.Post) {
postServerTick.tick() postServerTick.tick()
// чтоб не плодить кучу подписчиков, вызовем напрямую отсюда // чтоб не плодить кучу подписчиков, вызовем напрямую отсюда
GraphNodeList.tick() GraphNodeList.tick()
AbstractProfiledStorage.onServerPostTick() AbstractProfiledStorage.onServerPostTick()
} }
fun onLevelTickPre(event: LevelTickEvent.Pre) { internal fun onLevelTickPre(event: LevelTickEvent.Pre) {
preWorldTick[event.level]?.tick() preWorldTick[event.level]?.tick()
if (event.level.isClientSide) { if (event.level.isClientSide) {
@ -208,7 +208,7 @@ fun onLevelTickPre(event: LevelTickEvent.Pre) {
} }
} }
fun onLevelTickPost(event: LevelTickEvent.Post) { internal fun onLevelTickPost(event: LevelTickEvent.Post) {
postWorldTick[event.level]?.tick() postWorldTick[event.level]?.tick()
} }
@ -310,7 +310,7 @@ private fun clear() {
postWorldTick.clear() postWorldTick.clear()
} }
fun onServerStarting(event: ServerAboutToStartEvent) { internal fun onServerStarting(event: ServerAboutToStartEvent) {
clear() clear()
SERVER_IS_LIVE = true SERVER_IS_LIVE = true
_server = event.server _server = event.server
@ -318,13 +318,13 @@ fun onServerStarting(event: ServerAboutToStartEvent) {
serverCounter.incrementAndGet() serverCounter.incrementAndGet()
} }
fun onServerStopping(event: ServerStoppingEvent) { internal fun onServerStopping(event: ServerStoppingEvent) {
clear() clear()
SERVER_IS_LIVE = false SERVER_IS_LIVE = false
serverCounter.incrementAndGet() serverCounter.incrementAndGet()
} }
fun onServerStopped(event: ServerStoppedEvent) { internal fun onServerStopped(event: ServerStoppedEvent) {
if (SERVER_IS_LIVE) { if (SERVER_IS_LIVE) {
LOGGER.fatal("ServerStoppingEvent did not fire. If server has crashed this is normal. However, if server finished it's work 'gracefully' this is a bug!") LOGGER.fatal("ServerStoppingEvent did not fire. If server has crashed this is normal. However, if server finished it's work 'gracefully' this is a bug!")

View File

@ -154,7 +154,6 @@ object OverdriveThatMatters {
MOD_BUS.addListener(EventPriority.NORMAL, TritaniumArmorModel::register) MOD_BUS.addListener(EventPriority.NORMAL, TritaniumArmorModel::register)
MOD_BUS.addListener(EventPriority.NORMAL, GravitationStabilizerModel::register) MOD_BUS.addListener(EventPriority.NORMAL, GravitationStabilizerModel::register)
MOD_BUS.addListener(EventPriority.NORMAL, BreadMonsterModel::register) MOD_BUS.addListener(EventPriority.NORMAL, BreadMonsterModel::register)
MOD_BUS.addListener(EventPriority.NORMAL, MCreativeTabs::register)
MOD_BUS.addListener(EventPriority.NORMAL, BatteryBankRenderer.Companion::onRegisterAdditionalModels) MOD_BUS.addListener(EventPriority.NORMAL, BatteryBankRenderer.Companion::onRegisterAdditionalModels)
MOD_BUS.addListener(EventPriority.NORMAL, MatterBatteryBankRenderer.Companion::onRegisterAdditionalModels) MOD_BUS.addListener(EventPriority.NORMAL, MatterBatteryBankRenderer.Companion::onRegisterAdditionalModels)

View File

@ -633,18 +633,18 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
} }
} }
fun onLevelUnload(event: LevelEvent.Unload) { internal fun onLevelUnload(event: LevelEvent.Unload) {
val level = event.level as? ServerLevel ?: return val level = event.level as? ServerLevel ?: return
playerMap.remove(level) playerMap.remove(level)
tickingMap.remove(level) tickingMap.remove(level)
} }
fun onServerStopping(event: ServerStoppingEvent) { internal fun onServerStopping(event: ServerStoppingEvent) {
playerMap.clear() playerMap.clear()
tickingMap.clear() tickingMap.clear()
} }
fun postLevelTick(event: LevelTickEvent.Post) { internal fun postLevelTick(event: LevelTickEvent.Post) {
val level = event.level as? ServerLevel ?: return val level = event.level as? ServerLevel ?: return
tickingMap[level]?.forEach { tickingMap[level]?.forEach {
@ -663,14 +663,14 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
} }
} }
fun onWatch(event: ChunkWatchEvent.Watch) { internal fun onWatch(event: ChunkWatchEvent.Watch) {
playerMap playerMap
.computeIfAbsent(event.level) { Long2ObjectOpenHashMap() } .computeIfAbsent(event.level) { Long2ObjectOpenHashMap() }
.computeIfAbsent(event.pos.toLong(), Long2ObjectFunction { ChunkSubscribers(event.level, it) }) .computeIfAbsent(event.pos.toLong(), Long2ObjectFunction { ChunkSubscribers(event.level, it) })
.subscribe(event.player) .subscribe(event.player)
} }
fun onForget(event: ChunkWatchEvent.UnWatch) { internal fun onForget(event: ChunkWatchEvent.UnWatch) {
val levelMap = playerMap[event.level] ?: return val levelMap = playerMap[event.level] ?: return
val subs = levelMap.get(event.pos.toLong()) ?: return val subs = levelMap.get(event.pos.toLong()) ?: return
@ -679,7 +679,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
} }
} }
fun playerDisconnected(event: PlayerEvent.PlayerLoggedOutEvent) { internal fun playerDisconnected(event: PlayerEvent.PlayerLoggedOutEvent) {
for (tree in playerMap.values) { for (tree in playerMap.values) {
tree.values.removeIf { tree.values.removeIf {
it.unsubscribe(event.entity as ServerPlayer) it.unsubscribe(event.entity as ServerPlayer)

View File

@ -29,11 +29,15 @@ import net.minecraft.world.phys.Vec3
import net.neoforged.neoforge.capabilities.Capabilities import net.neoforged.neoforge.capabilities.Capabilities
import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
import ru.dbotthepony.mc.otm.capability.IQuickStackContainer
import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.container.slotted.FilteredContainerSlot import ru.dbotthepony.mc.otm.container.slotted.FilteredContainerSlot
import ru.dbotthepony.mc.otm.container.slotted.SlottedContainer import ru.dbotthepony.mc.otm.container.slotted.SlottedContainer
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.otmRandom
import ru.dbotthepony.mc.otm.menu.MatteryMenuSlot
import ru.dbotthepony.mc.otm.menu.decorative.CargoCrateMenu import ru.dbotthepony.mc.otm.menu.decorative.CargoCrateMenu
import ru.dbotthepony.mc.otm.menu.makeSlots
import ru.dbotthepony.mc.otm.registry.game.MBlockEntities import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
import ru.dbotthepony.mc.otm.registry.game.MSoundEvents import ru.dbotthepony.mc.otm.registry.game.MSoundEvents
@ -57,6 +61,10 @@ class CargoCrateBlockEntity(
.build() .build()
.also(::addDroppableContainer) .also(::addDroppableContainer)
init {
exposeSideless(MatteryCapability.QUICK_STACK_CONTAINER, IQuickStackContainer.Simple(makeSlots(container, ::MatteryMenuSlot)))
}
private var interactingPlayers = 0 private var interactingPlayers = 0
override fun beforeDroppingItems(oldBlockState: BlockState, level: Level, blockPos: BlockPos, newBlockState: BlockState, movedByPiston: Boolean) { override fun beforeDroppingItems(oldBlockState: BlockState, level: Level, blockPos: BlockPos, newBlockState: BlockState, movedByPiston: Boolean) {

View File

@ -59,7 +59,7 @@ class DevChestBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB
return cache return cache
} }
fun mappingsChanged(event: IdMappingEvent) { internal fun mappingsChanged(event: IdMappingEvent) {
cache.clear() cache.clear()
} }
} }

View File

@ -0,0 +1,14 @@
package ru.dbotthepony.mc.otm.capability
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.inventory.Slot
interface IQuickStackContainer {
fun getSlotsFor(player: ServerPlayer): Collection<Slot>
class Simple(private val slots: Collection<Slot>) : IQuickStackContainer {
override fun getSlotsFor(player: ServerPlayer): Collection<Slot> {
return slots
}
}
}

View File

@ -118,7 +118,7 @@ object DrivePool {
} }
} }
fun onWorldSave(event: LevelEvent.Save) { internal fun onWorldSave(event: LevelEvent.Save) {
writeBacklog(event.level.server!!.registryAccess()) writeBacklog(event.level.server!!.registryAccess())
} }

View File

@ -46,7 +46,7 @@ object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConfl
} }
} }
fun onRenderGuiEvent(event: RenderGuiEvent.Post) { internal fun onRenderGuiEvent(event: RenderGuiEvent.Post) {
if (!isDown) { if (!isDown) {
return return
} }
@ -73,7 +73,7 @@ object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConfl
} }
} }
fun onRenderLevel(event: RenderLevelStageEvent) { internal fun onRenderLevel(event: RenderLevelStageEvent) {
if (!isDown) { if (!isDown) {
return return
} }
@ -92,7 +92,7 @@ object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConfl
} }
} }
fun register(event: RegisterKeyMappingsEvent) { internal fun register(event: RegisterKeyMappingsEvent) {
event.register(this) event.register(this)
} }
} }

View File

@ -94,7 +94,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
} }
} }
fun onMouseClick(event: InputEvent.MouseButton.Pre) { internal fun onMouseClick(event: InputEvent.MouseButton.Pre) {
// fix binding wheel menu to mouse button not calling back setIsDown(false) // fix binding wheel menu to mouse button not calling back setIsDown(false)
if (isDown && event.action == 0 && key.type == InputConstants.Type.MOUSE && InputConstants.Type.MOUSE.getOrCreate(event.button) == key) { if (isDown && event.action == 0 && key.type == InputConstants.Type.MOUSE && InputConstants.Type.MOUSE.getOrCreate(event.button) == key) {
isDown = false isDown = false
@ -311,7 +311,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
const val COOLDOWN_ICON_SIZE = 18f const val COOLDOWN_ICON_SIZE = 18f
const val COOLDOWN_ICON_MARGIN = 12f const val COOLDOWN_ICON_MARGIN = 12f
fun onRenderGuiEvent(event: RenderGuiEvent.Post) { internal fun onRenderGuiEvent(event: RenderGuiEvent.Post) {
if (!grabbedInput) { if (!grabbedInput) {
lastRender = milliTimeD lastRender = milliTimeD
renderRegular(event) renderRegular(event)
@ -325,7 +325,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
} }
} }
fun register(event: RegisterKeyMappingsEvent) { internal fun register(event: RegisterKeyMappingsEvent) {
event.register(this) event.register(this)
} }
} }

View File

@ -38,7 +38,7 @@ import ru.dbotthepony.mc.otm.menu.MatteryMenu
import ru.dbotthepony.mc.otm.registry.game.AndroidFeatures import ru.dbotthepony.mc.otm.registry.game.AndroidFeatures
import java.util.WeakHashMap import java.util.WeakHashMap
fun onMovementInputUpdate(event: MovementInputUpdateEvent) { internal fun onMovementInputUpdate(event: MovementInputUpdateEvent) {
val ply = event.entity val ply = event.entity
val input = event.input val input = event.input
@ -198,7 +198,7 @@ private fun exosuitInventoryLogic(screen: Screen, addListener: (GuiEventListener
scrollbar.scroll = inventoryScroll scrollbar.scroll = inventoryScroll
} }
fun onMouseDragged(event: ScreenEvent.MouseDragged.Pre) { internal fun onMouseDragged(event: ScreenEvent.MouseDragged.Pre) {
val screen = minecraft.screen as? AbstractContainerScreen<*> ?: return val screen = minecraft.screen as? AbstractContainerScreen<*> ?: return
if (screen is MatteryScreen<*>) if (screen is MatteryScreen<*>)
@ -214,7 +214,7 @@ fun onMouseDragged(event: ScreenEvent.MouseDragged.Pre) {
} }
} }
fun onMouseScrolled(event: ScreenEvent.MouseScrolled.Pre) { internal fun onMouseScrolled(event: ScreenEvent.MouseScrolled.Pre) {
val screen = minecraft.screen as? AbstractContainerScreen<*> ?: return val screen = minecraft.screen as? AbstractContainerScreen<*> ?: return
if (screen is MatteryScreen<*>) if (screen is MatteryScreen<*>)
@ -242,7 +242,7 @@ fun onMouseScrolled(event: ScreenEvent.MouseScrolled.Pre) {
} }
} }
fun onPostScreenInit(event: ScreenEvent.Init.Post) { internal fun onPostScreenInit(event: ScreenEvent.Init.Post) {
if (!LOGGED_IN) return if (!LOGGED_IN) return
inventoryLogic(event) inventoryLogic(event)
onceClient { onceClient {
@ -250,7 +250,7 @@ fun onPostScreenInit(event: ScreenEvent.Init.Post) {
} }
} }
fun onScreenOpen(event: ScreenEvent.Opening) { internal fun onScreenOpen(event: ScreenEvent.Opening) {
if (shouldOpenVanillaInventory || minecraft.player?.isCreative == true) { if (shouldOpenVanillaInventory || minecraft.player?.isCreative == true) {
return return
} }
@ -266,7 +266,7 @@ private val TOOLTIP_TAG_DISPLAY_HELP = TranslatableComponent("otm.gui.debug.tags
private val TOOLTIP_TAG_DISPLAY_ITEM_TITLE = TranslatableComponent("otm.gui.debug.tags.item.title").withStyle(ChatFormatting.DARK_GRAY) private val TOOLTIP_TAG_DISPLAY_ITEM_TITLE = TranslatableComponent("otm.gui.debug.tags.item.title").withStyle(ChatFormatting.DARK_GRAY)
private val TOOLTIP_TAG_DISPLAY_BLOCK_TITLE = TranslatableComponent("otm.gui.debug.tags.block.title").withStyle(ChatFormatting.DARK_GRAY) private val TOOLTIP_TAG_DISPLAY_BLOCK_TITLE = TranslatableComponent("otm.gui.debug.tags.block.title").withStyle(ChatFormatting.DARK_GRAY)
fun tooltipEvent(event: ItemTooltipEvent) { internal fun tooltipEvent(event: ItemTooltipEvent) {
if (event.flags.isAdvanced && ClientConfig.Tooltip.DISPLAY_TAGS && !event.itemStack.isEmpty) { if (event.flags.isAdvanced && ClientConfig.Tooltip.DISPLAY_TAGS && !event.itemStack.isEmpty) {
val itemTags = ArrayList<TagKey<Item>>() val itemTags = ArrayList<TagKey<Item>>()
if (event.itemStack.tags.count() > 0) { if (event.itemStack.tags.count() > 0) {

View File

@ -33,7 +33,7 @@ private inline fun check(cond: Boolean, error: () -> String) {
} }
} }
fun createCursors() { internal fun createCursors() {
ARROW_CURSOR = GLFW.glfwCreateStandardCursor(GLFW.GLFW_ARROW_CURSOR) ARROW_CURSOR = GLFW.glfwCreateStandardCursor(GLFW.GLFW_ARROW_CURSOR)
BEAM_CURSOR = GLFW.glfwCreateStandardCursor(GLFW.GLFW_IBEAM_CURSOR) BEAM_CURSOR = GLFW.glfwCreateStandardCursor(GLFW.GLFW_IBEAM_CURSOR)
HAND_CURSOR = GLFW.glfwCreateStandardCursor(GLFW.GLFW_POINTING_HAND_CURSOR) HAND_CURSOR = GLFW.glfwCreateStandardCursor(GLFW.GLFW_POINTING_HAND_CURSOR)
@ -60,7 +60,7 @@ enum class CursorType(val pointer: LongSupplier) {
} }
} }
fun onClientPostRender(event: RenderFrameEvent.Post) { internal fun onClientPostRender(event: RenderFrameEvent.Post) {
if (MODIFIED_CURSOR_FRAMES-- <= 0 && MODIFIED_CURSOR) { if (MODIFIED_CURSOR_FRAMES-- <= 0 && MODIFIED_CURSOR) {
GLFW.glfwSetCursor(minecraft.window.window, ARROW_CURSOR) GLFW.glfwSetCursor(minecraft.window.window, ARROW_CURSOR)
MODIFIED_CURSOR = false MODIFIED_CURSOR = false
@ -116,22 +116,22 @@ fun tickWhileClientPre(condition: () -> Boolean, ticker: () -> Unit) {
tickClientPre(IConditionalTickable.wrap(condition, ticker)) tickClientPre(IConditionalTickable.wrap(condition, ticker))
} }
fun onClientTickPre(event: ClientTickEvent.Pre) { internal fun onClientTickPre(event: ClientTickEvent.Pre) {
preTickList.tick() preTickList.tick()
} }
fun onClientTickPost(event: ClientTickEvent.Post) { internal fun onClientTickPost(event: ClientTickEvent.Post) {
postTickList.tick() postTickList.tick()
} }
fun onClientDisconnected(event: ClientPlayerNetworkEvent.LoggingOut) { internal fun onClientDisconnected(event: ClientPlayerNetworkEvent.LoggingOut) {
LOGGED_IN = false LOGGED_IN = false
preTickList.clear() preTickList.clear()
postTickList.clear() postTickList.clear()
} }
fun onClientConnected(event: ClientPlayerNetworkEvent.LoggingIn) { internal fun onClientConnected(event: ClientPlayerNetworkEvent.LoggingIn) {
LOGGED_IN = true LOGGED_IN = true
preTickList.clear() preTickList.clear()

View File

@ -48,7 +48,7 @@ object MatteryGUI {
private val buttonShaker = Random() private val buttonShaker = Random()
fun onScreenRender(event: ScreenEvent.Render.Pre) { internal fun onScreenRender(event: ScreenEvent.Render.Pre) {
val screen = minecraft.screen as? InBedChatScreen val screen = minecraft.screen as? InBedChatScreen
if (screen == null || (screen.leaveBedButton as Button?) == null) { if (screen == null || (screen.leaveBedButton as Button?) == null) {
@ -80,7 +80,7 @@ object MatteryGUI {
} }
} }
fun onOpenGUIEvent(event: ScreenEvent.Opening) { internal fun onOpenGUIEvent(event: ScreenEvent.Opening) {
originalBedButtonX = -1 originalBedButtonX = -1
originalBedButtonY = -1 originalBedButtonY = -1
@ -95,7 +95,7 @@ object MatteryGUI {
} }
} }
fun onLayerRenderEvent(event: RenderGuiLayerEvent.Pre) { internal fun onLayerRenderEvent(event: RenderGuiLayerEvent.Pre) {
if (minecraft.player?.matteryPlayer?.isAndroid == true) { if (minecraft.player?.matteryPlayer?.isAndroid == true) {
if (event.name == VanillaGuiLayers.FOOD_LEVEL if (event.name == VanillaGuiLayers.FOOD_LEVEL
|| event.name == VanillaGuiLayers.AIR_LEVEL || event.name == VanillaGuiLayers.AIR_LEVEL
@ -105,7 +105,7 @@ object MatteryGUI {
} }
} }
fun registerGuiLayers(event: RegisterGuiLayersEvent) { internal fun registerGuiLayers(event: RegisterGuiLayersEvent) {
event.registerBelow(VanillaGuiLayers.FOOD_LEVEL, loc("android_energy_bar"), AndroidEnergyBarLayer()) event.registerBelow(VanillaGuiLayers.FOOD_LEVEL, loc("android_energy_bar"), AndroidEnergyBarLayer())
event.registerBelow(VanillaGuiLayers.PLAYER_HEALTH, loc("android_health_bar"), AndroidHealthBarLayer()) event.registerBelow(VanillaGuiLayers.PLAYER_HEALTH, loc("android_health_bar"), AndroidHealthBarLayer())

View File

@ -17,7 +17,7 @@ import ru.dbotthepony.mc.otm.core.math.Decimal
import kotlin.math.ceil import kotlin.math.ceil
object MatteryTooltipComponents { object MatteryTooltipComponents {
fun gatherComponents(event: RenderTooltipEvent.GatherComponents) { internal fun gatherComponents(event: RenderTooltipEvent.GatherComponents) {
val energyCap = event.itemStack.getCapability(MatteryCapability.ITEM_ENERGY) val energyCap = event.itemStack.getCapability(MatteryCapability.ITEM_ENERGY)
if (energyCap != null && energyCap.maxBatteryLevel > Decimal.ZERO) { if (energyCap != null && energyCap.maxBatteryLevel > Decimal.ZERO) {
event.tooltipElements.add(1, Either.right(EnergyStorageGaugeTooltip(energyCap))) event.tooltipElements.add(1, Either.right(EnergyStorageGaugeTooltip(energyCap)))
@ -29,7 +29,7 @@ object MatteryTooltipComponents {
} }
} }
fun registerComponents(event: RegisterClientTooltipComponentFactoriesEvent) { internal fun registerComponents(event: RegisterClientTooltipComponentFactoriesEvent) {
event.register(EnergyStorageGaugeTooltip::class.java) { it } event.register(EnergyStorageGaugeTooltip::class.java) { it }
event.register(MatterStorageGaugeTooltip::class.java) { it } event.register(MatterStorageGaugeTooltip::class.java) { it }
} }

View File

@ -79,7 +79,7 @@ class ChartTooltipElement(
} }
companion object { companion object {
fun register(event: RegisterClientTooltipComponentFactoriesEvent) { internal fun register(event: RegisterClientTooltipComponentFactoriesEvent) {
event.register(ChartTooltipElement::class.java) { it } event.register(ChartTooltipElement::class.java) { it }
} }
} }

View File

@ -63,7 +63,7 @@ object ShockwaveRenderer {
private const val EXPANSION_PER_SECOND = 18f private const val EXPANSION_PER_SECOND = 18f
fun onRender(event: RenderLevelStageEvent) { internal fun onRender(event: RenderLevelStageEvent) {
if (event.stage !== RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) { if (event.stage !== RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
return return
} }

View File

@ -142,7 +142,7 @@ class BatteryBankRenderer(context: BlockEntityRendererProvider.Context) : BankRe
override val texture: AbstractMatterySprite = WidgetLocation.VERTICAL_GAUGES.sprite(x = 108f, width = 18f) override val texture: AbstractMatterySprite = WidgetLocation.VERTICAL_GAUGES.sprite(x = 108f, width = 18f)
companion object { companion object {
fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) { internal fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) {
for (i in 0 .. 11) { for (i in 0 .. 11) {
event.register(ModelResourceLocation.standalone(ResourceLocation(OverdriveThatMatters.MOD_ID, "block/battery/battery$i"))) event.register(ModelResourceLocation.standalone(ResourceLocation(OverdriveThatMatters.MOD_ID, "block/battery/battery$i")))
} }
@ -168,7 +168,7 @@ class MatterBatteryBankRenderer(context: BlockEntityRendererProvider.Context) :
override val texture: AbstractMatterySprite = WidgetLocation.VERTICAL_GAUGES.sprite(x = 90f, width = 18f) override val texture: AbstractMatterySprite = WidgetLocation.VERTICAL_GAUGES.sprite(x = 90f, width = 18f)
companion object { companion object {
fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) { internal fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) {
for (i in 0 .. 11) { for (i in 0 .. 11) {
event.register(ModelResourceLocation.standalone(ResourceLocation(OverdriveThatMatters.MOD_ID, "block/battery/matter_capacitor$i"))) event.register(ModelResourceLocation.standalone(ResourceLocation(OverdriveThatMatters.MOD_ID, "block/battery/matter_capacitor$i")))
} }

View File

@ -25,8 +25,11 @@ import ru.dbotthepony.mc.otm.client.setMousePos
import ru.dbotthepony.mc.otm.client.shouldOpenVanillaInventory import ru.dbotthepony.mc.otm.client.shouldOpenVanillaInventory
import ru.dbotthepony.mc.otm.core.math.integerDivisionDown import ru.dbotthepony.mc.otm.core.math.integerDivisionDown
import ru.dbotthepony.mc.otm.menu.ExopackInventoryMenu import ru.dbotthepony.mc.otm.menu.ExopackInventoryMenu
import ru.dbotthepony.mc.otm.menu.QuickMoveInput
import ru.dbotthepony.mc.otm.network.ExopackMenuOpen import ru.dbotthepony.mc.otm.network.ExopackMenuOpen
import ru.dbotthepony.mc.otm.network.QuickStackPacket
import yalter.mousetweaks.api.MouseTweaksDisableWheelTweak import yalter.mousetweaks.api.MouseTweaksDisableWheelTweak
import java.util.function.IntConsumer
@MouseTweaksDisableWheelTweak @MouseTweaksDisableWheelTweak
class ExopackInventoryScreen(menu: ExopackInventoryMenu) : MatteryScreen<ExopackInventoryMenu>(menu, TranslatableComponent("otm.gui.exopack")) { class ExopackInventoryScreen(menu: ExopackInventoryMenu) : MatteryScreen<ExopackInventoryMenu>(menu, TranslatableComponent("otm.gui.exopack")) {
@ -283,6 +286,17 @@ class ExopackInventoryScreen(menu: ExopackInventoryMenu) : MatteryScreen<Exopack
EffectListPanel(this, frame, menu.player, x - 56f, gridHeight = 6).tick() EffectListPanel(this, frame, menu.player, x - 56f, gridHeight = 6).tick()
val leftControls = DeviceControls(this, frame)
leftControls.dockOnLeft = true
leftControls.dockTop = 96f
leftControls.addButton(ButtonPanel.square18(
this, leftControls,
icon = Widgets18.RESTOCK_WITH_MOVE_TO_STORAGE,
onPress = IntConsumer { PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK_WITH_MOVE, true)) }).also {
it.tooltips.add(QuickMoveInput.Mode.RESTOCK_WITH_MOVE.textToStorage)
})
return frame return frame
} }

View File

@ -457,14 +457,13 @@ class DeviceControls<out S : MatteryScreen<*>>(
return result return result
} }
private abstract inner class FoldableButtonPanel() : ButtonPanel<S>(screen, this@DeviceControls, width = 18f, height = 18f) { abstract inner class FoldableButtonPanel() : ButtonPanel<S>(screen, this@DeviceControls, width = 18f, height = 18f) {
init { init {
addButton(this) addButton(this)
} }
private var buttons: List<EditablePanel<S>>? = null private var buttons: List<EditablePanel<S>>? = null
fun makeButtons() { fun makeButtons() {
if (buttons == null) { if (buttons == null) {
buttons = doMakeButtons().also { buttons = doMakeButtons().also {

View File

@ -40,15 +40,11 @@ val isCuriosLoaded by lazy {
ModList.get().isLoaded(CuriosApi.MODID) ModList.get().isLoaded(CuriosApi.MODID)
} }
fun onCuriosSlotModifiersUpdated(event: SlotModifiersUpdatedEvent) { internal fun onCuriosSlotModifiersUpdated(event: SlotModifiersUpdatedEvent) {
check(isCuriosLoaded) { "Curios is not loaded!" } check(isCuriosLoaded) { "Curios is not loaded!" }
event.entity.matteryPlayer?.recreateExoPackMenu() event.entity.matteryPlayer?.recreateExoPackMenu()
} }
fun openCuriosScreen(carriedStack: ItemStack = ItemStack.EMPTY) {
if (FMLEnvironment.dist.isClient) PacketDistributor.sendToServer(CPacketOpenCurios(carriedStack))
}
private fun Player.getCuriosSlotsImpl(): List<PlayerSlot<Slot, Slot>> { private fun Player.getCuriosSlotsImpl(): List<PlayerSlot<Slot, Slot>> {
val handler = getCapability(CuriosCapability.INVENTORY) ?: return listOf() val handler = getCapability(CuriosCapability.INVENTORY) ?: return listOf()

View File

@ -1,11 +1,24 @@
package ru.dbotthepony.mc.otm.compat.vanilla package ru.dbotthepony.mc.otm.compat.vanilla
import net.minecraft.core.BlockPos
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
import net.minecraft.world.Container
import net.minecraft.world.flag.FeatureFlags import net.minecraft.world.flag.FeatureFlags
import net.minecraft.world.inventory.MenuType import net.minecraft.world.inventory.MenuType
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.entity.ChestBlockEntity
import net.minecraft.world.level.block.state.BlockState
import net.neoforged.bus.api.IEventBus import net.neoforged.bus.api.IEventBus
import net.neoforged.neoforge.capabilities.IBlockCapabilityProvider
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.capability.IQuickStackContainer
import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.menu.MatteryMenuSlot
import ru.dbotthepony.mc.otm.menu.makeSlots
import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MDeferredRegister
object VanillaMenuTypes { object VanillaMenuTypes {
@ -22,9 +35,26 @@ object VanillaMenuTypes {
val SHULKER_BOX by registrar.register("shulker_box") { MenuType(::MatteryShulkerBoxMenu, FeatureFlags.VANILLA_SET) } val SHULKER_BOX by registrar.register("shulker_box") { MenuType(::MatteryShulkerBoxMenu, FeatureFlags.VANILLA_SET) }
fun register(bus: IEventBus) { private fun provider(level: Level, pos: BlockPos, state: BlockState, blockEntity: BlockEntity?, context: Void?): IQuickStackContainer? {
val container = blockEntity as? Container ?: return null
return IQuickStackContainer.Simple(makeSlots(container, ::MatteryMenuSlot))
}
fun registerCapabilities(event: RegisterCapabilitiesEvent) {
event.registerBlock(
MatteryCapability.QUICK_STACK_CONTAINER,
::provider,
Blocks.CHEST,
Blocks.TRAPPED_CHEST,
Blocks.SHULKER_BOX,
Blocks.BARREL,
)
}
internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
bus.addListener(this::registerScreens) bus.addListener(this::registerScreens)
bus.addListener(this::registerCapabilities)
} }
private fun registerScreens(event: RegisterMenuScreensEvent) { private fun registerScreens(event: RegisterMenuScreensEvent) {

View File

@ -72,6 +72,7 @@ import java.util.random.RandomGenerator
import java.util.stream.Stream import java.util.stream.Stream
import java.util.stream.StreamSupport import java.util.stream.StreamSupport
import kotlin.NoSuchElementException import kotlin.NoSuchElementException
import kotlin.enums.EnumEntries
import kotlin.jvm.optionals.getOrNull import kotlin.jvm.optionals.getOrNull
import kotlin.math.ln import kotlin.math.ln
import kotlin.math.sqrt import kotlin.math.sqrt
@ -301,6 +302,10 @@ fun OutputStream.writeItemType(value: Item) {
writeVarIntLE(BuiltInRegistries.ITEM.getId(value)) writeVarIntLE(BuiltInRegistries.ITEM.getId(value))
} }
fun <E : Enum<E>> FriendlyByteBuf.readEnum(entries: EnumEntries<E>): E {
return entries[readVarInt()]
}
fun <T : Any> FriendlyByteBuf.readType(registry: IdMap<T>): T { fun <T : Any> FriendlyByteBuf.readType(registry: IdMap<T>): T {
val id = readInt() val id = readInt()
return registry.byId(id) ?: throw NoSuchElementException("No such entry with ID $id") return registry.byId(id) ?: throw NoSuchElementException("No such entry with ID $id")

View File

@ -435,6 +435,14 @@ operator fun Vec3i.times(int: Int): Vec3i = this.multiply(int)
operator fun Direction.times(int: Int): Vec3i = this.normal.multiply(int) operator fun Direction.times(int: Int): Vec3i = this.normal.multiply(int)
operator fun Vec3i.times(double: Double): Vector = Vector(x * double, y * double, z * double) operator fun Vec3i.times(double: Double): Vector = Vector(x * double, y * double, z * double)
operator fun Vector.plus(direction: Vec3i): Vector = Vector(x + direction.x, y + direction.y, z + direction.z)
operator fun Vector.plus(direction: Direction): Vector = plus(direction.normal)
operator fun Vector.minus(direction: Vec3i): Vector = Vector(x - direction.x, y - direction.y, z - direction.z)
operator fun Vector.minus(direction: Direction): Vector = minus(direction.normal)
operator fun Vec3i.plus(direction: Vector): Vector = Vector(x + direction.x, y + direction.y, z + direction.z)
operator fun Vec3i.minus(direction: Vector): Vector = Vector(x - direction.x, y - direction.y, z - direction.z)
fun Vec3.toIntVector() = Vec3i(x.toInt(), y.toInt(), z.toInt()) fun Vec3.toIntVector() = Vec3i(x.toInt(), y.toInt(), z.toInt())
fun Vec3.roundToIntVector() = Vec3i(x.roundToInt(), y.roundToInt(), z.roundToInt()) fun Vec3.roundToIntVector() = Vec3i(x.roundToInt(), y.roundToInt(), z.roundToInt())

View File

@ -198,7 +198,7 @@ object FlywheelMaterials : SimpleJsonResourceReloadListener(GsonBuilder().setPre
).apply(it, ::Entry) ).apply(it, ::Entry)
} }
fun reloadEvent(event: AddReloadListenerEvent) { internal fun reloadEvent(event: AddReloadListenerEvent) {
event.addListener(this) event.addListener(this)
} }
@ -227,7 +227,7 @@ object FlywheelMaterials : SimpleJsonResourceReloadListener(GsonBuilder().setPre
} }
} }
fun onDataPackSync(event: OnDatapackSyncEvent) { internal fun onDataPackSync(event: OnDatapackSyncEvent) {
if (event.player == null) { if (event.player == null) {
PacketDistributor.sendToAllPlayers(SyncPacket(elements)) PacketDistributor.sendToAllPlayers(SyncPacket(elements))
} else { } else {
@ -235,7 +235,7 @@ object FlywheelMaterials : SimpleJsonResourceReloadListener(GsonBuilder().setPre
} }
} }
fun tooltipEvent(event: ItemTooltipEvent) { internal fun tooltipEvent(event: ItemTooltipEvent) {
if (minecraft.window.isShiftDown) { if (minecraft.window.isShiftDown) {
val item = event.itemStack.item val item = event.itemStack.item

View File

@ -52,7 +52,7 @@ abstract class DecimalProvider : SampledDecimal {
registror.register("uniform") { UniformDecimal } registror.register("uniform") { UniformDecimal }
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
bus.addListener(registryHolder::build) bus.addListener(registryHolder::build)
registror.register(bus) registror.register(bus)
} }

View File

@ -1,8 +1,10 @@
package ru.dbotthepony.mc.otm.entity package ru.dbotthepony.mc.otm.entity
import net.minecraft.core.BlockPos
import net.minecraft.network.syncher.EntityDataAccessor import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.player.Player
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
@ -17,3 +19,7 @@ class SynchedEntityDataDelegate<T>(private val type: EntityDataAccessor<T>, priv
} }
fun <T> SynchedEntityData.delegate(type: EntityDataAccessor<T>) = SynchedEntityDataDelegate(type, this) fun <T> SynchedEntityData.delegate(type: EntityDataAccessor<T>) = SynchedEntityDataDelegate(type, this)
fun Player.checkCanInteract(pos: BlockPos): Boolean {
return mayInteract(level(), pos) && canInteractWithBlock(pos, 1.0)
}

View File

@ -12,8 +12,7 @@ import ru.dbotthepony.mc.otm.registry.game.MItems
object WitheredSkeletonSpawnHandler { object WitheredSkeletonSpawnHandler {
@SubscribeEvent internal fun onEntityJoin(event: EntityJoinLevelEvent) {
fun onEntityJoin(event: EntityJoinLevelEvent) {
val entity = event.entity val entity = event.entity
if (entity is WitherSkeleton) { if (entity is WitherSkeleton) {

View File

@ -106,7 +106,7 @@ class ChestUpgraderItem : MatteryItem(Properties().stacksTo(1)) {
} }
companion object { companion object {
fun onEntityInteract(event: PlayerInteractEvent.EntityInteract) { internal fun onEntityInteract(event: PlayerInteractEvent.EntityInteract) {
if (event.target !is MinecartChest) return if (event.target !is MinecartChest) return
val offhand = if (event.entity.getItemInHand(InteractionHand.MAIN_HAND).item is ChestUpgraderItem) { val offhand = if (event.entity.getItemInHand(InteractionHand.MAIN_HAND).item is ChestUpgraderItem) {

View File

@ -68,7 +68,7 @@ class PortableCondensationDriveItem(capacity: Int) : Item(Properties().stacksTo(
const val MAX_FILTERS = 4 * 3 const val MAX_FILTERS = 4 * 3
private val EMPTY_FILTER = ItemFilter(MAX_FILTERS) private val EMPTY_FILTER = ItemFilter(MAX_FILTERS)
fun onPickupEvent(event: ItemEntityPickupEvent.Pre) { internal fun onPickupEvent(event: ItemEntityPickupEvent.Pre) {
if (event.itemEntity.owner != null && event.itemEntity.owner != event.player && event.itemEntity.age < 200 || event.itemEntity.item.isEmpty) { if (event.itemEntity.owner != null && event.itemEntity.owner != event.player && event.itemEntity.age < 200 || event.itemEntity.item.isEmpty) {
return return
} }

View File

@ -317,7 +317,7 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc
} }
companion object { companion object {
fun clientDisconnect(event: ClientPlayerNetworkEvent.LoggingOut) { internal fun clientDisconnect(event: ClientPlayerNetworkEvent.LoggingOut) {
BuiltInRegistries.ITEM.forEach { if (it is QuantumBatteryItem) it.clientData.clear() } BuiltInRegistries.ITEM.forEach { if (it is QuantumBatteryItem) it.clientData.clear() }
} }
@ -331,7 +331,7 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc
) )
} }
fun tick(event: ServerTickEvent.Post) { internal fun tick(event: ServerTickEvent.Post) {
for (ply in event.server.playerList.players) { for (ply in event.server.playerList.players) {
val networkedChannels = ObjectOpenHashSet<UUID>(0) val networkedChannels = ObjectOpenHashSet<UUID>(0)

View File

@ -53,7 +53,7 @@ class TritaniumArmorItem(slot: Type) : ArmorItem(MArmorMaterials.TRITANIUM, slot
val TEXTURE_LOCATION_BASE = loc("textures/models/armor/tritanium_armor_base.png") val TEXTURE_LOCATION_BASE = loc("textures/models/armor/tritanium_armor_base.png")
val TEXTURE_LOCATION_OVERLAY = loc("textures/models/armor/tritanium_armor_overlay.png") val TEXTURE_LOCATION_OVERLAY = loc("textures/models/armor/tritanium_armor_overlay.png")
fun onHurt(event: LivingIncomingDamageEvent) { internal fun onHurt(event: LivingIncomingDamageEvent) {
if (event.source.typeHolder().`is`(DamageTypes.SWEET_BERRY_BUSH) || event.source.msgId == "sweetBerryBush") { if (event.source.typeHolder().`is`(DamageTypes.SWEET_BERRY_BUSH) || event.source.msgId == "sweetBerryBush") {
if ( if (
event.entity.getItemBySlot(EquipmentSlot.FEET).let { !it.isEmpty && it.item == MItems.TRITANIUM_BOOTS } && event.entity.getItemBySlot(EquipmentSlot.FEET).let { !it.isEmpty && it.item == MItems.TRITANIUM_BOOTS } &&

View File

@ -107,7 +107,7 @@ class NotNormalFood(
} }
companion object { companion object {
fun onInteract(event: EntityInteract) { internal fun onInteract(event: EntityInteract) {
val item = event.itemStack.item as? NotNormalFood ?: return val item = event.itemStack.item as? NotNormalFood ?: return
val target = event.target as? LivingEntity ?: return val target = event.target as? LivingEntity ?: return

View File

@ -321,7 +321,7 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1)
val GUNPOWDER_PREDICATE = Predicate { stack: ItemStack -> stack.`is`(Tags.Items.GUNPOWDERS) } val GUNPOWDER_PREDICATE = Predicate { stack: ItemStack -> stack.`is`(Tags.Items.GUNPOWDERS) }
val IRON_NUGGET_PREDICATE = Predicate { stack: ItemStack -> stack.`is`(Tags.Items.NUGGETS_IRON) } val IRON_NUGGET_PREDICATE = Predicate { stack: ItemStack -> stack.`is`(Tags.Items.NUGGETS_IRON) }
fun onLeftClickBlock(event: PlayerInteractEvent.LeftClickBlock) { internal fun onLeftClickBlock(event: PlayerInteractEvent.LeftClickBlock) {
val item = event.itemStack.item val item = event.itemStack.item
if (item is ExplosiveHammerItem) { if (item is ExplosiveHammerItem) {

View File

@ -122,7 +122,7 @@ class RedstoneInteractorItem : MatteryItem(Properties().stacksTo(1)) {
return -1 return -1
} }
fun onUse(event: UseItemOnBlockEvent) { internal fun onUse(event: UseItemOnBlockEvent) {
if (event.itemStack.item is RedstoneInteractorItem) { if (event.itemStack.item is RedstoneInteractorItem) {
if ((event.itemStack.item as RedstoneInteractorItem).useOn(event.useOnContext).consumesAction()) if ((event.itemStack.item as RedstoneInteractorItem).useOn(event.useOnContext).consumesAction())
event.cancelWithResult(ItemInteractionResult.sidedSuccess(event.level.isClientSide())) event.cancelWithResult(ItemInteractionResult.sidedSuccess(event.level.isClientSide()))

View File

@ -114,7 +114,7 @@ abstract class AbstractRegistryAction(
registrar.register("blacklist") { BlacklistAction.Companion } registrar.register("blacklist") { BlacklistAction.Companion }
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
bus.addListener(registryDelegate::build) bus.addListener(registryDelegate::build)
} }

View File

@ -36,7 +36,7 @@ interface IMatterFunction {
val AT_MOST: IMatterFunction by registrar.register("at_most") { SimpleMatterFunction(Int::coerceAtMost, Double::coerceAtMost, Decimal::coerceAtMost) } val AT_MOST: IMatterFunction by registrar.register("at_most") { SimpleMatterFunction(Int::coerceAtMost, Double::coerceAtMost, Decimal::coerceAtMost) }
val REPLACE: IMatterFunction by registrar.register("replace") { SimpleMatterFunction({ _, value -> value }, { _, value -> value }, { _, value -> value }) } val REPLACE: IMatterFunction by registrar.register("replace") { SimpleMatterFunction({ _, value -> value }, { _, value -> value }, { _, value -> value }) }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
bus.addListener(registryDelegate::build) bus.addListener(registryDelegate::build)
} }

View File

@ -1335,7 +1335,7 @@ object MatterManager {
private val formatMatterAsReadable = BooleanSupplier { if (ClientConfig.Tooltip.ALWAYS_DISPLAY_MATTER_VALUE) minecraft.window.isShiftDown else minecraft.window.isShiftDown && milliTime % 2_000L > 1_000L } private val formatMatterAsReadable = BooleanSupplier { if (ClientConfig.Tooltip.ALWAYS_DISPLAY_MATTER_VALUE) minecraft.window.isShiftDown else minecraft.window.isShiftDown && milliTime % 2_000L > 1_000L }
fun tooltipEvent(event: ItemTooltipEvent) { internal fun tooltipEvent(event: ItemTooltipEvent) {
if (ClientConfig.Tooltip.ALWAYS_DISPLAY_MATTER_VALUE || minecraft.window.isShiftDown) { if (ClientConfig.Tooltip.ALWAYS_DISPLAY_MATTER_VALUE || minecraft.window.isShiftDown) {
val matter = get(event.itemStack, accountForStackSize = false) val matter = get(event.itemStack, accountForStackSize = false)
@ -1528,12 +1528,12 @@ object MatterManager {
} }
} }
fun reloadEvent(event: AddReloadListenerEvent) { internal fun reloadEvent(event: AddReloadListenerEvent) {
event.addListener(Registry) event.addListener(Registry)
event.addListener(Resolver) event.addListener(Resolver)
} }
fun initialize(bus: IEventBus) { internal fun initialize(bus: IEventBus) {
bus.addListener(Resolver.delegate::build) bus.addListener(Resolver.delegate::build)
Resolver.registrar.register(bus) Resolver.registrar.register(bus)
} }
@ -1633,7 +1633,7 @@ object MatterManager {
return 0 return 0
} }
fun addCommands(event: RegisterCommandsEvent) { internal fun addCommands(event: RegisterCommandsEvent) {
event.dispatcher.register( event.dispatcher.register(
Commands.literal("dump_matter_registry") Commands.literal("dump_matter_registry")
.requires { it.hasPermission(Commands.LEVEL_OWNERS) } .requires { it.hasPermission(Commands.LEVEL_OWNERS) }
@ -1686,7 +1686,7 @@ object MatterManager {
syncRegistry(server.registryAccess(), PacketDistributor::sendToAllPlayers) syncRegistry(server.registryAccess(), PacketDistributor::sendToAllPlayers)
} }
fun onDataPackSync(event: OnDatapackSyncEvent) { internal fun onDataPackSync(event: OnDatapackSyncEvent) {
if (!registryIsBuilt) if (!registryIsBuilt)
return return
@ -1697,7 +1697,7 @@ object MatterManager {
} }
} }
fun onServerStarted(event: ServerStartedEvent) { internal fun onServerStarted(event: ServerStartedEvent) {
check(Resolver.ready) { "Recipe resolver is not ready somehow" } check(Resolver.ready) { "Recipe resolver is not ready somehow" }
check(Registry.ready) { "Matter registry is not ready somehow" } check(Registry.ready) { "Matter registry is not ready somehow" }
finishUpIfRequiredAndPossible(event.server) finishUpIfRequiredAndPossible(event.server)

View File

@ -42,6 +42,7 @@ import ru.dbotthepony.mc.otm.container.util.containerSlotOrNull
import ru.dbotthepony.mc.otm.core.ResourceLocation import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.collect.ConditionalSet import ru.dbotthepony.mc.otm.core.collect.ConditionalSet
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.entity.checkCanInteract
import ru.dbotthepony.mc.otm.menu.input.BooleanInputWithFeedback import ru.dbotthepony.mc.otm.menu.input.BooleanInputWithFeedback
import ru.dbotthepony.mc.otm.menu.widget.ProfiledLevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProfiledLevelGaugeWidget
import ru.dbotthepony.mc.otm.network.MatteryStreamCodec import ru.dbotthepony.mc.otm.network.MatteryStreamCodec
@ -346,13 +347,10 @@ abstract class MatteryMenu(
override fun stillValid(player: Player): Boolean { override fun stillValid(player: Player): Boolean {
if (tile == null) return true if (tile == null) return true
if (player.level().getBlockEntity(tile.blockPos) !== tile) { if (player.level().getBlockEntity(tile.blockPos) !== tile)
return false return false
}
val pos = tile.blockPos return player.checkCanInteract(tile.blockPos)
return player.distanceToSqr(pos.x.toDouble() + 0.5, pos.y.toDouble() + 0.5, pos.z.toDouble() + 0.5) <= 64.0
} }
fun syncCarried() { fun syncCarried() {

View File

@ -28,6 +28,18 @@ fun <T : CustomPacketPayload> PayloadRegistrar.playToServer(
handler: KFunction1<IPayloadContext, Unit> handler: KFunction1<IPayloadContext, Unit>
): PayloadRegistrar = playToServer(type, codec) { _, context -> handler(context) } ): PayloadRegistrar = playToServer(type, codec) { _, context -> handler(context) }
fun <T : CustomPacketPayload> PayloadRegistrar.playToClient(
type: CustomPacketPayload.Type<T>,
value: T,
handler: KFunction1<IPayloadContext, Unit>
): PayloadRegistrar = playToClient(type, MatteryStreamCodec.MUnit(value)) { _, context -> handler(context) }
fun <T : CustomPacketPayload> PayloadRegistrar.playToServer(
type: CustomPacketPayload.Type<T>,
value: T,
handler: KFunction1<IPayloadContext, Unit>
): PayloadRegistrar = playToServer(type, MatteryStreamCodec.MUnit(value)) { _, context -> handler(context) }
inline fun encodePayload(registry: RegistryAccess, block: (RegistryFriendlyByteBuf) -> Unit): ByteArrayList { inline fun encodePayload(registry: RegistryAccess, block: (RegistryFriendlyByteBuf) -> Unit): ByteArrayList {
val underlying = ByteBufAllocator.DEFAULT.buffer() val underlying = ByteBufAllocator.DEFAULT.buffer()
val buf = RegistryFriendlyByteBuf(underlying, registry, ConnectionType.NEOFORGE) val buf = RegistryFriendlyByteBuf(underlying, registry, ConnectionType.NEOFORGE)

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.network package ru.dbotthepony.mc.otm.network
import it.unimi.dsi.fastutil.bytes.ByteArrayList import it.unimi.dsi.fastutil.bytes.ByteArrayList
import net.minecraft.core.BlockPos
import net.minecraft.core.particles.ParticleTypes import net.minecraft.core.particles.ParticleTypes
import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.FriendlyByteBuf
import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.RegistryFriendlyByteBuf
@ -8,28 +9,47 @@ import net.minecraft.network.codec.StreamCodec
import net.minecraft.network.protocol.common.custom.CustomPacketPayload import net.minecraft.network.protocol.common.custom.CustomPacketPayload
import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.ai.attributes.Attributes
import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.inventory.Slot
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.ChunkPos
import net.minecraft.world.level.ClipBlockStateContext
import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.phys.Vec3
import net.neoforged.neoforge.common.NeoForgeMod
import net.neoforged.neoforge.network.handling.IPayloadContext import net.neoforged.neoforge.network.handling.IPayloadContext
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.kommons.math.RGBAColor
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.capability.IQuickStackContainer
import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.player.MatteryPlayer import ru.dbotthepony.mc.otm.player.MatteryPlayer
import ru.dbotthepony.mc.otm.player.matteryPlayer import ru.dbotthepony.mc.otm.player.matteryPlayer
import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.container.get
import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.container.set
import ru.dbotthepony.mc.otm.core.ResourceLocation import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.getChunkNow
import ru.dbotthepony.mc.otm.core.math.Vector
import ru.dbotthepony.mc.otm.core.math.component1 import ru.dbotthepony.mc.otm.core.math.component1
import ru.dbotthepony.mc.otm.core.math.component2 import ru.dbotthepony.mc.otm.core.math.component2
import ru.dbotthepony.mc.otm.core.math.component3 import ru.dbotthepony.mc.otm.core.math.component3
import ru.dbotthepony.mc.otm.core.math.minus
import ru.dbotthepony.mc.otm.core.math.plus
import ru.dbotthepony.mc.otm.core.math.toRadians import ru.dbotthepony.mc.otm.core.math.toRadians
import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.otmRandom
import ru.dbotthepony.mc.otm.core.position import ru.dbotthepony.mc.otm.core.position
import ru.dbotthepony.mc.otm.core.readEnum
import ru.dbotthepony.mc.otm.core.readItem import ru.dbotthepony.mc.otm.core.readItem
import ru.dbotthepony.mc.otm.core.writeItem import ru.dbotthepony.mc.otm.core.writeItem
import ru.dbotthepony.mc.otm.entity.checkCanInteract
import ru.dbotthepony.mc.otm.menu.ExopackInventoryMenu import ru.dbotthepony.mc.otm.menu.ExopackInventoryMenu
import ru.dbotthepony.mc.otm.menu.QuickMoveInput
import java.util.* import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashSet
class MatteryPlayerDataPacket(val bytes: ByteArrayList, val isPublic: Boolean, val target: UUID? = null) : CustomPacketPayload { class MatteryPlayerDataPacket(val bytes: ByteArrayList, val isPublic: Boolean, val target: UUID? = null) : CustomPacketPayload {
fun write(buff: FriendlyByteBuf) { fun write(buff: FriendlyByteBuf) {
@ -245,9 +265,6 @@ object ExopackMenuOpen : CustomPacketPayload {
"exopack_menu_open" "exopack_menu_open"
) )
) )
val CODEC: StreamCodec<FriendlyByteBuf, ExopackMenuOpen> =
StreamCodec.ofMember({ _, _ -> }, { ExopackMenuOpen })
} }
class PickItemFromInventoryPacket( class PickItemFromInventoryPacket(
@ -347,8 +364,6 @@ object DisplayExopackPacket : CustomPacketPayload {
"display_exopack" "display_exopack"
) )
) )
val CODEC: StreamCodec<FriendlyByteBuf, DisplayExopackPacket> =
StreamCodec.ofMember({ _, _ -> }, { DisplayExopackPacket })
} }
object HideExopackPacket : CustomPacketPayload { object HideExopackPacket : CustomPacketPayload {
@ -366,8 +381,6 @@ object HideExopackPacket : CustomPacketPayload {
"hide_exopack" "hide_exopack"
) )
) )
val CODEC: StreamCodec<FriendlyByteBuf, HideExopackPacket> =
StreamCodec.ofMember({ _, _ -> }, { HideExopackPacket })
} }
object EnableExopackGlowPacket : CustomPacketPayload { object EnableExopackGlowPacket : CustomPacketPayload {
@ -385,8 +398,6 @@ object EnableExopackGlowPacket : CustomPacketPayload {
"enable_exopack_glow" "enable_exopack_glow"
) )
) )
val CODEC: StreamCodec<FriendlyByteBuf, EnableExopackGlowPacket> =
StreamCodec.ofMember({ _, _ -> }, { EnableExopackGlowPacket })
} }
object DisableExopackGlowPacket : CustomPacketPayload { object DisableExopackGlowPacket : CustomPacketPayload {
@ -404,8 +415,6 @@ object DisableExopackGlowPacket : CustomPacketPayload {
"disable_exopack_glow" "disable_exopack_glow"
) )
) )
val CODEC: StreamCodec<FriendlyByteBuf, DisableExopackGlowPacket> =
StreamCodec.ofMember({ _, _ -> }, { DisableExopackGlowPacket })
} }
object ResetExopackColorPacket : CustomPacketPayload { object ResetExopackColorPacket : CustomPacketPayload {
@ -423,8 +432,80 @@ object ResetExopackColorPacket : CustomPacketPayload {
"reset_exopack_color" "reset_exopack_color"
) )
) )
val CODEC: StreamCodec<FriendlyByteBuf, ResetExopackColorPacket> = }
StreamCodec.ofMember({ _, _ -> }, { ResetExopackColorPacket })
// as separate packet so it can be put into non-mattery menus
class QuickStackPacket(
val mode: QuickMoveInput.Mode,
val fromExopack: Boolean
) : CustomPacketPayload {
fun play(context: IPayloadContext) {
val player = context.player() as ServerPlayer
if (player.isSpectator) return
val radius = player.blockInteractionRange()
val minChunkPos = ChunkPos(BlockPos.containing(player.position - Vector(radius, 0.0, radius)))
val maxChunkPos = ChunkPos(BlockPos.containing(player.position + Vector(radius, 0.0, radius)))
val findCaps = ArrayList<Pair<BlockEntity, IQuickStackContainer>>()
for (x in minChunkPos.x .. maxChunkPos.x) {
for (z in minChunkPos.z .. maxChunkPos.z) {
val chunk = player.serverLevel().chunkSource.getChunkNow(x, z) ?: continue
for (blockEntity in chunk.blockEntities.values) {
if (player.checkCanInteract(blockEntity.blockPos)) {
val cap = player.level().getCapability(MatteryCapability.QUICK_STACK_CONTAINER, blockEntity.blockPos) ?: continue
findCaps.add(blockEntity to cap)
}
}
}
}
if (findCaps.isEmpty()) return
val eyes = player.eyePosition
val ignoreBlockstates = HashSet<BlockState>()
findCaps.forEach { (b, _) -> ignoreBlockstates.add(b.blockState) }
val slots = ArrayList<Slot>()
for ((blockEntity, cap) in findCaps) {
// don't interact through walls
val trace = player.serverLevel().isBlockInLine(ClipBlockStateContext(eyes, Vector.atCenterOf(blockEntity.blockPos)) {
!it.isAir && it !in ignoreBlockstates
})
if (trace.blockPos == blockEntity.blockPos) {
slots.addAll(cap.getSlotsFor(player))
}
}
if (slots.isEmpty()) return
if (fromExopack)
mode.move(player.matteryPlayer.exoPackMenu.playerCombinedInventorySlots, slots, player)
else
mode.move(slots, player.matteryPlayer.exoPackMenu.playerInventorySlots, player)
}
override fun type(): CustomPacketPayload.Type<out CustomPacketPayload> {
return TYPE
}
fun write(buff: FriendlyByteBuf) {
buff.writeEnum(mode)
buff.writeBoolean(fromExopack)
}
companion object {
val TYPE = CustomPacketPayload.Type<QuickStackPacket>(ResourceLocation(OverdriveThatMatters.MOD_ID, "quick_stack"))
val CODEC: StreamCodec<FriendlyByteBuf, QuickStackPacket> = StreamCodec.ofMember(QuickStackPacket::write, ::read)
fun read(buff: FriendlyByteBuf): QuickStackPacket {
return QuickStackPacket(buff.readEnum(QuickMoveInput.Mode.entries), buff.readBoolean())
}
}
} }
class ExopackSmokePacket(val player: UUID) : CustomPacketPayload { class ExopackSmokePacket(val player: UUID) : CustomPacketPayload {

View File

@ -35,6 +35,14 @@ interface MatteryStreamCodec<in S : ByteBuf, V> : StreamCodec<@UnsafeVariance S,
} }
} }
class MUnit<V>(val value: V) : MatteryStreamCodec<ByteBuf, V> {
override fun decode(stream: ByteBuf): V {
return value
}
override fun encode(stream: ByteBuf, value: V) {}
}
abstract class AbstractPair<in S : ByteBuf, A, B, P>(private val first: MatteryStreamCodec<S, A>, private val second: MatteryStreamCodec<S, B>) : MatteryStreamCodec<S, P> { abstract class AbstractPair<in S : ByteBuf, A, B, P>(private val first: MatteryStreamCodec<S, A>, private val second: MatteryStreamCodec<S, B>) : MatteryStreamCodec<S, P> {
protected abstract fun getFirst(value: P): A protected abstract fun getFirst(value: P): A
protected abstract fun getSecond(value: P): B protected abstract fun getSecond(value: P): B

View File

@ -19,8 +19,8 @@ import ru.dbotthepony.mc.otm.menu.matter.PatternsChangePacket
import ru.dbotthepony.mc.otm.menu.matter.ReplicationRequestPacket import ru.dbotthepony.mc.otm.menu.matter.ReplicationRequestPacket
import ru.dbotthepony.mc.otm.menu.matter.TasksChangePacket import ru.dbotthepony.mc.otm.menu.matter.TasksChangePacket
fun registerNetworkPackets(event: RegisterPayloadHandlersEvent) { internal fun registerNetworkPackets(event: RegisterPayloadHandlersEvent) {
val r = event.registrar("1.5.0") val r = event.registrar("1.5.1")
// world // world
r r
@ -44,16 +44,17 @@ fun registerNetworkPackets(event: RegisterPayloadHandlersEvent) {
.playToClient(ExopackSlotPacket.TYPE, ExopackSlotPacket.CODEC, ExopackSlotPacket::play) .playToClient(ExopackSlotPacket.TYPE, ExopackSlotPacket.CODEC, ExopackSlotPacket::play)
.playToClient(ExopackMenuInitPacket.TYPE, ExopackMenuInitPacket.CODEC, ExopackMenuInitPacket::play) .playToClient(ExopackMenuInitPacket.TYPE, ExopackMenuInitPacket.CODEC, ExopackMenuInitPacket::play)
.playToClient(ExopackSmokePacket.TYPE, ExopackSmokePacket.CODEC, ExopackSmokePacket::play) .playToClient(ExopackSmokePacket.TYPE, ExopackSmokePacket.CODEC, ExopackSmokePacket::play)
.playToServer(ExopackMenuOpen.TYPE, ExopackMenuOpen.CODEC, ExopackMenuOpen::play) .playToServer(ExopackMenuOpen.TYPE, ExopackMenuOpen, ExopackMenuOpen::play)
.playToServer(PickItemFromInventoryPacket.TYPE, PickItemFromInventoryPacket.CODEC, PickItemFromInventoryPacket::play) .playToServer(PickItemFromInventoryPacket.TYPE, PickItemFromInventoryPacket.CODEC, PickItemFromInventoryPacket::play)
.playToServer(DisplayExopackPacket.TYPE, DisplayExopackPacket.CODEC, DisplayExopackPacket::play) .playToServer(DisplayExopackPacket.TYPE, DisplayExopackPacket, DisplayExopackPacket::play)
.playToServer(HideExopackPacket.TYPE, HideExopackPacket.CODEC, HideExopackPacket::play) .playToServer(HideExopackPacket.TYPE, HideExopackPacket, HideExopackPacket::play)
.playToServer(EnableExopackGlowPacket.TYPE, EnableExopackGlowPacket.CODEC, EnableExopackGlowPacket::play) .playToServer(EnableExopackGlowPacket.TYPE, EnableExopackGlowPacket, EnableExopackGlowPacket::play)
.playToServer(DisableExopackGlowPacket.TYPE, DisableExopackGlowPacket.CODEC, DisableExopackGlowPacket::play) .playToServer(DisableExopackGlowPacket.TYPE, DisableExopackGlowPacket, DisableExopackGlowPacket::play)
.playToServer(ResetExopackColorPacket.TYPE, ResetExopackColorPacket.CODEC, ResetExopackColorPacket::play) .playToServer(ResetExopackColorPacket.TYPE, ResetExopackColorPacket, ResetExopackColorPacket::play)
.playToServer(SetExopackColorPacket.TYPE, SetExopackColorPacket.CODEC, SetExopackColorPacket::play) .playToServer(SetExopackColorPacket.TYPE, SetExopackColorPacket.CODEC, SetExopackColorPacket::play)
.playToServer(QuickStackPacket.TYPE, QuickStackPacket.CODEC, QuickStackPacket::play)
// otm player general // otm player general
r r

View File

@ -1316,7 +1316,7 @@ class MatteryPlayer(val ply: Player) {
val ANDROID_IMMUNE_EFFECTS: TagKey<MobEffect> = TagKey.create(BuiltInRegistries.MOB_EFFECT.key(), ResourceLocation(OverdriveThatMatters.MOD_ID, "android_immune_effects")) val ANDROID_IMMUNE_EFFECTS: TagKey<MobEffect> = TagKey.create(BuiltInRegistries.MOB_EFFECT.key(), ResourceLocation(OverdriveThatMatters.MOD_ID, "android_immune_effects"))
fun onPlayerTickPre(event: PlayerTickEvent.Pre) { internal fun onPlayerTickPre(event: PlayerTickEvent.Pre) {
val ent = event.entity val ent = event.entity
if (!ent.level().isClientSide) { if (!ent.level().isClientSide) {
@ -1324,7 +1324,7 @@ class MatteryPlayer(val ply: Player) {
} }
} }
fun onPlayerTickPost(event: PlayerTickEvent.Pre) { internal fun onPlayerTickPost(event: PlayerTickEvent.Pre) {
val ent = event.entity val ent = event.entity
if (ent.level().isClientSide) { if (ent.level().isClientSide) {
@ -1334,7 +1334,7 @@ class MatteryPlayer(val ply: Player) {
} }
} }
fun isMobEffectApplicable(event: MobEffectEvent.Applicable) { internal fun isMobEffectApplicable(event: MobEffectEvent.Applicable) {
event.entity.matteryPlayer?.let { event.entity.matteryPlayer?.let {
if (it.isAndroid && BuiltInRegistries.MOB_EFFECT.getOrCreateTag(ANDROID_IMMUNE_EFFECTS).any { it == event.effectInstance?.effect }) { if (it.isAndroid && BuiltInRegistries.MOB_EFFECT.getOrCreateTag(ANDROID_IMMUNE_EFFECTS).any { it == event.effectInstance?.effect }) {
event.result = MobEffectEvent.Applicable.Result.DO_NOT_APPLY event.result = MobEffectEvent.Applicable.Result.DO_NOT_APPLY
@ -1342,18 +1342,18 @@ class MatteryPlayer(val ply: Player) {
} }
} }
fun onHurtEvent(event: LivingIncomingDamageEvent) { internal fun onHurtEvent(event: LivingIncomingDamageEvent) {
event.entity.matteryPlayer?.onHurt(event) event.entity.matteryPlayer?.onHurt(event)
} }
fun onPlayerChangeDimensionEvent(event: PlayerEvent.PlayerChangedDimensionEvent) { internal fun onPlayerChangeDimensionEvent(event: PlayerEvent.PlayerChangedDimensionEvent) {
onceServer { onceServer {
event.entity.matteryPlayer.invalidateNetworkState() event.entity.matteryPlayer.invalidateNetworkState()
event.entity.matteryPlayer.recreateExoPackMenu() event.entity.matteryPlayer.recreateExoPackMenu()
} }
} }
fun onPlayerDeath(event: LivingDeathEvent) { internal fun onPlayerDeath(event: LivingDeathEvent) {
val ply = event.entity as? Player ?: return val ply = event.entity as? Player ?: return
if (ply.matteryPlayer.lastDeathTick != ply.tickCount) { if (ply.matteryPlayer.lastDeathTick != ply.tickCount) {
@ -1378,7 +1378,7 @@ class MatteryPlayer(val ply: Player) {
} }
} }
fun onPlayerCloneEvent(event: PlayerEvent.Clone) { internal fun onPlayerCloneEvent(event: PlayerEvent.Clone) {
val it = event.entity.matteryPlayer val it = event.entity.matteryPlayer
val original = event.original.matteryPlayer val original = event.original.matteryPlayer
@ -1406,7 +1406,7 @@ class MatteryPlayer(val ply: Player) {
private val LOGGER = LogManager.getLogger() private val LOGGER = LogManager.getLogger()
fun onPlayerSpawnPhantoms(event: PlayerSpawnPhantomsEvent) { internal fun onPlayerSpawnPhantoms(event: PlayerSpawnPhantomsEvent) {
if (event.entity.matteryPlayer.isAndroid) { if (event.entity.matteryPlayer.isAndroid) {
event.result = PlayerSpawnPhantomsEvent.Result.DENY event.result = PlayerSpawnPhantomsEvent.Result.DENY
} }
@ -1507,7 +1507,7 @@ class MatteryPlayer(val ply: Player) {
PacketDistributor.sendToServer(PickItemFromInventoryPacket(targetSlot, itemSlot)) PacketDistributor.sendToServer(PickItemFromInventoryPacket(targetSlot, itemSlot))
} }
fun onStartTracking(event: PlayerEvent.StartTracking) { internal fun onStartTracking(event: PlayerEvent.StartTracking) {
if (event.target is ServerPlayer) { if (event.target is ServerPlayer) {
(event.target as ServerPlayer).matteryPlayer.let { (event.target as ServerPlayer).matteryPlayer.let {
it.remoteSynchers[event.entity as ServerPlayer] = it.publicSyncher.Remote() it.remoteSynchers[event.entity as ServerPlayer] = it.publicSyncher.Remote()
@ -1515,7 +1515,7 @@ class MatteryPlayer(val ply: Player) {
} }
} }
fun onStopTracking(event: PlayerEvent.StopTracking) { internal fun onStopTracking(event: PlayerEvent.StopTracking) {
if (event.target is ServerPlayer) { if (event.target is ServerPlayer) {
(event.target as ServerPlayer).matteryPlayer.remoteSynchers.remove(event.entity as ServerPlayer) (event.target as ServerPlayer).matteryPlayer.remoteSynchers.remove(event.entity as ServerPlayer)
} }

View File

@ -23,7 +23,7 @@ object AndroidResearchDescriptions {
registrar.register("plain") { PlainAndroidResearchDescription } registrar.register("plain") { PlainAndroidResearchDescription }
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
} }
@ -149,7 +149,7 @@ interface AndroidResearchDescription {
registry.byNameCodec().dispatch({ it.type }, { it.codec }) registry.byNameCodec().dispatch({ it.type }, { it.codec })
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
bus.addListener(delegate::build) bus.addListener(delegate::build)
} }

View File

@ -93,11 +93,11 @@ object AndroidResearchManager : SimpleJsonResourceReloadListener(GsonBuilder().s
} }
} }
fun reloadEvent(event: AddReloadListenerEvent) { internal fun reloadEvent(event: AddReloadListenerEvent) {
event.addListener(this) event.addListener(this)
} }
fun syncEvent(event: OnDatapackSyncEvent) { internal fun syncEvent(event: OnDatapackSyncEvent) {
val packet = SyncPacket(researchMap.values) val packet = SyncPacket(researchMap.values)
if (event.player != null) { if (event.player != null) {

View File

@ -55,7 +55,7 @@ object AndroidResearchResults {
val NANOBOTS_ARMOR_STRENGTH: AndroidResearchResult.Singleton<*> by registrar.register("nanobots_armor_strength") { NanobotsArmorStrength } val NANOBOTS_ARMOR_STRENGTH: AndroidResearchResult.Singleton<*> by registrar.register("nanobots_armor_strength") { NanobotsArmorStrength }
val NANOBOTS_ARMOR_SPEED: AndroidResearchResult.Singleton<*> by registrar.register("nanobots_armor_speed") { NanobotsArmorSpeed } val NANOBOTS_ARMOR_SPEED: AndroidResearchResult.Singleton<*> by registrar.register("nanobots_armor_speed") { NanobotsArmorSpeed }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
} }
} }
@ -162,7 +162,7 @@ interface AndroidResearchResult {
registry.byNameCodec().dispatch({ it.type }, { it.codec }) registry.byNameCodec().dispatch({ it.type }, { it.codec })
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
bus.addListener(delegate::build) bus.addListener(delegate::build)
} }
} }

View File

@ -392,7 +392,7 @@ class EnderTeleporterFeature(capability: MatteryPlayer) : AndroidActiveFeature(A
val SPRITE = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/item/black_hole.png").sprite(0f, 0f, 16f, 16f, 16f, 16f) val SPRITE = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/item/black_hole.png").sprite(0f, 0f, 16f, 16f, 16f, 16f)
fun onEntityDeath(event: LivingDeathEvent) { internal fun onEntityDeath(event: LivingDeathEvent) {
val android = event.entity.matteryPlayer ?: return val android = event.entity.matteryPlayer ?: return
val server = NULLABLE_MINECRAFT_SERVER ?: return val server = NULLABLE_MINECRAFT_SERVER ?: return

View File

@ -14,7 +14,7 @@ object CommandArgumentTypes {
ArgumentTypeInfos.registerByClass(AndroidResearchArgument::class.java, SingletonArgumentInfo.contextFree(AndroidResearchArgument.Companion::create)) ArgumentTypeInfos.registerByClass(AndroidResearchArgument::class.java, SingletonArgumentInfo.contextFree(AndroidResearchArgument.Companion::create))
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }
} }

View File

@ -1,6 +1,5 @@
package ru.dbotthepony.mc.otm.registry package ru.dbotthepony.mc.otm.registry
import net.minecraft.advancements.CriteriaTriggers
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.neoforged.bus.api.IEventBus import net.neoforged.bus.api.IEventBus
import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger
@ -29,7 +28,7 @@ import ru.dbotthepony.mc.otm.triggers.TakeItemOutOfReplicatorTrigger
object MCriteriaTriggers { object MCriteriaTriggers {
private val registrar = MDeferredRegister(BuiltInRegistries.TRIGGER_TYPES) private val registrar = MDeferredRegister(BuiltInRegistries.TRIGGER_TYPES)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
} }

View File

@ -250,7 +250,7 @@ object MRegistry : IBlockItemRegistryAcceptor {
}*/ }*/
} }
fun initialize(bus: IEventBus) { internal fun initialize(bus: IEventBus) {
bus.addListener(features::build) bus.addListener(features::build)
bus.addListener(this::initializeClient) bus.addListener(this::initializeClient)
bus.addListener(this::initializeCommon) bus.addListener(this::initializeCommon)

View File

@ -14,11 +14,11 @@ object MStructureTags {
val FIELD_RESEARCH_PODS = create("field_research_pods") val FIELD_RESEARCH_PODS = create("field_research_pods")
val WRECKAGES = create("wreckages") val WRECKAGES = create("wreckages")
fun create(location: String): TagKey<Structure> { private fun create(location: String): TagKey<Structure> {
return TagKey.create(Registries.STRUCTURE, loc(location)) return TagKey.create(Registries.STRUCTURE, loc(location))
} }
fun registerVillagerTrades(event: VillagerTradesEvent) { internal fun registerVillagerTrades(event: VillagerTradesEvent) {
if (event.type == VillagerProfession.CARTOGRAPHER) { if (event.type == VillagerProfession.CARTOGRAPHER) {
with (event.trades.get(2)) { with (event.trades.get(2)) {
add(VillagerTrades.TreasureMapForEmeralds(10, WRECKAGES, "filled_map.otm_wreckage", add(VillagerTrades.TreasureMapForEmeralds(10, WRECKAGES, "filled_map.otm_wreckage",

View File

@ -13,7 +13,7 @@ object LootModifiers {
registry.register("loot_appender") { LootPoolAppender.CODEC } registry.register("loot_appender") { LootPoolAppender.CODEC }
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }
} }

View File

@ -9,7 +9,7 @@ import ru.dbotthepony.mc.otm.registry.MDeferredRegister
object MHeightProviders { object MHeightProviders {
private val registry = MDeferredRegister(BuiltInRegistries.HEIGHT_PROVIDER_TYPE) private val registry = MDeferredRegister(BuiltInRegistries.HEIGHT_PROVIDER_TYPE)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }

View File

@ -19,7 +19,7 @@ object MItemFunctionTypes {
val PROCEDURAL_EXOPACK_UPGRADE by registry.register("exopack_upgrade") { LootItemFunctionType(ProceduralExopackSlotUpgradeItem.Randomizer.CODEC) } val PROCEDURAL_EXOPACK_UPGRADE by registry.register("exopack_upgrade") { LootItemFunctionType(ProceduralExopackSlotUpgradeItem.Randomizer.CODEC) }
val MATTER_DUST by registry.register("matter_dust") { LootItemFunctionType(MatterDustItem.Randomizer.CODEC) } val MATTER_DUST by registry.register("matter_dust") { LootItemFunctionType(MatterDustItem.Randomizer.CODEC) }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }
} }

View File

@ -23,7 +23,7 @@ object MLootItemConditions {
val KILLED_BY_REAL_PLAYER_OR_INDIRECTLY: LootItemConditionType by registry.register("killed_by_real_player_or_indirectly") { LootItemConditionType(SingletonCodec(KilledByRealPlayerOrIndirectly)) } val KILLED_BY_REAL_PLAYER_OR_INDIRECTLY: LootItemConditionType by registry.register("killed_by_real_player_or_indirectly") { LootItemConditionType(SingletonCodec(KilledByRealPlayerOrIndirectly)) }
val CHANCE: LootItemConditionType by registry.register("chance") { LootItemConditionType(ChanceCondition.CODEC) } val CHANCE: LootItemConditionType by registry.register("chance") { LootItemConditionType(ChanceCondition.CODEC) }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }
} }

View File

@ -10,7 +10,7 @@ import ru.dbotthepony.mc.otm.registry.MDeferredRegister
object MLootNumberProviders { object MLootNumberProviders {
private val registry = MDeferredRegister(BuiltInRegistries.LOOT_NUMBER_PROVIDER_TYPE, OverdriveThatMatters.MOD_ID) private val registry = MDeferredRegister(BuiltInRegistries.LOOT_NUMBER_PROVIDER_TYPE, OverdriveThatMatters.MOD_ID)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }

View File

@ -9,7 +9,7 @@ import ru.dbotthepony.mc.otm.registry.MDeferredRegister
object MPlacementModifiers { object MPlacementModifiers {
private val registry = MDeferredRegister(BuiltInRegistries.PLACEMENT_MODIFIER_TYPE) private val registry = MDeferredRegister(BuiltInRegistries.PLACEMENT_MODIFIER_TYPE)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }

View File

@ -8,7 +8,7 @@ import ru.dbotthepony.mc.otm.worldgen.feature.BlackHolePlacerFeature
object MWorldGenFeatures { object MWorldGenFeatures {
private val registry = MDeferredRegister(BuiltInRegistries.FEATURE) private val registry = MDeferredRegister(BuiltInRegistries.FEATURE)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }

View File

@ -38,7 +38,7 @@ object AndroidFeatures {
val JUMP_BOOST by registry.register(MNames.JUMP_BOOST) { AndroidFeatureType(::JumpBoostFeature) } val JUMP_BOOST by registry.register(MNames.JUMP_BOOST) { AndroidFeatureType(::JumpBoostFeature) }
val ENDER_TELEPORTER by registry.register(MNames.ENDER_TELEPORTER) { AndroidFeatureType(::EnderTeleporterFeature) } val ENDER_TELEPORTER by registry.register(MNames.ENDER_TELEPORTER) { AndroidFeatureType(::EnderTeleporterFeature) }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }
} }

View File

@ -15,7 +15,7 @@ import ru.dbotthepony.mc.otm.registry.MItemTags
object MArmorMaterials { object MArmorMaterials {
private val registrar = MDeferredRegister(BuiltInRegistries.ARMOR_MATERIAL) private val registrar = MDeferredRegister(BuiltInRegistries.ARMOR_MATERIAL)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
} }

View File

@ -64,7 +64,7 @@ object MBlockColors {
event.register(HoloSightColor, MBlocks.HOLO_SIGN) event.register(HoloSightColor, MBlocks.HOLO_SIGN)
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
bus.addListener(this::registerBlockColors) bus.addListener(this::registerBlockColors)
bus.addListener(this::registerItemColors) bus.addListener(this::registerItemColors)
} }

View File

@ -118,7 +118,7 @@ object MBlockEntities {
val HOLO_SIGN: BlockEntityType<HoloSignBlockEntity> by registry.register(MNames.HOLO_SIGN) { BlockEntityType.Builder.of(::HoloSignBlockEntity, MBlocks.HOLO_SIGN).build(null) } val HOLO_SIGN: BlockEntityType<HoloSignBlockEntity> by registry.register(MNames.HOLO_SIGN) { BlockEntityType.Builder.of(::HoloSignBlockEntity, MBlocks.HOLO_SIGN).build(null) }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
bus.addListener(this::registerClient) bus.addListener(this::registerClient)
} }

View File

@ -136,7 +136,7 @@ object MBlocks {
} }
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
bus.addListener(MBlocks::registerCapabilities) bus.addListener(MBlocks::registerCapabilities)
} }

View File

@ -8,6 +8,8 @@ import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.material.Fluids import net.minecraft.world.level.material.Fluids
import net.neoforged.api.distmarker.Dist
import net.neoforged.bus.api.EventPriority
import net.neoforged.bus.api.IEventBus import net.neoforged.bus.api.IEventBus
import net.neoforged.neoforge.capabilities.Capabilities import net.neoforged.neoforge.capabilities.Capabilities
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent
@ -23,6 +25,7 @@ import ru.dbotthepony.mc.otm.core.util.CreativeMenuItemComparator
import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MDeferredRegister
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
import ru.dbotthepony.mc.otm.registry.game.MItems.BATTERY_CREATIVE import ru.dbotthepony.mc.otm.registry.game.MItems.BATTERY_CREATIVE
import thedarkcolour.kotlinforforge.neoforge.forge.DIST
private fun CreativeModeTab.Output.accept(values: Collection<Item>) { private fun CreativeModeTab.Output.accept(values: Collection<Item>) {
for (item in values) { for (item in values) {
@ -394,11 +397,15 @@ object MCreativeTabs {
.build() .build()
} }
fun initialize(bus: IEventBus) { internal fun initialize(bus: IEventBus) {
registry.register(bus) registry.register(bus)
if (DIST == Dist.CLIENT) {
bus.addListener(EventPriority.NORMAL, ::register)
}
} }
fun register(event: BuildCreativeModeTabContentsEvent) { private fun register(event: BuildCreativeModeTabContentsEvent) {
CreativeMenuItemComparator.invalidate() CreativeMenuItemComparator.invalidate()
when (event.tab) { when (event.tab) {

View File

@ -117,7 +117,7 @@ object MDataComponentTypes {
Configurator Configurator
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }
} }

View File

@ -68,7 +68,7 @@ object MEntityTypes {
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
bus.addListener(this::registerAttributes) bus.addListener(this::registerAttributes)
bus.addListener(this::registerClient) bus.addListener(this::registerClient)

View File

@ -19,7 +19,7 @@ object MFluids {
private val types = MDeferredRegister(NeoForgeRegistries.FLUID_TYPES.key()) private val types = MDeferredRegister(NeoForgeRegistries.FLUID_TYPES.key())
private val fluids = MDeferredRegister(BuiltInRegistries.FLUID) private val fluids = MDeferredRegister(BuiltInRegistries.FLUID)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
types.register(bus) types.register(bus)
fluids.register(bus) fluids.register(bus)
} }

View File

@ -86,7 +86,7 @@ object MItems {
return registry.coloredWithBase(name) { color -> BlockItem(blocks[color]!!, properties) } return registry.coloredWithBase(name) { color -> BlockItem(blocks[color]!!, properties) }
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }

View File

@ -130,7 +130,7 @@ object MMenus {
val STORAGE_IMPORTER_EXPORTER by registry.register(MNames.STORAGE_IMPORTER) { MenuType(::StorageImporterExporterMenu, FeatureFlags.VANILLA_SET) } val STORAGE_IMPORTER_EXPORTER by registry.register(MNames.STORAGE_IMPORTER) { MenuType(::StorageImporterExporterMenu, FeatureFlags.VANILLA_SET) }
val STORAGE_POWER_SUPPLIER by registry.register(MNames.STORAGE_POWER_SUPPLIER) { MenuType(::StoragePowerSupplierMenu, FeatureFlags.VANILLA_SET) } val STORAGE_POWER_SUPPLIER by registry.register(MNames.STORAGE_POWER_SUPPLIER) { MenuType(::StoragePowerSupplierMenu, FeatureFlags.VANILLA_SET) }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
bus.addListener(this::registerScreens) bus.addListener(this::registerScreens)
} }

View File

@ -22,7 +22,7 @@ object MRecipes {
private val types = MDeferredRegister(BuiltInRegistries.RECIPE_TYPE, OverdriveThatMatters.MOD_ID) private val types = MDeferredRegister(BuiltInRegistries.RECIPE_TYPE, OverdriveThatMatters.MOD_ID)
private val serializers = MDeferredRegister(BuiltInRegistries.RECIPE_SERIALIZER, OverdriveThatMatters.MOD_ID) private val serializers = MDeferredRegister(BuiltInRegistries.RECIPE_SERIALIZER, OverdriveThatMatters.MOD_ID)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
types.register(bus) types.register(bus)
serializers.register(bus) serializers.register(bus)
} }

View File

@ -27,7 +27,7 @@ object MSoundEvents {
val LOADER_AMBIENT by make("loader_ambient") val LOADER_AMBIENT by make("loader_ambient")
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }
} }

View File

@ -13,7 +13,7 @@ import ru.dbotthepony.mc.otm.registry.StatNames.POWER_CONSUMED
object MStats { object MStats {
private val registrar = MDeferredRegister(BuiltInRegistries.CUSTOM_STAT) private val registrar = MDeferredRegister(BuiltInRegistries.CUSTOM_STAT)
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
registrar.register(bus) registrar.register(bus)
} }

View File

@ -4,7 +4,7 @@ import net.neoforged.neoforge.event.RegisterCommandsEvent
import ru.dbotthepony.mc.otm.server.command.* import ru.dbotthepony.mc.otm.server.command.*
object MCommands { object MCommands {
fun register(event: RegisterCommandsEvent) { internal fun register(event: RegisterCommandsEvent) {
ExopackCommand.register(event) ExopackCommand.register(event)
AndroidCommand.register(event) AndroidCommand.register(event)
} }

View File

@ -130,7 +130,7 @@ abstract class StorageStack<S : StorageStack<S>>(val count: BigInteger) {
) )
} }
fun register(bus: IEventBus) { internal fun register(bus: IEventBus) {
bus.addListener(delegate::build) bus.addListener(delegate::build)
registrar.register(bus) registrar.register(bus)
} }

View File

@ -123,7 +123,7 @@ object KillAsAndroidTrigger : MCriterionTrigger<KillAsAndroidTrigger.Instance>(R
playerPredicate: Optional<ContextAwarePredicate> = Optional.empty(), playerPredicate: Optional<ContextAwarePredicate> = Optional.empty(),
) : AbstractInstance(playerPredicate) ) : AbstractInstance(playerPredicate)
fun onKill(event: LivingDeathEvent) { internal fun onKill(event: LivingDeathEvent) {
if (event.entity is ElderGuardian) { if (event.entity is ElderGuardian) {
val killer = event.source.entity val killer = event.source.entity