Ajout de composants Redstone



  • Hey !
    Pour me mettre un petit peu à l'API forge, j'ai décidé de me développer un petit mod personnel ajoutant quelques nouveaux composants redstone afin de simplifier les systèmes (en l'occurrence, portes logiques, bascules, registre à décalage tout ça tout ça). J'ai cherché un peu dans les sources de Forge afin d'observer un peu comment est conçu le repeater ou encore le comparateur. J'ai pu donc par cela créer une NOT gate pas trop fonctionnel.
    Je ne suis pas vraiment satisfait du code, et je n'arrive pas encore vraiment à comprendre comment l'on récupère les entrées afin de définir la sortie. J'ai créer une superclass à NotGate (LogicGate) héritant de BlockRedstoneDiode et encore une fois, je ne sais pas si c'est la meilleure chose à faire ou s'il ne vaut pas mieux refaire tout le comportement à 0.
    Mon principal problème est donc que je suis assez submergé par tout ça et que le peu de documentations que je trouve sur le net par rapport à la redstone semble devenu obsolète.
    J'aimerais donc avoir vos avis par rapport à cela et quelques explications sur la gestion des entrées/sorties du courant redstone par rapport à mon bloc !
    Voici mes deux classes actuelles (je ne connais pas l'utilité de certaines méthodes implémentées en plus) :

    • LogicGate :
    public abstract class LogicGateAbstract extends BlockRedstoneDiode {
    	
    	public static final PropertyBool POWERED = PropertyBool.create("powered");
    
    	protected LogicGateAbstract(Boolean b) {
    		super(b);
    		this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(POWERED, Boolean.valueOf(false)));
    		setResistance(0F);
    		setHardness(0F);
    	}
    
    	public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) {
    		super.onBlockAdded(worldIn, pos, state);
    	}
    
    	protected BlockStateContainer createBlockState() {
    		return new BlockStateContainer(this, new IProperty[] { FACING, POWERED });
    	}
    
    	public int getMetaFromState(IBlockState state) {
    		return ((EnumFacing) state.getValue(FACING)).getHorizontalIndex();
    	}
    
    	public IBlockState withRotation(IBlockState state, Rotation rot) {
    		return state.withProperty(FACING, rot.rotate((EnumFacing) state.getValue(FACING)));
    	}
    
    	public IBlockState withMirror(IBlockState state, Mirror mirrorIn) {
    		return state.withRotation(mirrorIn.toRotation((EnumFacing) state.getValue(FACING)));
    	}
    
    	@Override
    	public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY,
    			float hitZ, int meta, EntityLivingBase placer) {
    		return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()).withProperty(POWERED, Boolean.valueOf(false));
    	}
    
    	@Override
    	public IBlockState getStateFromMeta(int meta) {
    		return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta)).withProperty(POWERED, Boolean.valueOf(false));
    	}
    	
    	protected int getPowerLevelInput(IBlockState state, World world, BlockPos pos) {
    		return world.getRedstonePower(pos.offset(state.getValue(FACING)), state.getValue(FACING));
    	}
    	
    	@Override
    	public boolean canProvidePower(IBlockState iBlockState) {
    		return true;
    	}
    	
    	@Override
    	protected int getDelay(IBlockState state) {
    		return 2;
    	}
    	
    
    	@Override
    	protected IBlockState getPoweredState(IBlockState unpoweredState) {
    		return null;
    	}
    
    	@Override
    	protected IBlockState getUnpoweredState(IBlockState poweredState) {
    		return null;
    	}
    }
    
    • NotGate :
    public class NotGate extends LogicGateAbstract {
    
    	public static final String NAME = "not_gate";
    
    	public NotGate(boolean b) {
    		super(b);
    		LogicGateBlocks.setBlockName(this, NAME);
    
    	}
    
    	@Override
    	public int getWeakPower(IBlockState state, IBlockAccess worldIn, BlockPos pos, EnumFacing side) {
    		if (!((Boolean) state.getValue(POWERED)).booleanValue() && side == state.getValue(FACING).getOpposite())
    			return 15;
    		return 0;
    	}
    
    	@Override
    	public boolean canConnectRedstone(IBlockState state, IBlockAccess world, BlockPos pos, @Nullable EnumFacing side) {
    		if(side != state.getValue(FACING) && side != state.getValue(FACING).getOpposite() /*Output*/)
    			return false;
    		return true;
    	}
    
    	@Override
    	public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos neighborPos) {
    		int powerLevel = getPowerLevelInput(state, worldIn, pos);
    		if (powerLevel == 0)
    			worldIn.setBlockState(pos, state.withProperty(POWERED, false));
    		else
    			worldIn.setBlockState(pos, state.withProperty(POWERED, true));
    	}
    }
    

    Je n'ai pas encore compacté le code car j'essaye avant tout de comprendre comment ça fonctionne x')

    Merci d'avance de votre aide !



  • Je viens apporter quelques nouvelles !

    J'ai trouvé d'où vient le problème, mais je ne sais pas comment le résoudre.
    En effet, la fonction getPowerLevelInput ne semble pas retourner le niveau de courant du bloc adjacent (en l'occurrence, le fil de redstone qui entre dans ma porte).
    J'ai apporté quelques modifications à la fonction neighborChanged :

    @Override
    	public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos neighborPos) {
    		int powerLevel = getPowerLevelInput(state, worldIn, neighborPos);
    		if(neighborPos.offset(state.getValue(FACING)).equals(pos))
    			worldIn.setBlockState(pos, state.withProperty(POWERED, Boolean.valueOf(powerLevel > 0)));
    	}
    

    Auriez-vous une idée de la cause ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Salut,
    Est-ce que la condition if(neighborPos.offset(state.getValue(FACING)).equals(pos)) passe ?



  • Oui, la condition passe bien, mais powerLevel reste constamment à 0 😕



  • Quand tu appelle getPowerLevelInput, tu devrai mettre pos plutôt que neighborPos comme la fonction fait le décalage tout seul.



  • @LeBossMax2 En effet, je viens de le fixe à l'instant ! Mais malheureusement, toujours le même soucis que je ne comprends pas 😕



  • Pas d'idée d'où cela peut éventuellement venir ? 😕


Log in to reply