• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Non résolu Ajout de composants Redstone

    Sans suite
    1.12.2
    3
    7
    590
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • theogiraudet
      theogiraudet dernière édition par theogiraudet

      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 !

      1 réponse Dernière réponse Répondre Citer 0
      • theogiraudet
        theogiraudet dernière édition par

        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 ?

        1 réponse Dernière réponse Répondre Citer 0
        • robin4002
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

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

          1 réponse Dernière réponse Répondre Citer 0
          • theogiraudet
            theogiraudet dernière édition par

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

            1 réponse Dernière réponse Répondre Citer 0
            • LeBossMax2
              LeBossMax2 dernière édition par

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

              theogiraudet 1 réponse Dernière réponse Répondre Citer 0
              • theogiraudet
                theogiraudet @LeBossMax2 dernière édition par

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

                1 réponse Dernière réponse Répondre Citer 0
                • theogiraudet
                  theogiraudet dernière édition par

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

                  1 réponse Dernière réponse Répondre Citer 0
                  • 1 / 1
                  • Premier message
                    Dernier message
                  Design by Woryk
                  Contact / Mentions Légales

                  MINECRAFT FORGE FRANCE © 2018

                  Powered by NodeBB