Jump to content

[1.16.2] Custom Piston Block


samjviana

Recommended Posts

I'm trying to create an custom piston with another slime color. And i actully did make it work but having some problems.
The piston itself cannot be pushed and i couldn't find out how to change that.
When the piston is retracting the piston head texture changes to the default and and the retraction ends it changes back to the actual texture.

When i break the piston while extended the head remains.

Please correct me if I did something wrong or if something could be done better.

The Piston Head code:

public class BlackStickyPistonHeadBlock extends PistonHeadBlock {
    public BlackStickyPistonHeadBlock(Properties properties) {
        super(properties);
    }
    
    @Override
    public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
        return super.isValidPosition(state, worldIn, pos);
    }  

    @Override
    public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) {
        if (facing.getOpposite() == stateIn.get(FACING)) {
            if (!stateIn.isValidPosition(worldIn, currentPos))
            {
                return stateIn;
            }
        }
        if (!stateIn.isValidPosition(worldIn, currentPos)) {
            if (facing.getOpposite() == stateIn.get(FACING))
            {
                return Blocks.AIR.getDefaultState();
            }
        }
        return stateIn;
    }
}

The Piston Block code (Most part of it is just "copied" from the vanilla PistonBlock code):

public class BlackStickyPistonBlock extends PistonBlock {
    private final boolean isSticky;

    public BlackStickyPistonBlock(boolean sticky, Properties properties) {
        super(sticky, properties);
        this.isSticky = sticky;
    }

    private boolean doMove(World worldIn, BlockPos pos, Direction directionIn, boolean extending) {
        BlockPos blockpos = pos.offset(directionIn);
        if (!extending && worldIn.getBlockState(blockpos).isIn(ModBlocks.BLACK_STICKY_PISTON_HEAD.get())) {
            worldIn.setBlockState(blockpos, Blocks.AIR.getDefaultState(), 20);
        }

        PistonBlockStructureHelper pistonblockstructurehelper = new PistonBlockStructureHelper(worldIn, pos, directionIn, extending);
        if (!pistonblockstructurehelper.canMove()) {
            return false;
        }
        else {
            Map<BlockPos, BlockState> map = Maps.newHashMap();
            List<BlockPos> list = pistonblockstructurehelper.getBlocksToMove();
            List<BlockState> list1 = Lists.newArrayList();

            for (int i = 0; i < list.size(); ++i) {
                BlockPos blockpos1 = list.get(i);
                BlockState blockstate = worldIn.getBlockState(blockpos1);
                list1.add(blockstate);
                map.put(blockpos1, blockstate);
            }

            List<BlockPos> list2 = pistonblockstructurehelper.getBlocksToDestroy();
            BlockState[] ablockstate = new BlockState[list.size() + list2.size()];
            Direction direction = extending ? directionIn : directionIn.getOpposite();
            int j = 0;

            for (int k = list2.size() - 1; k >= 0; --k) {
                BlockPos blockpos2 = list2.get(k);
                BlockState blockstate1 = worldIn.getBlockState(blockpos2);
                TileEntity tileentity = blockstate1.hasTileEntity() ? worldIn.getTileEntity(blockpos2) : null;
                spawnDrops(blockstate1, worldIn, blockpos2, tileentity);
                worldIn.setBlockState(blockpos2, Blocks.AIR.getDefaultState(), 18);
                ablockstate[j++] = blockstate1;
            }

            for (int l = list.size() - 1; l >= 0; --l) {
                BlockPos blockpos3 = list.get(l);
                BlockState blockstate5 = worldIn.getBlockState(blockpos3);
                blockpos3 = blockpos3.offset(direction);
                map.remove(blockpos3);
                worldIn.setBlockState(blockpos3, Blocks.MOVING_PISTON.getDefaultState().with(FACING, directionIn), 68);
                worldIn.setTileEntity(blockpos3, MovingPistonBlock.createTilePiston(list1.get(l), directionIn, extending, false));
                ablockstate[j++] = blockstate5;
            }

            if (extending) {
                PistonType pistontype = this.isSticky ? PistonType.STICKY : PistonType.DEFAULT;
                BlockState blockstate4 = ModBlocks.BLACK_STICKY_PISTON_HEAD.get().getDefaultState().with(PistonHeadBlock.FACING, directionIn).with(PistonHeadBlock.TYPE, pistontype);
                BlockState blockstate6 = Blocks.MOVING_PISTON.getDefaultState().with(MovingPistonBlock.FACING, directionIn).with(MovingPistonBlock.TYPE, this.isSticky ? PistonType.STICKY : PistonType.DEFAULT);
                map.remove(blockpos);
                worldIn.setBlockState(blockpos, blockstate6, 68);
                worldIn.setTileEntity(blockpos, MovingPistonBlock.createTilePiston(blockstate4, directionIn, true, true));
            }

            BlockState blockstate3 = Blocks.AIR.getDefaultState();

            for (BlockPos blockpos4 : map.keySet()) {
                worldIn.setBlockState(blockpos4, blockstate3, 82);
            }

            for (Entry<BlockPos, BlockState> entry : map.entrySet()) {
                BlockPos blockpos5 = entry.getKey();
                BlockState blockstate2 = entry.getValue();
                blockstate2.updateDiagonalNeighbors(worldIn, blockpos5, 2);
                blockstate3.func_235734_a_(worldIn, blockpos5, 2);
                blockstate3.updateDiagonalNeighbors(worldIn, blockpos5, 2);
            }

            j = 0;

            for (int i1 = list2.size() - 1; i1 >= 0; --i1) {
                BlockState blockstate7 = ablockstate[j++];
                BlockPos blockpos6 = list2.get(i1);
                blockstate7.updateDiagonalNeighbors(worldIn, blockpos6, 2);
                worldIn.notifyNeighborsOfStateChange(blockpos6, blockstate7.getBlock());
            }

            for (int j1 = list.size() - 1; j1 >= 0; --j1) {
                worldIn.notifyNeighborsOfStateChange(list.get(j1), ablockstate[j++].getBlock());
            }

            if (extending) {
                worldIn.notifyNeighborsOfStateChange(blockpos, ModBlocks.BLACK_STICKY_PISTON_HEAD.get());
            }

            return true;
        }
    }

