@@ -140,8 +140,8 @@ LL_TYPE_INSTANCE_HOOK(
140140 return origin (playerOpenContainerEvent);
141141}
142142
143- LL_TYPE_INSTANCE_HOOK (
144- CloseContainerHook ,
143+ LL_TYPE_INSTANCE_HOOK ( // 玩家手动关闭/退出游戏
144+ CloseContainerHook1 ,
145145 HookPriority::Normal,
146146 ServerPlayer,
147147 &ServerPlayer::doDeleteContainerManager,
@@ -151,18 +151,50 @@ LL_TYPE_INSTANCE_HOOK(
151151 IF_LISTENED (EVENT_TYPES::onCloseContainer) {
152152 if (mContainerManager ) {
153153 if (auto * pos = std::get_if<BlockPos>(&*mContainerManager ->mScreenContext ->mOwner ); pos) {
154- CallEvent (
155- EVENT_TYPES::onCloseContainer,
156- PlayerClass::newPlayer (this ),
157- BlockClass::newBlock (*pos, getDimensionId ().id )
158- );
154+ if (getDimensionBlockSource ().getBlock (*pos).mBlockType ->isContainerBlock ()) {
155+ CallEvent (
156+ EVENT_TYPES::onCloseContainer,
157+ PlayerClass::newPlayer (this ),
158+ BlockClass::newBlock (*pos, getDimensionId ().id )
159+ );
160+ }
159161 }
160162 }
161163 }
162164 IF_LISTENED_END (EVENT_TYPES::onCloseContainer);
163165 origin (forceDisconnect);
164166}
165167
168+ LL_TYPE_INSTANCE_HOOK ( // 方块被推动被迫关闭
169+ CloseContainerHook2,
170+ HookPriority::Normal,
171+ PistonBlockActor,
172+ &PistonBlockActor::_spawnMovingBlock,
173+ void ,
174+ BlockSource& region,
175+ BlockPos const & blockPos
176+ ) {
177+ if (region.getBlock (blockPos).mBlockType ->isContainerBlock ()) {
178+ IF_LISTENED (EVENT_TYPES::onCloseContainer) {
179+ region.mDimension .forEachPlayer ([&](Player& player) -> bool {
180+ if (player.mContainerManager ) {
181+ if (auto * pos = std::get_if<BlockPos>(&*player.mContainerManager ->mScreenContext ->mOwner );
182+ pos && *pos == blockPos) {
183+ CallEvent (
184+ EVENT_TYPES::onCloseContainer,
185+ PlayerClass::newPlayer (&player),
186+ BlockClass::newBlock (*pos, player.getDimensionId ().id )
187+ );
188+ }
189+ }
190+ return true ;
191+ });
192+ }
193+ IF_LISTENED_END (EVENT_TYPES::onCloseContainer);
194+ }
195+ origin (region, blockPos);
196+ }
197+
166198LL_TYPE_INSTANCE_HOOK (
167199 ChangeSlotHook,
168200 HookPriority::Normal,
@@ -635,7 +667,10 @@ void DropItem() {
635667 DropItemHook2::hook ();
636668}
637669void OpenContainerEvent () { OpenContainerHook::hook (); }
638- void CloseContainerEvent () { CloseContainerHook::hook (); }
670+ void CloseContainerEvent () {
671+ CloseContainerHook1::hook ();
672+ CloseContainerHook2::hook ();
673+ }
639674void ChangeSlotEvent () { ChangeSlotHook::hook (); }
640675void AttackBlockEvent () { StartDestroyBlockHook::hook (); }
641676void UseFrameEvent () {
0 commit comments