Реализация больших дверей

Версия Minecraft
1.12.2
5,018
47
783
Всем привет, норот. В общем, подскочил такой вопросец - хочу сделать большие двери, да с анимацией, желательно(гермозатвор должен медленно открываться)
Я умею в форджевскую анимацию, но там можно делать лишь с одним куском модели. Грубо говоря, если я хочу делать модель двери 3х3, то мне придется делать единую модель рамы 3х3 и подвижную часть(3х3) - то есть, не получится сделать ее поблочно, а модель больше чем один блок - это заведомо проблемы с расчетом света потом.
Также форджевская анимация не учитывает расстояние. Если от начальной точки блока до края модели есть какое то расстояние - оно будет радиусом движения(дверь не откроется вокруг своей оси, короче говоря).
Предложите какие нибудь варианты, если у вас есть мысли как это сделать. PS API малисисдорс не предлагать, не хочу грузить мод лишними либами.
 
7,099
324
1,510
Если от начальной точки блока до края модели есть какое то расстояние - оно будет радиусом движения(дверь не откроется вокруг своей оси, короче говоря).
Хочешь сказать, нельзя задать движение по произвольной кривой?
 
1,196
31
183
Могу дать совет, т.к я работал с гермоворотами:
Делать лучше гермы, открывающиеся вверх или вбок(only glTranlatef), то есть без каких либо поворотов.
Если делать повороты, вбок то ты замаешься сетать инвиз блоки для коллизии двери, это я тебе говорю.
Есть интересная тема насчет мода UgoCraft, япошки как то сделали такую фичу с коллизией,там есть блок, который может заставлять поворачиваться кучу блоков вокруг блока-вращателя, и все это дело соприкасается норм так с игроком и сущностями. Глянуть бы их код... Авось поможет тебе
 
31
26
Я видел подобный мод.
Посмотри Tall Doors мод.
Ещё что-то подобное было в моде Ancient Warface (могу неправильно написать название)
Так же я видел крупные двери в моде "Властелин колец", но там они просто соединяются, а что касается анимации, то это два мода выше
 
5,018
47
783
Могу дать совет, т.к я работал с гермоворотами:
Делать лучше гермы, открывающиеся вверх или вбок(only glTranlatef), то есть без каких либо поворотов.
Если делать повороты, вбок то ты замаешься сетать инвиз блоки для коллизии двери, это я тебе говорю.
Есть интересная тема насчет мода UgoCraft, япошки как то сделали такую фичу с коллизией,там есть блок, который может заставлять поворачиваться кучу блоков вокруг блока-вращателя, и все это дело соприкасается норм так с игроком и сущностями. Глянуть бы их код... Авось поможет тебе
Мне не важна коллизия двери в момент открывания. Интересует только закрытое-открытое состояние.
Но короче я понял, через TESR это все делать. А каким образом мне в теср подтянуть мою json модельку?(1.12.2)
 
1,196
31
183
Но короче я понял, через TESR это все делать. А каким образом мне в теср подтянуть мою json модельку?(1.12.2)
ТЫК
Но ведь без коллизии это ж кал(( Я когда делал, все челы вокруг кайфовали, как классно работает открытие закрытие герм
 
5,018
47
783
Потому что я хочу сделать поворачивающуюся. в сторону
Кинь какой нить видос со своими гермами глянуть.
Кстати буду рад посмотреть твой кодэ, если можна. Я не буду тыбрить, я не люблю разбираться как работает чужой код.
 
1,196
31
183
я тогда так костыльно сделал коллизию, и там такой говнокод, что стыдно показывать. Но по фпсу оно не давало нагрузки, просто визуально код говно.
Выглядела она как то так, а видоса, к сожалению, нет - попросту не сохранился.
Кстати, вот код транслейта показать могу.
float runSwitch = tile.lastrunProgress + ( tile.runProgress - tile.lastrunProgress); //недоинтерполяция из фланса
GL11.glTranslatef(0, -3.3F * runSwitch, 0);
tile.runProgress изменялась в зависимости от того, давалась ли энергия на герму (редстоун), и приплюсовывается каждый тик на опр значение до определенного значения, типа вот
Java:
@Override
      public void updateEntity() {
          
          
          lastrunProgress = runProgress;
          if(super.worldObj.isBlockIndirectlyGettingPowered(super.xCoord, super.yCoord, super.zCoord))
          {
              if(timer < 301){
                    ++timer;
              }   
              if(timer == 160){
                  sound2 = true;
              }
              if(timer > 160){
                  sound2 = false;
              }
              runProgress = 1F - (1F - runProgress) * 0.995F;
              if(runProgress > 0.5){
                  runProgress = 1F - (1F - runProgress) * 0.995F;
                  if(runProgress > 0.8){
                      runProgress = 1F - (1F - runProgress) * 0.985F; 
                      if(runProgress > 0.94){
                          runProgress = 1F - (1F - runProgress) * 0.945F; 
                      }
                  }
              }
          }
          else
          {
              if(timer > 0){
                  --timer;
              }
              if(timer == 140){
                  sound3 = true;
              }
              if(timer < 140){
                  sound3 = false;
              }
              runProgress *= 0.995F;
              if(runProgress < 0.5){
                  runProgress *= 0.995F;
                  if(runProgress < 0.2){
                      runProgress *= 0.985F;
                      if(runProgress < 0.05){
                          runProgress *= 0.945F;
                      }
                  }
                      
              }
          }
        
      }
Костыльный код потому что срочно требовалось чота написать, щас то я могу реализовать намного лучше, но вот с коллизией проблемы(
Не знаю чем их решить
 

Вложения

  • 1580148858731.png
    1580148858731.png
    877.6 KB · Просмотры: 23
7,099
324
1,510
А каким образом мне в теср подтянуть мою json модельку?(1.12.2)
Для твоего случая(просто повернуть) после получения IBakedModel можно зарендерить ее так:
Scala:
val mc=Minecraft.getMinecraft
mc.getRenderItem.renderItem(new ItemStack(<block>), <model>);
Или так:
Scala:
mc.getItemRenderer.renderItem(m.player,new ItemStack(<block>),TransformType.GROUND)
 
Сверху