Обновление блока при изменении другого

Версия Minecraft
1.12.2
3,005
192
592
Есть свой блок с тайлом.
Нужно обновить переменную в тайле когда изменяется инвентарь 1 из 6 блоков вокруг тайла.
Как такое можно сделать?

~~

Тип есть свой блок в мире.
Во круг него в 6 сторон света могут стоять другие блоки.
У них может быть инвентарь, а может и не быть.

Нужно, когда инвентарь другого блока возле моего блока обновился - изменить переменную в моем тайле (к пример просто изменить boolean на false).

~~

Без использования хуков.
Блоки могут быть ЛЮБЫЕ из ЛЮБЫХ модов.
 
1,038
57
229
Без использования хуков.
я так не играю.. 😁
Ставим хук на закрытие инвентаря. Если блок не наш, начинаем мониторить инвентарь всех 7 блоков (шучу).
Тут что-то есть Home - Forge Documentation
в итоге, всё сведется к перехвату пакета об обновлении.
Наверняка в WorldEvent, тоже есть полезная инфа по тем блокам что сейчас обновляются или должны перерисоваться (то есть в них что-то изменилось, останется лишь проверить есть ли у них тайл с инвентарём)

А вот это вообще бы куда нить закрепить Minecraft Modding: Event Handling
думаю там тоже найдется подсказка

Client events (net.minecraftforge.client.event):

  • CameraSetupEvent -- New in release 1473+
  • ClientChatReceivedEvent
  • DrawBlockHighlightEvent
  • FogColors -- New in release 1117+
  • FogDensity -- New in release 1117+
  • RenderFogEvent -- New in release 1189+
  • FOVUpdateEvent
  • GuiOpenEvent
  • GuiScreenEvent.ActionPerformedEvent
  • GuiScreenEvent.DrawScreenEvent
  • GuiScreenEvent.InitGuiEvent
  • GuiScreenEvent.KeyboardInputEvent -- New in release 1459+
  • GuiScreenEvent.MouseInputEvent -- New in release 1459+
  • MouseEvent -- does not fire if GUI that pauses game is open
  • ModelBakeEvent -- New in release 1296+
  • RenderBlockOverlayEvent -- New in release 1174+
  • RenderGameOverlayEvent.Chat
  • RenderGameOverlayEvent.Pre
  • RenderGameOverlayEvent.Post
  • RenderGameOverlayEvent.Text
  • RenderHandEvent
  • RenderItemInFrameEvent-- New in release 1160+
  • RenderLivingEvent.Pre
  • RenderLivingEvent.Post
  • RenderPlayerEvent.Pre
  • RenderPlayerEvent.Post
  • RenderPlayerEvent.SetArmorModel
  • RenderWorldEvent.Pre
  • RenderWorldEvent.Post
  • RenderWorldLastEvent
  • TextureStitchEvent.Pre
  • TextureStitchEvent.Post
Miscellaneous events (net.minecraftforge.event):

  • ForceChunkEvent
  • UnforceChunkEvent
  • AnvilUpdateEvent
  • CommandEvent
  • ServerChatEvent
Brewing events (net.minecraftforge.event.brewing)

  • PotionBrewedEvent.Pre -- New in release 1296+
  • PotionBrewedEvent.Post -- New in release 1296+
Entity events (net.minecraftforge.event.entity)

  • EnteringChunk
  • EntityConstructing (useful for registering extended entity properties, but fired at beginning of constructor so most fields like position unlikely to be initialized at this point)
  • EntityJoinWorldEvent
  • EntityMountEvent -- New in release 1338+
  • EntityStruckByLightningEvent
  • PlaySoundAtEntityEvent

Item events (net.minecraftforge.event.entity.item)

  • ItemExpireEvent
  • ItemTossEvent

EntityLiving events (net.minecraftforge.event.entity.living):

  • LivingJumpEvent
  • LivingUpdateEvent
  • EnderTeleportEvent
  • LivingAttackEvent e.g. Check if the damage source is explosion damage. If so, cancel the event to make immune from explosions (maybe based on potion or armor).
  • LivingDeathEvent
  • LivingDropsEvent. See Jabelar's Drop Event Tutorial
  • LivingExperienceDropsEvent -- New in release 1443+
  • LivingFallEvent -- canceling this will prevent fall damage
  • LivingHealEvent -- New in release 1296+
  • LivingHurtEvent -- the damage amount passed is before armor and potion effects are calculated
  • LivingPackSizeEvent
  • LivingSetAttackTargetEvent
  • LivingSpawnEvent -- this isn't really fired separately, but rather fires for any child. Not as useful as you'd suspect. If you want to do something when entity "arrives" try to use EnteringChunk or EntityJoinWorld event.
  • ZombieEvent
  • CheckSpawn -- this doesn't fire during world gen, only during game, and also for some reason this doesn't seem to fire for EntityAnimal or its subclasses.
  • SpecialSpawn
  • AllowDespawn -- setting the result to anything other than Result.DEFAULT will override the canDespawn() method for the entity. For example, Result.ALLOW will forceably despawn it no matter what.
