Перейти к содержанию

Вис691

Управление проектами
  • Публикаций

    1 539
  • Пожертвование

    0,00 ₽ 
  • Зарегистрирован

  • Посещение

  • Победитель дней

    67

Сообщения, опубликованные Вис691


  1. Пока от школы тут, к сожалению, лишь одно название. Учеников катастрофически не хватает  :D

     

    Структура безусловна очень важна. Много раз лично сталкивался с ситуацией, когда пишешь кусок кода - всё работает. Добавляешь что-то ещё - перестаёт работать. И при этом не видишь ошибку. А потом оказывается, что где-то напортачил со структурой. Поэтому крайне важно не забывать табуляцию - это намного упрощает чтение кода и поиск ошибок.


  2.  

     

    Какое? Я влезаю туда, куда не стоит, так как это не корректно с моей стороны, поэтому заранее извиняюсь.

    Ну, я себя мастером скриптинга не считаю. И прозвучало это как-то ненормально. Будто бы всюду хожу и перед всеми выпендриваюсь, какой я крутой в скриптах. А кто-то нашёл у меня ошибку и теперь злорадствует.

     

     

    Как я понимаю, действие должно выполняться когда iFlag присваивается значение 1, после чего выполняется действие, и условие закрывается возвратом iFlag нулевого значения. В последнем случае это самое закрытие блока просто выброшено из этого блока и бомбить оно будет постоянно, независимо от того, какое значение в начале условия.

    Смысл в том, чтобы блок сработал ровно 1 раз после выхода из меню крафта. И если строка будет в самом низу, то это сработает также.


  3.  

     

    Но, если запихать последнюю строчку Set iFlag to 0 после всех ендифов, получится вообще колапс. Я не прав?

    С чего вдруг? Блок пройдётся полностью, потом этим флагом закроется. Просто в ГеймМоде постоянно будет эта строка вызываться. Где проблема?

     

     

    Я великодушно прошу прощение, о мастер скриптинга

    К чему такое отношение? 


  4. Именно это я и хотел увидеть, в принципе. Единственное, я бы его разместил перед последним endif. Проблема была в том, что игрок мог зайти в меню крафта и просто выйти из него, ничего не крафтя. Тогда условие If iFlag выполнялось бы, и всё что в блоке также бы работало. А вот условие If iCurrentValue > iPreviousValue не выполнялось бы, а значит и строка Let iFlag := 0 была бы пропущена. Как-то так.

    Теперь точно всё. Мод готов к релизу. Если ты, конечно, этого хочешь.


  5. Не, не надо ничего добавлять и усложнять. Надо всего лишь 1 строчку перенести, чтобы проход был единственным.  :)

    Какая строка отвечает за остановку проходов? Т.е., какая строка влияет на НЕвыполнение условия If iFlag ? И куда её нужно перенести, чтобы она в любом случае выполнилась после одного прохода?


  6. Уточнение здесь вовсе необязательное, у переменной iFlag всегда одно из двух значений - 0 или 1. Было бы их было больше, тогда да, было бы важно. Ну а в скрипте всё ещё есть ситуация, когда постоянно будет работать почти весь код, что в GameMode. А это не очень хорошо (хотя на таком мелком скрипте и не будет проблем, но всё же понимание того, что большой скрипт в подобной ситуации будет грузить игру, нужно).


  7. Проверил доработанный скриптец в игре - всё работает. Опыт за крафт начисляется исправно. Владимиру - моя безмерная благодарность за помощь и терпение.

    Да тут мне надо тебя благодарить за трудолюбие. Приятно встретить человека, который готов поработать над тем, что он хочет получить. А не ждёт, пока за него всё сделают.  :good:

    В итоге получился вполне себе полный мод, который даже можно зарелизить. Добавить к нему, скорее всего, нечего, разве что какую-нибудь формулу для начисления опыта придумать. А то может немного читерным оказаться.

    Но всё равно одна вещь меня не устраивает. Пока что, есть случай, когда скрипт будет работать в GameMode постоянно. Исправить нетрудно, подумай над этим.

    А вот с этим что?  ;)

     

    Чисто от себя, как от администратора школы, хочу сказать, что очень рад, что смог помочь ученику. Я бы даже не против возобновить работу школы, вот только надо оно кому? Помнится, Даша говорила, что ей не помешало бы разобраться в азах... Так что пишите здесь, если хотите увидеть новые задания от меня или если захотите что-то создать (по типу мода от OldVaultBoy). Не стесняйтесь.


  8. В принципе должно работать, проверяй. Естественно, скрипт вешается на квест. Но всё равно одна вещь меня не устраивает. Пока что, есть случай, когда скрипт будет работать в GameMode постоянно. Исправить нетрудно, подумай над этим.


  9. Ну смотри. Ситуация следующая. Игрок скрафтил какую-то вещь, счётчик показывает значение 100. Как только он вышел из меню крафта это значение записалось в нашу переменную (ибо мы так скрипт построили). Теперь при следующем входе в меню игрок скрафтил ещё 5 предметов. Пока он в меню, в нашей переменной всё ещё значение 100. Как только он выходит, начинает работать блок GameMode. Скрипт выполняется построчно, т.е. когда он дойдёт до строки Let iCurrentValue := (GetPCMiscStat "Items Crafted"), значение в переменной поменяется. Что это значит? Это значит, что нужно поменять структуру скрипта: вначале в предыдущее значение записываем текущее (Let iPreviousValue := iCurrentValue), затем уже в текущее записываем значение из функции (Let iCurrentValue := (GetPCMiscStat "Items Crafted")). Надеюсь, теперь стало понятнее.

    Вообще, я бы ещё некоторые элементы в скрипте переставил, но об этом позже. Вот как правильно должен быть оформлен твой текущий кусок кода. Сравни его со своим оформлением.

    scn CraftingRewardXP
    
    Int iFlag; переменная флаг
    Int iPreviousValue; предыдущее значение
    Int iCurrentValue; текущее значение
    Int iCraftXP
    
    	Begin MenuMode 1077
    
    		Let iFlag := 1
    
    	End
    
    	Begin GameMode
    
    		If iFlag ; <- вообще, лично я выношу всё, что в блоке Begin/End, хотя это и необязательно 
    			Let iCurrentValue := (GetPCMiscStat "Items Crafted")
    			Let iPreviousValue := ?
    			Let iCraftXP:= (iCurrentValue - iPreviousValue)
    			If iCurrentValue > iPreviousValue ; <- само новое условие не нужно табулировать, только его содержимое
    				Player.RewardXP iCraftXP
    				Let iFlag := 0 ; <- у тебя тут не совпадал отступ с предыдущей строкой
    			Endif
    		Endif
    
    	End
    

  10. Не надо каждую новую строчку табулировать. Это делается только, когда новый блок появляется. Например, if/endif. А всё что внутри него должно быть с одинаковым отступом.

    If ...
       Команда 1
       Команда 2
       If ...
          Команда 3
       Endif
    Endif
    

    Как можно видеть каждый Endif находится ровно под своим If'ом. Удобно, не правда ли?  :)

     

     

    А как отследить значения изготовленных предметов? Понятно, что за это отвечает функция GetPCMiscStat "Items Crafted". Если функция показывает предыдущее значение, то как выставить текущее?

    Она как раз таки текущее и показывает. Но ведь наша переменная не поменяется, пока строка на изменение переменной вновь не выполнится, правильно?  :)


  11. Цитата из первого поста  :)

     

     

    3) Дальше идёт основная часть скрипта. Блоки, начинающиеся на Begin и заканчивающиеся на End. Типы блоков бывают разными, но основные GameMode и MenuMode. Первый работает во время игры, второй - в каком-либо меню (пип-бой, окно бартера, контейнер и т.д.). В одном скрипте можно использовать несколько блоков одновременно. Подробнее тут

    Begin GameMode
    // какие-то команды
    end
    
    Begin MenuMode
    // ещё команды
    end 

     


  12. Я бы весь функционал в GameMode вынес. А в MenuMode просто бы флаг менял. А дальше уже сверяем наше предыдущее количество предметов с текущим. Если они разнятся, значит игрок что-то скрафтил. Обновляем предыдущее значение и начисляем опыт. Ну и флаг сбрасываем, когда закончили.


  13. Эх, мне кажется проблема в том, что ты думаешь немного не в том направлении. Мне почему-то кажется, что ты пытаешься представить ситуацию сразу в виде скрипта. Тут же всегда нужен другой подход, т.е. генерация самой идеи, а потом уже её перенос в код. Вот как бы я поступил, и как я пришёл к этому:

    нам нужно ловить выход из меню, так? А что это за меню такое вообще, дайте-ка глянем. Ага, "1077 = Recipe (New Vegas)", значит вход в него мы сможем отследить конструкцией Begin MenuMode 1077 ... End. Так, стоп, нам же выход нужен. Хм, что же происходит, когда мы выходим из меню крафта? Ой, точно, режим же меняется на GameMode, ибо больше никуда не выйти для продолжения игры! И что же нам делать? Заведём переменную-флаг. При входе в меню крафта будем менять её значение на 1. А в том же скрипте, но уже в блоке Begin GameMode сделаем проверку на [Наша переменная] == 1. Так мы точно можем сказать, что игрок был в меню и уже вышел из него. Можно работать с опытом и прочим.

    Достаточно понятно то, что я рассказал? Или ещё какие-то вопросы?


  14. Ну вот, а кто-то про бездарность говорил. Итого, что мы имеем:

    2 переменные для хранения количества скрафченных предметов: текущее значение и предыдущее значение.

    Скрипт должен запускать начисление опыта после выхода из меню крафта.

    Собственно, не вижу проблем начинать, всё вроде обсудили. Разве что как нам отловить момент выхода из меню? Для этого советую взглянуть на MenuMode и предложить мне идею  :)

    Ну и конечно, перед началом советую задать все возникшие вопросы.


  15. Раз уж такая тема появилась. В общем, мне нужно что-то в виде следующей фигурки: игральный кубик (а лучше сразу 2) на небольшой плоской платформе-подставке. Неплохо было бы, если они не просто лежали, а, грубо говоря, касались подставки и друг друга рёбрами. Т.е. если представить стол, мысленно кинуть на него кубики, и пока они перекатываются, как бы остановить время, то должно получиться нечто, что мне хотелось бы увидеть. Не знаю, как понятнее объяснить. Фигурка-статуэтка вся (или только кубики) должна быть золотая.

    Ну и с заделом на будущее, задам такой вопрос. Допустим я захочу, чтобы на подставке снизу были выгравированы какие-нибудь символы. Это нужно будет модель менять или можно реализовать при помощи карты нормали?

    • Нравится 1

  16. Да, идея с верстаком здравая, только лично я предложу делать все сразу после выхода из меню крафтинга. Таким образом мы сможем прогнать наш скрипт всего один раз.

    Теперь по поводу чисел. У нас в любой момент всегда есть доступ к общему числу скрафченных предметов, верно? Ситуация получается следующая: до активации игроком верстака там хранится, допустим, 100. Наш ГГ крафтит 5 предметов, и после выхода мы уже имеем 105. И казалось бы, что сложного? Берем 105 - 100 = 5 и работаем с этим числом. Только вот 100 исчезнет сразу же после крафта. Что нужно сделать, чтобы исправить эту проблему?


  17. Окей, вот есть у нас количество скрафченных предметов за всё время. Как нам выудить число скрафченных в последний раз? И когда это стоит делать? Я в целом про начисление опыта. Придумать формулу нужно только, если соотношение не 1 exp за 1 предмет.


  18. Не, совсем не то. Искомая функция - GetPCMiscStat, с нужным параметром, конечно. Что ж, теперь хотелось бы услышать идею в целом. Как вообще вам видится работа плагина? Что нужно учесть, когда нужно учесть? В общих чертах, без всяких скриптовых особенностей.


  19. Что ж, первым делом очень простое задание: найти ту самую функцию. Подсказка: она находится в базовых, т.е. без всяких НВСЕ. Ну и вторая подсказка: она отвечает за кучу параметров, не только за скрафченные предметы.


×
×
  • Создать...