    private boolean shouldBeExtended(World worldIn, BlockPos pos, Direction facing) {
        for(Direction direction : Direction.values()) {
            if (direction != facing && worldIn.isSidePowered(pos.offset(direction), direction)) {
                return true;
            }
        }

        if (worldIn.isSidePowered(pos, Direction.DOWN)) {
            return true;
        }
        else {
            BlockPos blockpos = pos.up();

            for(Direction direction1 : Direction.values()) {
                if (direction1 != Direction.DOWN && worldIn.isSidePowered(blockpos.offset(direction1), direction1)) {
                    return true;
                }
            }

            return false;
        }
    }
      
    @Override
    public boolean eventReceived(BlockState state, World worldIn, BlockPos pos, int id, int param) {
        Direction direction = state.get(FACING);
        if (!worldIn.isRemote) {
            boolean flag = this.shouldBeExtended(worldIn, pos, direction);
            if (flag && (id == 1 || id == 2)) {
                worldIn.setBlockState(pos, state.with(EXTENDED, Boolean.valueOf(true)), 2);
                return false;
            }

            if (!flag && id == 0) {
                return false;
            }
        }

        if (id == 0) {
            if (net.minecraftforge.event.ForgeEventFactory.onPistonMovePre(worldIn, pos, direction, true))
                return false;
            if (!this.doMove(worldIn, pos, direction, true)) {
                return false;
            }

            worldIn.setBlockState(pos, state.with(EXTENDED, Boolean.valueOf(true)), 67);
            worldIn.playSound((PlayerEntity) null, pos, SoundEvents.BLOCK_PISTON_EXTEND, SoundCategory.BLOCKS, 0.5F,
                    worldIn.rand.nextFloat() * 0.25F + 0.6F);
        } else if (id == 1 || id == 2) {
            if (net.minecraftforge.event.ForgeEventFactory.onPistonMovePre(worldIn, pos, direction, false))
                return false;
            TileEntity tileentity1 = worldIn.getTileEntity(pos.offset(direction));
            if (tileentity1 instanceof PistonTileEntity) {
                ((PistonTileEntity) tileentity1).clearPistonTileEntity();
            }

            BlockState blockstate = Blocks.MOVING_PISTON.getDefaultState().with(MovingPistonBlock.FACING, direction)
                    .with(MovingPistonBlock.TYPE, this.isSticky ? PistonType.STICKY : PistonType.DEFAULT);
            worldIn.setBlockState(pos, blockstate, 20);
            worldIn.setTileEntity(pos, MovingPistonBlock.createTilePiston(
                    this.getDefaultState().with(FACING, Direction.byIndex(param & 7)), direction, false, true));
            worldIn.func_230547_a_(pos, blockstate.getBlock());
            blockstate.func_235734_a_(worldIn, pos, 2);
            if (this.isSticky) {
                BlockPos blockpos = pos.add(direction.getXOffset() * 2, direction.getYOffset() * 2,
                        direction.getZOffset() * 2);
                BlockState blockstate1 = worldIn.getBlockState(blockpos);
                boolean flag1 = false;
                if (blockstate1.isIn(Blocks.MOVING_PISTON)) {
                    TileEntity tileentity = worldIn.getTileEntity(blockpos);
                    if (tileentity instanceof PistonTileEntity) {
                        PistonTileEntity pistontileentity = (PistonTileEntity) tileentity;
                        if (pistontileentity.getFacing() == direction && pistontileentity.isExtending()) {
                            pistontileentity.clearPistonTileEntity();
                            flag1 = true;
                        }
                    }
                }

                if (!flag1) {
                    if (id != 1 || blockstate1.isAir()
                            || !canPush(blockstate1, worldIn, blockpos, direction.getOpposite(), false, direction)
                            || blockstate1.getPushReaction() != PushReaction.NORMAL && !blockstate1.isIn(Blocks.PISTON)
                                    && !blockstate1.isIn(Blocks.STICKY_PISTON)) {
                        worldIn.removeBlock(pos.offset(direction), false);
                    } else {
                        this.doMove(worldIn, pos, direction, false);
                    }
                }
            } else {
                worldIn.removeBlock(pos.offset(direction), false);
            }

            worldIn.playSound((PlayerEntity) null, pos, SoundEvents.BLOCK_PISTON_CONTRACT, SoundCategory.BLOCKS, 0.5F,
                    worldIn.rand.nextFloat() * 0.15F + 0.6F);
        }

        net.minecraftforge.event.ForgeEventFactory.onPistonMovePost(worldIn, pos, direction, (id == 0));
        return true;
    }
}

 