Player events (net.minecraftforge.event.entity.player)

  • AchievementEvent
  • AnvilRepairEvent
  • ArrowLooseEvent
  • ArrowNockEvent
  • AttackEntityEvent
  • BonemealEvent
  • BreakSpeed
  • Clone
  • EntityInteractEvent
  • EntityItemPickupEvent
  • FillBucketEvent
  • HarvestCheck
  • ItemTooltipEvent
  • NameFormat
  • LoadFromFile
  • PlayerDestroyItemEvent
  • PlayerDropsEvent
  • PlayerFlyableFallEvent
  • PlayerInteractEvent -- LEFT_CLICK_BLOCK only fires on server side, RIGHT_CLICK_BLOCK fires on both sides, RIGHT_CLICK_AIR only fires on client side (and gives block position of 0, 0, 0). Use packets to notify other side if needed. Some items like bucket are quirky and to cancel the behavior completely you need to send a S23PacketBlockChange to the client.
  • PlayerOpenContainerEvent
  • PlayerPickupXpEvent
  • PlayerSleepInBedEvent
  • PlayerUseItemEvent.Start
  • PlayerUseItemEvent.Tick
  • PlayerUseItemEvent.Finish
  • PlayerUseItemEvent.Stop
  • PlayerWakeUpEvent -- New in release 1225+
  • SaveToFile
  • StartTracking -- useful for performance optimization as it allows you to only process entities (including players) that are within range to be tracked.
  • StopTracking -- useful for performance optimization as it allows you to only process entities (including players) that are within range to be tracked.
  • UseHoeEvent
Minecart events (net.minecraftforge.event.entity.minecart)

  • MinecartCollisionEvent
  • MinecartInteractEvent
  • MinecartUpdateEvent
Block events (net.minecraftforge.event.world)

  • BreakEvent
  • HarvestDropsEvent -- note this is actual harvest (a block like BlockLeaves cannot be harvested) with an appropriate tool. If you're trying to create a "harvest" that normally doesn't trigger, use the BlockEvent.BreakEvent instead.
  • MultiPlaceEvent

  • NeighborNotifyEvent -- New in release 1333+
  • NoteBlockEvent.Change
  • NoteBlockEvent.Play
  • PlaceEvent

World events (net.minecraftforge.event.world)

  • CreateSpawnPosition -- New in release 1296+
  • ExplosionEvent.Start -- New in release 1296+
  • ExplosionEvent.Detonate -- New in release 1296+. This event passes a list parameter that contains all entities affected by the explosion. You can remove entities that you want to make immune.
  • WorldEvent.Load
  • PotentialSpawns
  • WorldEvent.Unload
Chunk events (net.minecraftforge.event.world)

  • ChunkEvent.Save
  • ChunkEvent.Unload
  • ChunkDataEvent.Load
  • ChunkDataEvent.Save
  • ChunkWatchEvent.Watch
  • ChunkWatchEvent.UnWatch
Fluid events (net.minecraftforge.fluids):

  • FluidContainerRegisterEvent
  • FluidDrainingEvent
  • FluidFillingEvent
  • FluidMotionEvent
  • FluidRegisterEvent
  • FluidSpilledEvent
Ore registry events (net.minecraftforge.oredict)

  • OreRegisterEvent
Populate chunk events (net.minecraftforge.event.terraingen)


Note
: The PopulateChunkEvent events which are in the same package are actually fired on the EVENT_BUS.

  • PopulateChunkEvent.Pre
  • PopulateChunkEvent.Populate
  • PopulateChunkEvent.Post


  • InputEvent
  • KeyInputEvent
  • MouseInputEvent
Player events (cpw.mods.fml.common.gameevent.PlayerEvent):

  • PlayerEvent
  • ItemCraftedEvent
  • ItemPickupEvent
  • ItemSmeltedEvent
  • PlayerChangedDimensionEvent
  • PlayerLoggedInEvent
  • PlayerLoggedOutEvent
  • PlayerRespawnEvent
  • PlayerWakeUpEvent -- New
Config GUI Events (New!)

Tick Events (cpw.mods.fml.common.gameevent.TickEvent):

  • ClientTickEvent -- fires twice per tick (START and END phase). Note that it may tick even if a world is not running so you should check if (!Minecraft.getMinecraft().isGamePaused() && Minecraft.getMinecraft().thePlayer != null) if you want to confirm a world is running.
  • PlayerTickEvent -- fires twice per tick (START and END phase).
  • WorldTickEvent -- fires twice per tick (START and END phase) per dimension. So in most cases it will fire six times (Overworld, Nether, and End). Note it is only fired on server side.
  • RenderTickEvent -- fires twice per tick (START and END phase).
  • ServerTickEvent -- fires twice per tick (START and END phase).
