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
/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.graph.matter.MatterNode;
import ru.dbotthepony.mc.otm.graph.storage.StorageNode;
import ru.dbotthepony.mc.otm.storage.StorageStack;
import javax.annotation.Nonnull;
@ -70,4 +69,8 @@ public class MatteryCapability {
@Nonnull
@NotNull
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
}
fun recordClientThread() {
internal fun recordClientThread() {
clientThreads.add(Thread.currentThread())
}
@ -186,19 +186,19 @@ var SERVER_IS_LIVE = false
private val LOGGER = LogManager.getLogger()
fun onServerTickPre(event: ServerTickEvent.Pre) {
internal fun onServerTickPre(event: ServerTickEvent.Pre) {
preServerTick.tick()
serverThreads.add(Thread.currentThread())
}
fun onServerTickPost(event: ServerTickEvent.Post) {
internal fun onServerTickPost(event: ServerTickEvent.Post) {
postServerTick.tick()
// чтоб не плодить кучу подписчиков, вызовем напрямую отсюда
GraphNodeList.tick()
AbstractProfiledStorage.onServerPostTick()
}
fun onLevelTickPre(event: LevelTickEvent.Pre) {
internal fun onLevelTickPre(event: LevelTickEvent.Pre) {
preWorldTick[event.level]?.tick()
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()
}
@ -310,7 +310,7 @@ private fun clear() {
postWorldTick.clear()
}
fun onServerStarting(event: ServerAboutToStartEvent) {
internal fun onServerStarting(event: ServerAboutToStartEvent) {
clear()
SERVER_IS_LIVE = true
_server = event.server
@ -318,13 +318,13 @@ fun onServerStarting(event: ServerAboutToStartEvent) {
serverCounter.incrementAndGet()
}
fun onServerStopping(event: ServerStoppingEvent) {
internal fun onServerStopping(event: ServerStoppingEvent) {
clear()
SERVER_IS_LIVE = false
serverCounter.incrementAndGet()
}
fun onServerStopped(event: ServerStoppedEvent) {
internal fun onServerStopped(event: ServerStoppedEvent) {
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!")

View File

@ -154,7 +154,6 @@ object OverdriveThatMatters {
MOD_BUS.addListener(EventPriority.NORMAL, TritaniumArmorModel::register)
MOD_BUS.addListener(EventPriority.NORMAL, GravitationStabilizerModel::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, 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
playerMap.remove(level)
tickingMap.remove(level)
}
fun onServerStopping(event: ServerStoppingEvent) {
internal fun onServerStopping(event: ServerStoppingEvent) {
playerMap.clear()
tickingMap.clear()
}
fun postLevelTick(event: LevelTickEvent.Post) {
internal fun postLevelTick(event: LevelTickEvent.Post) {
val level = event.level as? ServerLevel ?: return
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
.computeIfAbsent(event.level) { Long2ObjectOpenHashMap() }
.computeIfAbsent(event.pos.toLong(), Long2ObjectFunction { ChunkSubscribers(event.level, it) })
.subscribe(event.player)
}
fun onForget(event: ChunkWatchEvent.UnWatch) {
internal fun onForget(event: ChunkWatchEvent.UnWatch) {
val levelMap = playerMap[event.level] ?: 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) {
tree.values.removeIf {
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 ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock
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.SlottedContainer
import ru.dbotthepony.mc.otm.core.TranslatableComponent
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.makeSlots
import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
import ru.dbotthepony.mc.otm.registry.game.MSoundEvents
@ -57,6 +61,10 @@ class CargoCrateBlockEntity(
.build()
.also(::addDroppableContainer)
init {
exposeSideless(MatteryCapability.QUICK_STACK_CONTAINER, IQuickStackContainer.Simple(makeSlots(container, ::MatteryMenuSlot)))
}
private var interactingPlayers = 0
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
}
fun mappingsChanged(event: IdMappingEvent) {
internal fun mappingsChanged(event: IdMappingEvent) {
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())
}

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) {
return
}
@ -73,7 +73,7 @@ object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConfl
}
}
fun onRenderLevel(event: RenderLevelStageEvent) {
internal fun onRenderLevel(event: RenderLevelStageEvent) {
if (!isDown) {
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)
}
}

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)
if (isDown && event.action == 0 && key.type == InputConstants.Type.MOUSE && InputConstants.Type.MOUSE.getOrCreate(event.button) == key) {
isDown = false
@ -311,7 +311,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
const val COOLDOWN_ICON_SIZE = 18f
const val COOLDOWN_ICON_MARGIN = 12f
fun onRenderGuiEvent(event: RenderGuiEvent.Post) {
internal fun onRenderGuiEvent(event: RenderGuiEvent.Post) {
if (!grabbedInput) {
lastRender = milliTimeD
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)
}
}

View File

@ -38,7 +38,7 @@ import ru.dbotthepony.mc.otm.menu.MatteryMenu
import ru.dbotthepony.mc.otm.registry.game.AndroidFeatures
import java.util.WeakHashMap
fun onMovementInputUpdate(event: MovementInputUpdateEvent) {
internal fun onMovementInputUpdate(event: MovementInputUpdateEvent) {
val ply = event.entity
val input = event.input
@ -198,7 +198,7 @@ private fun exosuitInventoryLogic(screen: Screen, addListener: (GuiEventListener
scrollbar.scroll = inventoryScroll
}
fun onMouseDragged(event: ScreenEvent.MouseDragged.Pre) {
internal fun onMouseDragged(event: ScreenEvent.MouseDragged.Pre) {
val screen = minecraft.screen as? AbstractContainerScreen<*> ?: return
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
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
inventoryLogic(event)
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) {
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_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) {
val itemTags = ArrayList<TagKey<Item>>()
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)
BEAM_CURSOR = GLFW.glfwCreateStandardCursor(GLFW.GLFW_IBEAM_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) {
GLFW.glfwSetCursor(minecraft.window.window, ARROW_CURSOR)
MODIFIED_CURSOR = false
@ -116,22 +116,22 @@ fun tickWhileClientPre(condition: () -> Boolean, ticker: () -> Unit) {
tickClientPre(IConditionalTickable.wrap(condition, ticker))
}
fun onClientTickPre(event: ClientTickEvent.Pre) {
internal fun onClientTickPre(event: ClientTickEvent.Pre) {
preTickList.tick()
}
fun onClientTickPost(event: ClientTickEvent.Post) {
internal fun onClientTickPost(event: ClientTickEvent.Post) {
postTickList.tick()
}
fun onClientDisconnected(event: ClientPlayerNetworkEvent.LoggingOut) {
internal fun onClientDisconnected(event: ClientPlayerNetworkEvent.LoggingOut) {
LOGGED_IN = false
preTickList.clear()
postTickList.clear()
}
fun onClientConnected(event: ClientPlayerNetworkEvent.LoggingIn) {
internal fun onClientConnected(event: ClientPlayerNetworkEvent.LoggingIn) {
LOGGED_IN = true
preTickList.clear()

View File

@ -48,7 +48,7 @@ object MatteryGUI {
private val buttonShaker = Random()
fun onScreenRender(event: ScreenEvent.Render.Pre) {
internal fun onScreenRender(event: ScreenEvent.Render.Pre) {
val screen = minecraft.screen as? InBedChatScreen
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
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 (event.name == VanillaGuiLayers.FOOD_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.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
object MatteryTooltipComponents {
fun gatherComponents(event: RenderTooltipEvent.GatherComponents) {
internal fun gatherComponents(event: RenderTooltipEvent.GatherComponents) {
val energyCap = event.itemStack.getCapability(MatteryCapability.ITEM_ENERGY)
if (energyCap != null && energyCap.maxBatteryLevel > Decimal.ZERO) {
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(MatterStorageGaugeTooltip::class.java) { it }
}

View File

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

View File

@ -63,7 +63,7 @@ object ShockwaveRenderer {
private const val EXPANSION_PER_SECOND = 18f
fun onRender(event: RenderLevelStageEvent) {
internal fun onRender(event: RenderLevelStageEvent) {
if (event.stage !== RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
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)
companion object {
fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) {
internal fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) {
for (i in 0 .. 11) {
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)
companion object {
fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) {
internal fun onRegisterAdditionalModels(event: ModelEvent.RegisterAdditional) {
for (i in 0 .. 11) {
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.core.math.integerDivisionDown
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.QuickStackPacket
import yalter.mousetweaks.api.MouseTweaksDisableWheelTweak
import java.util.function.IntConsumer
@MouseTweaksDisableWheelTweak
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()
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
}

View File

@ -457,14 +457,13 @@ class DeviceControls<out S : MatteryScreen<*>>(
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 {
addButton(this)
}
private var buttons: List<EditablePanel<S>>? = null
fun makeButtons() {
if (buttons == null) {
buttons = doMakeButtons().also {

View File

@ -40,15 +40,11 @@ val isCuriosLoaded by lazy {
ModList.get().isLoaded(CuriosApi.MODID)
}
fun onCuriosSlotModifiersUpdated(event: SlotModifiersUpdatedEvent) {
internal fun onCuriosSlotModifiersUpdated(event: SlotModifiersUpdatedEvent) {
check(isCuriosLoaded) { "Curios is not loaded!" }
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>> {
val handler = getCapability(CuriosCapability.INVENTORY) ?: return listOf()

View File

@ -1,11 +1,24 @@
package ru.dbotthepony.mc.otm.compat.vanilla
import net.minecraft.core.BlockPos
import net.minecraft.core.registries.Registries
import net.minecraft.world.Container
import net.minecraft.world.flag.FeatureFlags
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.neoforge.capabilities.IBlockCapabilityProvider
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent
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
object VanillaMenuTypes {
@ -22,9 +35,26 @@ object VanillaMenuTypes {
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)
bus.addListener(this::registerScreens)
bus.addListener(this::registerCapabilities)
}
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.StreamSupport
import kotlin.NoSuchElementException
import kotlin.enums.EnumEntries
import kotlin.jvm.optionals.getOrNull
import kotlin.math.ln
import kotlin.math.sqrt
@ -301,6 +302,10 @@ fun OutputStream.writeItemType(value: Item) {
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 {
val id = readInt()
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 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.roundToIntVector() = Vec3i(x.roundToInt(), y.roundToInt(), z.roundToInt())

View File

@ -198,7 +198,7 @@ object FlywheelMaterials : SimpleJsonResourceReloadListener(GsonBuilder().setPre
).apply(it, ::Entry)
}
fun reloadEvent(event: AddReloadListenerEvent) {
internal fun reloadEvent(event: AddReloadListenerEvent) {
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) {
PacketDistributor.sendToAllPlayers(SyncPacket(elements))
} else {
@ -235,7 +235,7 @@ object FlywheelMaterials : SimpleJsonResourceReloadListener(GsonBuilder().setPre
}
}
fun tooltipEvent(event: ItemTooltipEvent) {
internal fun tooltipEvent(event: ItemTooltipEvent) {
if (minecraft.window.isShiftDown) {
val item = event.itemStack.item

View File

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

View File

@ -1,8 +1,10 @@
package ru.dbotthepony.mc.otm.entity
import net.minecraft.core.BlockPos
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.player.Player
import kotlin.properties.ReadWriteProperty
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 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 {
@SubscribeEvent
fun onEntityJoin(event: EntityJoinLevelEvent) {
internal fun onEntityJoin(event: EntityJoinLevelEvent) {
val entity = event.entity
if (entity is WitherSkeleton) {

View File

@ -106,7 +106,7 @@ class ChestUpgraderItem : MatteryItem(Properties().stacksTo(1)) {
}
companion object {
fun onEntityInteract(event: PlayerInteractEvent.EntityInteract) {
internal fun onEntityInteract(event: PlayerInteractEvent.EntityInteract) {
if (event.target !is MinecartChest) return
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
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) {
return
}

View File

@ -317,7 +317,7 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc
}
companion object {
fun clientDisconnect(event: ClientPlayerNetworkEvent.LoggingOut) {
internal fun clientDisconnect(event: ClientPlayerNetworkEvent.LoggingOut) {
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) {
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_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.entity.getItemBySlot(EquipmentSlot.FEET).let { !it.isEmpty && it.item == MItems.TRITANIUM_BOOTS } &&

View File

@ -107,7 +107,7 @@ class NotNormalFood(
}
companion object {
fun onInteract(event: EntityInteract) {
internal fun onInteract(event: EntityInteract) {
val item = event.itemStack.item as? NotNormalFood ?: 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 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
if (item is ExplosiveHammerItem) {

View File

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

View File

@ -114,7 +114,7 @@ abstract class AbstractRegistryAction(
registrar.register("blacklist") { BlacklistAction.Companion }
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
registrar.register(bus)
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 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)
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 }
fun tooltipEvent(event: ItemTooltipEvent) {
internal fun tooltipEvent(event: ItemTooltipEvent) {
if (ClientConfig.Tooltip.ALWAYS_DISPLAY_MATTER_VALUE || minecraft.window.isShiftDown) {
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(Resolver)
}
fun initialize(bus: IEventBus) {
internal fun initialize(bus: IEventBus) {
bus.addListener(Resolver.delegate::build)
Resolver.registrar.register(bus)
}
@ -1633,7 +1633,7 @@ object MatterManager {
return 0
}
fun addCommands(event: RegisterCommandsEvent) {
internal fun addCommands(event: RegisterCommandsEvent) {
event.dispatcher.register(
Commands.literal("dump_matter_registry")
.requires { it.hasPermission(Commands.LEVEL_OWNERS) }
@ -1686,7 +1686,7 @@ object MatterManager {
syncRegistry(server.registryAccess(), PacketDistributor::sendToAllPlayers)
}
fun onDataPackSync(event: OnDatapackSyncEvent) {
internal fun onDataPackSync(event: OnDatapackSyncEvent) {
if (!registryIsBuilt)
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(Registry.ready) { "Matter registry is not ready somehow" }
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.collect.ConditionalSet
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.widget.ProfiledLevelGaugeWidget
import ru.dbotthepony.mc.otm.network.MatteryStreamCodec
@ -346,13 +347,10 @@ abstract class MatteryMenu(
override fun stillValid(player: Player): Boolean {
if (tile == null) return true
if (player.level().getBlockEntity(tile.blockPos) !== tile) {
if (player.level().getBlockEntity(tile.blockPos) !== tile)
return false
}
val pos = tile.blockPos
return player.distanceToSqr(pos.x.toDouble() + 0.5, pos.y.toDouble() + 0.5, pos.z.toDouble() + 0.5) <= 64.0
return player.checkCanInteract(tile.blockPos)
}
fun syncCarried() {

View File

@ -28,6 +28,18 @@ fun <T : CustomPacketPayload> PayloadRegistrar.playToServer(
handler: KFunction1<IPayloadContext, Unit>
): 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 {
val underlying = ByteBufAllocator.DEFAULT.buffer()
val buf = RegistryFriendlyByteBuf(underlying, registry, ConnectionType.NEOFORGE)

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.network
import it.unimi.dsi.fastutil.bytes.ByteArrayList
import net.minecraft.core.BlockPos
import net.minecraft.core.particles.ParticleTypes
import net.minecraft.network.FriendlyByteBuf
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.game.ClientboundSetCarriedItemPacket
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.inventory.Slot
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 org.apache.logging.log4j.LogManager
import ru.dbotthepony.kommons.math.RGBAColor
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.client.minecraft
import ru.dbotthepony.mc.otm.container.get
import ru.dbotthepony.mc.otm.container.set
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.component2
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.otmRandom
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.writeItem
import ru.dbotthepony.mc.otm.entity.checkCanInteract
import ru.dbotthepony.mc.otm.menu.ExopackInventoryMenu
import ru.dbotthepony.mc.otm.menu.QuickMoveInput
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashSet
class MatteryPlayerDataPacket(val bytes: ByteArrayList, val isPublic: Boolean, val target: UUID? = null) : CustomPacketPayload {
fun write(buff: FriendlyByteBuf) {
@ -245,9 +265,6 @@ object ExopackMenuOpen : CustomPacketPayload {
"exopack_menu_open"
)
)
val CODEC: StreamCodec<FriendlyByteBuf, ExopackMenuOpen> =
StreamCodec.ofMember({ _, _ -> }, { ExopackMenuOpen })
}
class PickItemFromInventoryPacket(
@ -347,8 +364,6 @@ object DisplayExopackPacket : CustomPacketPayload {
"display_exopack"
)
)
val CODEC: StreamCodec<FriendlyByteBuf, DisplayExopackPacket> =
StreamCodec.ofMember({ _, _ -> }, { DisplayExopackPacket })
}
object HideExopackPacket : CustomPacketPayload {
@ -366,8 +381,6 @@ object HideExopackPacket : CustomPacketPayload {
"hide_exopack"
)
)
val CODEC: StreamCodec<FriendlyByteBuf, HideExopackPacket> =
StreamCodec.ofMember({ _, _ -> }, { HideExopackPacket })
}
object EnableExopackGlowPacket : CustomPacketPayload {
@ -385,8 +398,6 @@ object EnableExopackGlowPacket : CustomPacketPayload {
"enable_exopack_glow"
)
)
val CODEC: StreamCodec<FriendlyByteBuf, EnableExopackGlowPacket> =
StreamCodec.ofMember({ _, _ -> }, { EnableExopackGlowPacket })
}
object DisableExopackGlowPacket : CustomPacketPayload {
@ -404,8 +415,6 @@ object DisableExopackGlowPacket : CustomPacketPayload {
"disable_exopack_glow"
)
)
val CODEC: StreamCodec<FriendlyByteBuf, DisableExopackGlowPacket> =
StreamCodec.ofMember({ _, _ -> }, { DisableExopackGlowPacket })
}
object ResetExopackColorPacket : CustomPacketPayload {
@ -423,8 +432,80 @@ object ResetExopackColorPacket : CustomPacketPayload {
"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 {

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> {
protected abstract fun getFirst(value: P): A
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.TasksChangePacket
fun registerNetworkPackets(event: RegisterPayloadHandlersEvent) {
val r = event.registrar("1.5.0")
internal fun registerNetworkPackets(event: RegisterPayloadHandlersEvent) {
val r = event.registrar("1.5.1")
// world
r
@ -44,16 +44,17 @@ fun registerNetworkPackets(event: RegisterPayloadHandlersEvent) {
.playToClient(ExopackSlotPacket.TYPE, ExopackSlotPacket.CODEC, ExopackSlotPacket::play)
.playToClient(ExopackMenuInitPacket.TYPE, ExopackMenuInitPacket.CODEC, ExopackMenuInitPacket::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(DisplayExopackPacket.TYPE, DisplayExopackPacket.CODEC, DisplayExopackPacket::play)
.playToServer(HideExopackPacket.TYPE, HideExopackPacket.CODEC, HideExopackPacket::play)
.playToServer(EnableExopackGlowPacket.TYPE, EnableExopackGlowPacket.CODEC, EnableExopackGlowPacket::play)
.playToServer(DisableExopackGlowPacket.TYPE, DisableExopackGlowPacket.CODEC, DisableExopackGlowPacket::play)
.playToServer(ResetExopackColorPacket.TYPE, ResetExopackColorPacket.CODEC, ResetExopackColorPacket::play)
.playToServer(DisplayExopackPacket.TYPE, DisplayExopackPacket, DisplayExopackPacket::play)
.playToServer(HideExopackPacket.TYPE, HideExopackPacket, HideExopackPacket::play)
.playToServer(EnableExopackGlowPacket.TYPE, EnableExopackGlowPacket, EnableExopackGlowPacket::play)
.playToServer(DisableExopackGlowPacket.TYPE, DisableExopackGlowPacket, DisableExopackGlowPacket::play)
.playToServer(ResetExopackColorPacket.TYPE, ResetExopackColorPacket, ResetExopackColorPacket::play)
.playToServer(SetExopackColorPacket.TYPE, SetExopackColorPacket.CODEC, SetExopackColorPacket::play)
.playToServer(QuickStackPacket.TYPE, QuickStackPacket.CODEC, QuickStackPacket::play)
// otm player general
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"))
fun onPlayerTickPre(event: PlayerTickEvent.Pre) {
internal fun onPlayerTickPre(event: PlayerTickEvent.Pre) {
val ent = event.entity
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
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 {
if (it.isAndroid && BuiltInRegistries.MOB_EFFECT.getOrCreateTag(ANDROID_IMMUNE_EFFECTS).any { it == event.effectInstance?.effect }) {
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)
}
fun onPlayerChangeDimensionEvent(event: PlayerEvent.PlayerChangedDimensionEvent) {
internal fun onPlayerChangeDimensionEvent(event: PlayerEvent.PlayerChangedDimensionEvent) {
onceServer {
event.entity.matteryPlayer.invalidateNetworkState()
event.entity.matteryPlayer.recreateExoPackMenu()
}
}
fun onPlayerDeath(event: LivingDeathEvent) {
internal fun onPlayerDeath(event: LivingDeathEvent) {
val ply = event.entity as? Player ?: return
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 original = event.original.matteryPlayer
@ -1406,7 +1406,7 @@ class MatteryPlayer(val ply: Player) {
private val LOGGER = LogManager.getLogger()
fun onPlayerSpawnPhantoms(event: PlayerSpawnPhantomsEvent) {
internal fun onPlayerSpawnPhantoms(event: PlayerSpawnPhantomsEvent) {
if (event.entity.matteryPlayer.isAndroid) {
event.result = PlayerSpawnPhantomsEvent.Result.DENY
}
@ -1507,7 +1507,7 @@ class MatteryPlayer(val ply: Player) {
PacketDistributor.sendToServer(PickItemFromInventoryPacket(targetSlot, itemSlot))
}
fun onStartTracking(event: PlayerEvent.StartTracking) {
internal fun onStartTracking(event: PlayerEvent.StartTracking) {
if (event.target is ServerPlayer) {
(event.target as ServerPlayer).matteryPlayer.let {
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) {
(event.target as ServerPlayer).matteryPlayer.remoteSynchers.remove(event.entity as ServerPlayer)
}

View File

@ -23,7 +23,7 @@ object AndroidResearchDescriptions {
registrar.register("plain") { PlainAndroidResearchDescription }
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
registrar.register(bus)
}
@ -149,7 +149,7 @@ interface AndroidResearchDescription {
registry.byNameCodec().dispatch({ it.type }, { it.codec })
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
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)
}
fun syncEvent(event: OnDatapackSyncEvent) {
internal fun syncEvent(event: OnDatapackSyncEvent) {
val packet = SyncPacket(researchMap.values)
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_SPEED: AndroidResearchResult.Singleton<*> by registrar.register("nanobots_armor_speed") { NanobotsArmorSpeed }
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
registrar.register(bus)
}
}
@ -162,7 +162,7 @@ interface AndroidResearchResult {
registry.byNameCodec().dispatch({ it.type }, { it.codec })
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
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)
fun onEntityDeath(event: LivingDeathEvent) {
internal fun onEntityDeath(event: LivingDeathEvent) {
val android = event.entity.matteryPlayer ?: 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))
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
registry.register(bus)
}
}

View File

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

View File

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

View File

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

View File

@ -9,7 +9,7 @@ import ru.dbotthepony.mc.otm.registry.MDeferredRegister
object MHeightProviders {
private val registry = MDeferredRegister(BuiltInRegistries.HEIGHT_PROVIDER_TYPE)
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
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 MATTER_DUST by registry.register("matter_dust") { LootItemFunctionType(MatterDustItem.Randomizer.CODEC) }
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
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 CHANCE: LootItemConditionType by registry.register("chance") { LootItemConditionType(ChanceCondition.CODEC) }
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
registry.register(bus)
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -64,7 +64,7 @@ object MBlockColors {
event.register(HoloSightColor, MBlocks.HOLO_SIGN)
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
bus.addListener(this::registerBlockColors)
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) }
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
registry.register(bus)
bus.addListener(this::registerClient)
}

View File

@ -136,7 +136,7 @@ object MBlocks {
}
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
registry.register(bus)
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.ItemStack
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.neoforge.capabilities.Capabilities
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.MRegistry
import ru.dbotthepony.mc.otm.registry.game.MItems.BATTERY_CREATIVE
import thedarkcolour.kotlinforforge.neoforge.forge.DIST
private fun CreativeModeTab.Output.accept(values: Collection<Item>) {
for (item in values) {
@ -394,11 +397,15 @@ object MCreativeTabs {
.build()
}
fun initialize(bus: IEventBus) {
internal fun initialize(bus: IEventBus) {
registry.register(bus)
if (DIST == Dist.CLIENT) {
bus.addListener(EventPriority.NORMAL, ::register)
}
}
fun register(event: BuildCreativeModeTabContentsEvent) {
private fun register(event: BuildCreativeModeTabContentsEvent) {
CreativeMenuItemComparator.invalidate()
when (event.tab) {

View File

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

View File

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

View File

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

View File

@ -86,7 +86,7 @@ object MItems {
return registry.coloredWithBase(name) { color -> BlockItem(blocks[color]!!, properties) }
}
fun register(bus: IEventBus) {
internal fun register(bus: IEventBus) {
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_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)
bus.addListener(this::registerScreens)
}

View File

@ -22,7 +22,7 @@ object MRecipes {
private val types = MDeferredRegister(BuiltInRegistries.RECIPE_TYPE, 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)
serializers.register(bus)
}

View File

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

View File

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

View File

@ -4,7 +4,7 @@ import net.neoforged.neoforge.event.RegisterCommandsEvent
import ru.dbotthepony.mc.otm.server.command.*
object MCommands {
fun register(event: RegisterCommandsEvent) {
internal fun register(event: RegisterCommandsEvent) {
ExopackCommand.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)
registrar.register(bus)
}

View File

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