Edited by samjviana
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • 2023(2024 Remidial Admission Form for Veritas University, Abuja Pre degree/Direct-Entry form ☎️08039816237 OR {2348039816237} JUPEB Form, Postgraduate Form,Pre-Degree Form (08039816237, Jupeb form IJMB Form, masters form,Ph.D Form,Sandwich Form,Diploma Form,Change of institution form,Part-Time call (08039816237 OR {08039816237} Change of course Form,POST UTME Form.
    • 안산아가씨 ㈜BCGAME4·COM★ 하중아가씨 영천아가씨 화동아가씨 장위아가씨 auy82 충정아가씨 도봉아가씨 익선아가씨 순화아가씨 cvt19 묵동아가씨 도렴아가씨 거제아가씨 합정아가씨 ulj45 용문아가씨 제기아가씨 논현아가씨 장사아가씨 dvm75 강릉아가씨 가양아가씨 포항아가씨 적선아가씨 wsk34 군산아가씨 의정부아가씨 창신아가씨 전주아가씨 esc46 평택아가씨 원지아가씨 오쇠아가씨 한남아가씨 ghx01 노량진아가씨 안성아가씨 응암아가씨 창전아가씨 pbh00 개봉아가씨 남양주아가씨 함안아가씨 능동아가씨 dhk27 해남아가씨 주성아가씨 충주아가씨 신영아가씨 osc21 자곡아가씨 율현아가씨 김천아가씨 광희아가씨 oxq08 성구아가씨 신사아가씨 안국아가씨 원주아가씨 mcf86 광주아가씨 압구정아가씨 오산아가씨 여주아가씨 wbe25 소격아가씨 양주아가씨 적선아가씨 청담아가씨 ijt49 종암아가씨 신월아가씨 신내아가씨 가회아가씨 pce13 장충아가씨 신내아가씨 반포아가씨 토정아가씨 ggx42 남대문아가씨 순화아가씨 삼청아가씨 예장아가씨 ibp45 안동아가씨 일원아가씨 산천아가씨 옥인아가씨 fge39 행촌아가씨 상왕십리아가씨 김천아가씨 구기아가씨 nkp59 상봉아가씨 장충아가씨 북창아가씨 동선아가씨 ocj25 구기아가씨 울산아가씨 시흥아가씨 김제아가씨 qkf29 동작아가씨 금천아가씨 상암아가씨 장위아가씨 kuf67 평택아가씨 청운아가씨 의주아가씨 무교아가씨 pff42
    • 일일툰 총판 ◑ºBCGAME88ºC0Mº-☞ 미씨쿠폰 영상 팝콘피씨 미씨쿠폰 커뮤니티 스포츠토토 uk5i3 ★ 미씨쿠폰 추천 퀼즈랜드 미씨쿠폰 리그 카인드툰 ky9w6 ♡ 미씨쿠폰 바카라펍 네임카페 미씨쿠폰 도박장 네임드툰 uh5u2 ▽ 미씨쿠폰 경기 유유닷컴 미씨쿠폰 리그 야동넷 dp6j3 ▣ 미씨쿠폰 리그 홍무비 미씨쿠폰 투어 마사지럽 fo1c0 ™ 미씨쿠폰 단톡방 오른손웹툰 미씨쿠폰 싸이트 메가티비 jm2m2 ª 미씨쿠폰 주소 다자바 미씨쿠폰 리그 달림포차 ns1d0 ♥ 미씨쿠폰 투어 노모쇼 미씨쿠폰 도박장 버즈툰 wu7p3 & 미씨쿠폰 동영상 두꺼비티비 미씨쿠폰 모집 reelmari uf2h6 ¶ 미씨쿠폰 중계 호주채널 미씨쿠폰 투어 팝콘피씨 jg2o3 @ 미씨쿠폰 싸이트 위메프 미씨쿠폰 전략 토렌조아 yj1u7 ☆ 미씨쿠폰 포커대회 베팅노리 미씨쿠폰 주소 토토핫 ye3j5 ▥ 미씨쿠폰 주소 먹튀증명 미씨쿠폰 주소 고자닷컴 cg1n3 № 미씨쿠폰 사이트 먹튀크라임 미씨쿠폰 도박장 홍반장시즌2 ed5d3 † 미씨쿠폰 바카라펍 비비티비 미씨쿠폰 게임 세부인 es9k5 ㏇
    • 부산동호회 ♭BCGAME4·COM@ 구산동호회 광장동호회 용인동호회 서초동호회 yav65 봉천동호회 혜화동호회 필운동호회 대신동호회 gfl16 산방동호회 갈월동호회 화양동호회 논현동호회 jww43 금천동호회 당인동호회 순화동호회 동숭동호회 tkx59 군포동호회 수서동호회 불광동호회 논현동호회 njy14 용두동호회 혜화동호회 평택동호회 서소문동호회 ngo42 내수동호회 동선동호회 계동동호회 남현동호회 gia42 공항동호회 상월곡동호회 이방동호회 군산동호회 xoa79 봉원동호회 청운동호회 중구동호회 회현동호회 gfb21 충신동호회 낙원동호회 오산동호회 원효동호회 eie94 광양동호회 돈암동호회 아현동호회 대전동호회 slx94 압구정동호회 영암동호회 안성동호회 도화동호회 gjg29 정동동호회 춘천동호회 강동동호회 용강동호회 usc64 홍익동호회 대조동호회 화방동호회 제기동호회 uvq97 견지동호회 구리동호회 원남동호회 효제동호회 dbu05 고덕동호회 후암동호회 회기동호회 인현동호회 nbn56 창천동호회 거창동호회 구산동호회 개화동호회 kxm75 화양동호회 온수동호회 청담동호회 북창동호회 owi79 은평동호회 중계동호회 상도동호회 신수동호회 iyj47 온수동호회 청담동호회 동자동호회 산방동호회 xpl41 휘경동호회 이문동호회 서빙고동호회 고덕동호회 ytx49 잠원동호회 완주동호회 파주동호회 무교동호회 ipj19 양주동호회 송정동호회 운니동호회 수하동호회 yws31
    • 실시간 WSOP 싸이트§BCGAME88·COM↑ 싱가포르 WSOP 전략 실시간 레소토 WSOP 방송 [본사문의 텔레 JBOX7]실시간 WSOP ↑@ 검증 벨라지오카지노 WSOP 게임장 실시간 캄보디아 실시간 WSOP 업체 [총판문의 카톡 JBOX7]실시간 WSOP ℡□ 쿠푼 폭스우드카지노 WSOP 중계 실시간 지부티 실시간 WSOP 중계 [각종 오피 커뮤니티 제작]실시간 WSOP ▥● 방송 동남아시아 WSOP 검증 실시간 니카라과 실시간 WSOP 경기 [마케팅문의]실시간 WSOP ♣▶ 여행 조지아 WSOP 단톡방 실시간 스웨덴 실시간 WSOP 방송 [카지노본사]실시간 WSOP ♠¶ 업체 벨라지오카지노 WSOP 방법 실시간 니제르 실시간 WSOP 전략 [스포츠본사]실시간 WSOP ◈♤ 방법 쿠웨이트 WSOP 포커대회 실시간 수단 실시간 WSOP 투어 [토토본사 문의]실시간 WSOP ◇→ 사이트 알바니아 WSOP 주소 실시간 카자흐스탄 실시간 WSOP 리그 [토토총판 구매]실시간 WSOP ▼★ 캐쉬게임 동남아 WSOP 총판 실시간 콜롬비아 실시간 WSOP 모집 [카지노총판]실시간 WSOP ↔¶ 포커대회 우크라이나 WSOP 게임장 실시간 토바고 실시간 WSOP 캐쉬게임 [야마토본사]실시간 WSOP ▽〓 홀덤펍 그레나딘 WSOP 여행 실시간 우즈베키스탄 실시간 WSOP 토너먼트 [바카라총판]실시간 WSOP ♣㈜ 쿠푼 보스니아 WSOP 도박장 실시간 러시아 실시간 WSOP 홀덤바 [경마총판]아이티 WSOP 영상 샌즈카지노 WSOP 총판 [BCGAME 비씨게임 총판문의]알림 설정 추천 구독 좋아요
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.