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

Вис691

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

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

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

  • Посещение

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

    67

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


  1. 12 часов назад, Пупкин Вася сказал:

    2. возможно ли сделать чтобы ShowMessage выводило сообщение по "Conditions" без меню {без флага "Message Box"}?

    Если условие тривиальное - скажем, число - то можно засунуть мессаджи в форм лист в нужном порядке, а потом по индексу доставать. Что-то более хитрое в голову не приходит.

    • Спасибо! 1

  2. Ой, не, так плохо. Нам нет смысла гонять цикл "постоянно" (с поправкой на расстояние). Если возвращаться к диалогам типа "Я продам 5/10/15... книг", то проще всего весь скрипт (тот что отвечает за продажу) вынести в UDF и просто из Result Script диалога его вызывать. Количество книг передавать как переменную. Тогда и глобальные не нужны будут. Таким образом весь скрипт будет срабатывать единожды, только во время диалога и не будет грузить игру лишними проверками. Для диалогов в условия вполне достаточно GetItemCount - он и с форм-листами работает (считает суммарное количество предметов, что нам и нужно).

    • Спасибо! 1

  3. 2 часа назад, Trust сказал:

    обычный знак равно это алиас или макрос к let varName := Value - это из нвсе или даже джипа

    А, точно, они же в xNVSE понапридумывали кучу нового.

     

    3 часа назад, Trust сказал:

    И объясните как делать глобальную переменную, а то я давно не спал, самому читать лень....

    Сверху в меню Gameplay -> Globals... ну и там ПКМ и как обычно.

    3 часа назад, Trust сказал:

    Но я как казуал хочу 3000 вегасовских книг продать по принципам трёшки

    Что ж за верблюд у вас 3000 книг на себе таскает? :D

     

    Мне-то всё равно, какую систему фиксить/оставлять - главное чтобы работала без проблем.


  4. Когда я разрабатывал эту систему через рецепты, автолута ещё не существовало, да и не задумывался я, что кто-то будет продавать книги тысячами - инвентарь всё же не резиновый. Я сейчас не вспомню, что и как там устроено, но в принципе посмотреть можно, если надо. У варианта с рецептами был плюс в том, что игрок сам мог выбрать, что и каком количестве он хочет продать. Вариант, представленный выше, тоже имеет место быть. Только он всё-таки в полу-псевдокоде пока, т.к. 

    Count = BookTempCount

    не скомпилируется)

    • Спасибо! 1

  5. Только что, MagnuMspec сказал:

    Потому предположил, что возможно либо не может юзаться переменная другого квеста, либо не может юзаться конкретно в скрипте, повешенном на объект?

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

    • Спасибо! 1

  6. 13 минут назад, MagnuMspec сказал:

    Вопрос, команда let не умеет работать с локальными переменными другого квеста, или я что-то делаю не так?

    Let намного лучше set, включая отправку в консоль ошибок, если появляются. Я бы предлагал от set отказаться совсем. Видимо что-то не так делаешь, я сейчас попробовал у себя - без проблем. Использую чистый ГЕКК + Extender


  7. 10 часов назад, ХАНТЕР73 сказал:

    Потом начисляется компенсация необходимая для достижения 8+27=35 уровня

    Набрать 27 уровней с 0-27 проще (требует меньше опыта), чем с 8-35, не забывайте про это. Я как большой любитель математики сделал бы честно - запомнил, сколько опыта ГГ имеет и потом столько же бы вернул.

    Сделать это можно так:

    let iCurrentLevel := player.GetLevel  ; текущий уровень
    let iNextLevel := iCurrentLevel + 1  ; следующий уровень
    let iXPForNextLevelTotal := 25 * (3 * iNextLevel + 2) * (iNextLevel - 1)  ; сколько всего нужно опыта для получения следующего уровня с 0
    let iXPForNextLevel := GetXPForNextLevel  ; сколько опыта нужно для получения следующего уровня с текущего значения
    let iPlayerXP := iXPForNextLevelTotal - iXPForNextLevel  ; текущее количество опыта у ГГ

    Естественно, некоторые этапы можно объединить, чтобы выкинуть лишние переменные. Хотя и необязательно. Возврат опыта, кстати, может работать неверно, если используется RewardXP. Там похоже не указанное число даётся, а число + модификаторы, если есть. Видимо от перков или ещё чего, не в курсе. Я как бы сам про это не знал, пока не увидел, что существует RewardXPExact. Может быть с этой функцией получится лучше.

    • Спасибо! 1

  8. 4 часа назад, Mr.Shersh сказал:

    image.png

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

    Очень сильно сожЕлею, что люди не смогут полноценно насладиться качественным переводом.


  9. Могу только предположить, что MenuMode надо на GameMode поменять. Мне кажется, что сразу после нажатия на кнопку, мессаджбокс закрывается, и код обработки срабатывает только тогда, когда ты обратно какой-то мессаджбокс открываешь.

     

    Upd: по поводу глобальных переменных. Зашёл в Gameplay->Globals...->ПКМ в поле с переменными->New и создал переменную aaaTestGlobal. Затем создал тестовый скрипт:

     

    scn aaaTestScript
    
    begin GameMode
    
    	if aaaTestGlobal == 0
    		let aaaTestGlobal := 1
    	endif
    
    end

    Всё сохранилось без проблем.

    • Нравится 1

  10. Я бы наверно глобальную завёл, если квеста нет и он не нужен. Если какой-то квест уже есть со скриптом, то можно и там переменную завести.

     

    Так чтобы он кричал постоянно, а не только при входе в триггер (единожды), по идее, надо поменять на OnTrigger.

    • Нравится 1

  11. В 02.08.2021 в 01:32, RaggaL сказал:

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

    Выглядит верно, но переменную RGLvar наверно надо сделать либо глобальной, либо в какой-то квест воткнуть. Ну и я вижу ты поменял на OnTriggerEnter - это будет срабатывать только при входе в триггер. Тебе разве так хочется?


  12. 8 часов назад, RaggaL сказал:

    Привел в нормальный вид, скрипт сохраняется. Но НПС по прежнему выкрикивает только первый топик.

    А у тебя между if и endif ничего нет. Команды-то надо внутрь заносить, а не после)

    if RGLstreetCrier2REF.GetDead == 0
    	if RGLstreetCrier2REF.IsTalking == 0
    		if RGLstreetCrier2REF.IsInCombat == 0
    			if RGLvar == 0
    				RGLstreetCrier2REF.Say RGLstcr0
    				set RGLvar to 1
    			endif
    			if RGLvar == 1
    				RGLstreetCrier2REF.Say RGLstcr1
    				set RGLvar to 2
    			endif
    			...
    		endif
    	endif
    endif
    

    Но такой вариант тоже неправильный. Смотри, как будет идти скрипт. Считаем, что внешние 3 условия выполняются. Переменная 0? Да, она изначально 0, значит выполняем 2 команды внутри. Одна из команд переводит переменную в 1. Следующее условие - переменная 1? Да, мы её только что на 1 поставили. И вновь код внутри выполнится. И т.д. Т.е. он как бы за 1 проход активирует все реплики, а это неверно. В таком случае надо изучить, что конструкция if-endif может расширяться до if-elseif-endif. Взгляни вот на такой вариант:

    if RGLvar == 0
    	RGLstreetCrier2REF.Say RGLstcr0
    	set RGLvar to 1
    elseif RGLvar == 1
    	RGLstreetCrier2REF.Say RGLstcr1
    	set RGLvar to 2
    ...
    endif

    При таком подходе, у нас не много if-endif конструкций, а всего одна. Скрипт при проходе будет искать первое условие, которое выполнится. Как только он его найдёт, он выполнит команды внутри, и выйдет из конструкции (даже если дальнейшие условия тоже выполнялись бы). При такой схеме мы за 1 проход активируем всего одну реплику.

     

    P.S. Я обратил внимание, что среди внешних условий есть RGLstreetCrier2REF.IsTalking == 0, поэтому теперь вновь верю, что этот скрипт должен работать)


  13. 1 час назад, RaggaL сказал:

    Смотреть лучше с закрытыми глазами.

    Так как я с закрытыми глазами помочь смогу?)
     

    1 час назад, RaggaL сказал:

    1. Я ввел переменную RGLvar. Сразу не понятно, стоит ли ее делать BeginGamemode или BeginOnTrigger

    Ну давай подумаем. Надо решить, когда будет срабатывать блок, правильно? Если у нас Gamemode, то этот блок будет срабатывать всегда, когда мы "в игре" (не в меню или ещё где-то). Получается, что переменная в каждый новый проход скрипта будет 0. Как-то нехорошо. Если у нас OnTrigger, то срабатывание будет происходить всегда, когда мы внутри триггера. Т.е. опять в каждый новый проход (пока мы внутри триггера) переменная будет обнуляться. Наверно, тоже не очень хорошо. Как же быть? А всё очень просто. По умолчанию, когда ты пишешь "short RGLvar" переменная принимает значение 0. И это происходит ровно один раз. После этого ты можешь менять переменную как хочешь, она в 0 автоматически не сбросится. Поэтому всё, что нужно - убрать "set RGLvar to 0".

     

    1 час назад, RaggaL сказал:

    Я читал, как делаются блоки условий в pascal, но плохо понял. Как бы не городил блоки из служебных слов else/endif, скрипт не сохраняется.

    Ничего сложного нет. На каждый if ты в конце ставишь endif. Я думаю, если ты посчитаешь, сколько у тебя if-ов и endif-ов, то заметишь, почему скрипт не сохраняется.

     

    1 час назад, RaggaL сказал:

    3. Я не понимаю, по какому принципу нужно сдвигать строки кода вправо. Смотрел другие скрипты, там целые лесенки из них. А в некоторых нет. Как это называется?

    Это называется добросовестный автор или нет. Сдвиг строк вправо делается для повышения читаемости кода. На работу скрипта никак не влияет. Когда их двигать? Не знаю даже как это правильно объяснить. Вот есть у тебя смысловые блоки begin-end, if-endif, также бывают циклы различные. В общем, всё, где ты ставишь какое-то условие. Вот для того, чтобы было понятно, что выполняется, когда условие проходит, это сдвигают вправо. Например:

    if (условие1)
    	команда1
    	команда2
    else
    	команда3
    	команда4
    endif
    команда5

    Если посмотреть, то сразу становится понятно, что команды 1 и 2 выполняются. если условие1 срабатывает. Команды 3 и 4 выполняются, если условие не срабатывает. И команда5 выполняется всегда, т.к. она идёт после if-endif. Если вдруг нужно больше уровней вложенности, то не проблема:

    if (условие1)
    	if (условие2)
    		команда1
    	endif
    	команда2
    endif

    Тут команда1 выполняется, только если и условие1, и условие2 выполняются. Команда2 выполняется только если условие1 выполняется, на условие2 ей всё равно, она вне этого блока. Кстати, обрати внимание, что if и endif на одном уровне визуально находятся, если правильно сдвиги делать. Это опять же позволяет проверить, а не забыл ли ты что-то.

     

    1 час назад, RaggaL сказал:

    set RGLvar == 1

    Тут не "==", а "to". "==" используется для сравнения, а "to" для присвоения нового значения.

    Я, кстати, только сейчас задумался о потенциальной проблеме. По-хорошему надо подождать. пока НПС закончит свою последнюю реплику. Хмм, возможно подход через скрипт не будет работать. А как устроены другие зазывалы?


  14. Не знаю, как работают Link From/To, поэтому я бы всю логику перенёс в скрипт. Завёл бы переменную-счётчик, которую увеличивал бы после каждой реплики, а после последней сбрасывал бы её в 0.


  15. По первым 2ум не подскажу, а вот с именем есть несколько вариантов. Сразу предупреждаю. что сам не тестировал. Получить имя любого рефа можно через LNGetName, т.е. имя игрока должно быть player.LNGetName. Дальше уже надо смотреть, что тебе нужно. Если варианты замены имени у рефа и у базового объекта. Для рефа вроде походит LNSetName, для базового объекта SetName и SetActorFullNameAlt. Если надо расписать подробнее - пиши.


  16. 11 часов назад, Паха007 сказал:

    Она где-то начисляется вне скрипта? И какая у нее задача вообще? Зачем она нужна?

    Вот по идее она должна быть там, где сообщение вызывается, т.е.:

    Begin OnActivate
        if IsActionRef player == 1 
            If NVDLC03DialogueHQBuddies.bBuddiesTalk == 1
                setTalkingActivatorActor BioReactorNPC
                activate
            else
                set bAwaitingInput to 1
                ShowMessage BioReactorNoTalk
            endif
        endif
    End.

    А смысл у неё простой - сказать, мол, вот мы вам менюшку вывели, ждём, что же вы выберете. Это чтобы не крутить целиком блок в MenuMode 1001 постоянно, когда он активен.

    • Нравится 1

  17. 2 часа назад, MagnuMspec сказал:

    Тогда можно так:

    
    scn BioReactorScript
    
    Begin OnActivate
        if IsActionRef player == 1 
            If NVDLC03DialogueHQBuddies.bBuddiesTalk == 1
                setTalkingActivatorActor BioReactorNPC
                activate
            else
                ShowMessage NVDLC03HQBuddiesNoTalkMSG
        endif
    End

     

    Один Endif забыл:

    scn BioReactorScript
    
    Begin OnActivate
        if IsActionRef player == 1 
            If NVDLC03DialogueHQBuddies.bBuddiesTalk == 1
                setTalkingActivatorActor BioReactorNPC
                activate
            else
                ShowMessage NVDLC03HQBuddiesNoTalkMSG
            endif
        endif
    End

     

    • Нравится 4

  18. 5 часов назад, CtpAHnuK сказал:

    Смотря, какие размеры нужны. Если типа памятника, то лучше модель (если гравировка на плоскости - довольно легко сделать), а если не очень большая, то это можно нарисовать в текстурках. К слову, от размеров зависит также количество полигонов (для маленького кубика достаточно 30 полигонов и смуза, большой будет при этом смотреться уродливо), точки тоже на маленьком можно нарисовать, а на большом уже надо делать... Если все-еще нужно, могу сделать модельку (текстуры - не ко мне, они у меня всегда плохо получаются :angry:)

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


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