private void UpdateOmokBoard() { IPlayer player = clientAPI.World.Player; PlayerData playerData = PlayerManager.Instance.GetOrAddPlayerData(player); // Update renderer if no longer looking at Omok board BlockPos selectedOmokBoardPos = playerData.SelectedOmokBoardPos; bool isSelectingBlock = (player.CurrentBlockSelection != null); if (selectedOmokBoardPos == null) { return; } // Execute if the player is either not looking at a block, or if the current selected block isn't an Omok board if (!isSelectingBlock || (isSelectingBlock && player.CurrentBlockSelection.Position != playerData.SelectedOmokBoardPos)) { if (player.Entity.World.BlockAccessor.GetBlockEntity(selectedOmokBoardPos) is BEOmokTableTop beOmok) { RendererOmok rendererOmok = beOmok.OmokRenderer; if (rendererOmok != null && rendererOmok.AvailableMovesMesh != null && !rendererOmok.AvailableMovesMesh.Disposed) { rendererOmok.DisposeAvailableMovesMesh(); } } } }
// Loads all available moves public override void OnBeingLookedAt(IPlayer byPlayer, BlockSelection blockSel, bool firstTick) { if (api.Side == EnumAppSide.Client) { ICoreClientAPI cAPI = (ICoreClientAPI)api; BlockPos blockPos = blockSel.Position; BEOmokTableTop beOmok = (BEOmokTableTop)cAPI.World.BlockAccessor.GetBlockEntity(blockPos); if (beOmok == null) { return; } RendererOmok renderer = beOmok.OmokRenderer; // Load available space mesh if the looked at spot is free if (beOmok == null || !IsViableSpace(beOmok, blockSel, out int pieceX, out int pieceZ)) { renderer.DisposeAvailableMovesMesh(); return; } // Store Selected Omok Board Position PlayerData playerData = PlayerManager.Instance.GetOrAddPlayerData(byPlayer); playerData.SelectedOmokBoardPos = blockPos; renderer.LoadAvailableMovesMesh(cAPI, byPlayer, blockSel.Position, pieceX, pieceZ); } base.OnBeingLookedAt(byPlayer, blockSel, firstTick); }