Networking Events:

  • ClientConnectedToServerEvent
  • ClientDisconnectionFromServerEvent
  • ServerConnectionFromClientEvent
  • ServerDisconnectionFromClientEvent
  • CustomPacketRegistrationEvent
  • ClientCustomPacketEvent
  • ServerCustomPacketEvent
  • CustomNetworkEvent



Events On MinecraftForge.TERRAIN_GEN_BUS

For some reason, Forge breaks off some events onto separate buses. The terrain generation events have their own handler. Here is list all the known terrain generation events.

List Of Events On TERRAIN_GEN_BUS

Terrain generation events:


  • BiomeEvent
  • BiomeColor
  • CreateDecorator
  • GetGrassColor
  • GetFoliageColor
  • GetVillageBlockID
  • GetVillageBlockMeta
  • GetWaterColor
  • ChunkProviderEvent
  • InitNoiseField
  • ReplaceBiomeBlocks
  • DecorateBiomeEvent.Decorate
  • DecorateBiomeEvent.Pre
  • DecorateBiomeEvent.Post
  • InitMapGenEvent
  • SaplingGrowTreeEvent
  • WorldTypeEvent.BiomeSize
  • WorldTypeEvent.InitBiomeGens

Note: The PopulateChunkEvent events which are in the same package are actually fired on the EVENT_BUS.

Events On MinecraftForge.ORE_GEN_BUS

The ore generation events have their own handler. Here is list of all the known ore generation events.

List Of Events On ORE_GEN_BUS


  • GenerateMinable
  • OreGenEvent.Pre
  • OreGenEvent.Post
 
Последнее редактирование:
3,005
192
592
3,005
192
592
всё сведется к перехвату пакета об обновлении
Если идет передача предметов через трубы, никакие события на сколько я знаю не отправляются.
Все эти "обновления" нужны больше для клиента.
 
1,038
57
229
в том то и проблема, что при перемещении вещей через трубы идёт излишний обмен пакетов между сервером и клиентом, именно из-за этого индустриальные сервера визжат и плачут.
Тайл обновляется точно, можно даже ради любопытство отследить все тайлы перемещения предмета. А также отследить EntityItem.
И возможно в других модах (не являющихся IC2, BC2, Forestry), всё таки начали использовать meta или она используется там для электричества.
Попробуй ради эксперимента пологировать перемещения из пункта A в Б
 
7,099
324
1,510
Сохраняй в своем тайле состояния окружающих тайлов. Каждый тик чекай окружающие тайлы. Если состояние изменилось - изменяешь переменную
 
1,038
57
229
3,005
192
592
7,099
324
1,510
Согласен, лагливо будет. Но, допустим, если не требуется конкретный diff состояний, то можно сравнивать "хэш-сумму" инвентарей
~~~
Если бы по стандарту в капабилити использовалась InventoryBasic, а не ItemStackHandler, то можно было бы любому инвентарю навесить слушатель изменения состояния
 
3,005
192
592
7,099
324
1,510
Есть упоротый вариант: заменить капу соседних блоков на свою, в которой будет нотификация центрального блока
 
1,038
57
229
Для начала наверное надо исключить множество(сундуки, трубы, электричество) взять конкретный пример с двумя сундуками из пункта А в пункт Б.
Яж прям сам загорелся проверить как это работает. Возьму ic и bc , и посмотрю как там всё устроено. Может и найду чего
 
1,038
57
229
Последнее редактирование:
7,099
324
1,510
Так это только в BC. На каждый мод с трубами делать индивидуальную интеграцию?
 
1,038
57
229
ну так проще мне кажется, чем семафорить Tile, можно конечно написать трансформер на два метода у тайла
setInventorySlotContents, decrStackSize и closeInventory, но... в этом случае ты будешь получать изменения всех сундуков, даже если это не по трубе. Кто му же на последнее, вроде есть собственное событие.
В любом случае, если модов нет (а это можно проверить), то использовать только событие игрока. А если есть, лучше использовать события для трубы. Возможно и в IC и в Foretrsy и в других модах на провода есть какие то свои события.
Я просто не силён в трансформерах, помню делал по тутору и убрал урон от кактуса и взрыв криппера. Но это было так давно, что сейчас я не смогу помочь по этому направлению.
 
Последнее редактирование:
7,099
324
1,510
setInventorySlotContents, decrStackSize и closeInventory
Не забывай, что на новых версиях стандартом считается капабилити

Дело не в том, что в других модах нет своих событий обновления труб, а в том ,что для каждого мода придется писать интеграцию индивидуально
 
Сверху