Почему жаль? Почему дело в другом? Дело как раз в этом. Число, вроде бы, не отрицательное, но все равно создает ошибку в таких функциях, как AddObjectCreatures, RemoveObjectCreatures, и т.п.
Люди добрые, помогите советом. Очень хочется установить сильную армию в сокровищницу гномов. Сделала объект неактивным, добавила тригер на касание с вопросом "готовы ли вы сразиться со стражей". В случае, если ответ да - должно выдаваться сообщение и происходить битва. Сообщение выдаёт, а вот битва не проиходит. Хотелось бы понять, почему. Буду благодарна за любую помощь, а то шаманить уже надоело.
dir = GetMapDataPath() Trigger(OBJECT_TOUCH_TRIGGER, "tres1", "tres1F"); function tres1F (heroName) number=GetCurrentPlayer(); QuestionBoxForPlayers(number,dir.."Capture.txt", "captureF", "nocaptureF"); end; function captureF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."gettreasure.txt"); StartCombat (heroName, nil, 2, CREATURE_THANE, 20, CREATURE_WARLORD, 20, nil); end; function alreadyCapturedF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."alreadyCaptured.txt"); end; function nocaptureF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."Coward.txt"); end; SetObjectEnabled("tres1", false);
Скрипт выглядит красиво, странно, что не работает. В консоль не заглядывали? И это... Сомневаюсь, что поможет, но я бы попробовал в конце StartCombat'a написать три nil'а ещё. Там просто есть такая штука, что по дефолту стоит значение переменной, которая идёт первой в функции, как бы из-за этого не было глюка, что обязательная переменная не выставлена, а дефолтная выставлена таким образом...
Люди добрые, помогите советом. Очень хочется установить сильную армию в сокровищницу гномов. Сделала объект неактивным, добавила тригер на касание с вопросом "готовы ли вы сразиться со стражей". В случае, если ответ да - должно выдаваться сообщение и происходить битва. Сообщение выдаёт, а вот битва не проиходит. Хотелось бы понять, почему. Буду благодарна за любую помощь, а то шаманить уже надоело.
dir = GetMapDataPath() Trigger(OBJECT_TOUCH_TRIGGER, "tres1", "tres1F"); function tres1F (heroName) number=GetCurrentPlayer(); QuestionBoxForPlayers(number,dir.."Capture.txt", "captureF", "nocaptureF"); end; function captureF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."gettreasure.txt"); StartCombat (heroName, nil, 2, CREATURE_THANE, 20, CREATURE_WARLORD, 20, nil); end; function alreadyCapturedF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."alreadyCaptured.txt"); end; function nocaptureF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."Coward.txt"); end; SetObjectEnabled("tres1", false);
бегло посмотрел, уже нашёл ошибку. В функции QuestionBoxForPlayers вы задаёте функцию, которая будет вызываться при ответе "Да". Эта функция не принимает параметров, т.е. в строке function captureF (heroName) в скобках должно быть пусто. Выход есть, например такой - до всего этого куска задать глобальную переменную, т.е. написать строчку типа hero=''. Далее в функции, где написан QuestionBox, этой переменной присвоить имя героя таким образом: hero= heroName. И уже в функции StartCombat использовать эту переменную. Получится всё примерно так:
dir = GetMapDataPath() hero=''; Trigger(OBJECT_TOUCH_TRIGGER, "tres1", "tres1F"); function tres1F (heroName) number=GetCurrentPlayer(); hero=heroName; QuestionBoxForPlayers(number,dir.."Capture.txt", "captureF", "nocaptureF"); end; function captureF () number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."gettreasure.txt"); StartCombat (hero, nil, 2, CREATURE_THANE, 20, CREATURE_WARLORD, 20, nil); end; function alreadyCapturedF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."alreadyCaptured.txt"); end; function nocaptureF () number=GetCurrentPlayer(); hero=''; MessageBoxForPlayers(number,dir.."Coward.txt"); end; SetObjectEnabled("tres1", nil);
позволю ещё себе заметить, что не прлохо было бы в функцию StartCombat добавить функцию, которая вызовится после сражения. Благодаря ей можно будет наградить героя, снять триггер со строения и т.п.
В эти функции можно передать параметры не совсем традиционным способом, если написать не "captureF", а "captureF('"..heroName.."')" Да, и MessageBoxForPlayers принимает первым параметром не игрока, а его фильтр GetPlayerFilter(number). Разницы не будет видно, если игроков 1-2, но для >2 будут возникать ошибки. Желательно ещё сделать проверку, является ли игрок компом или нет.
бегло посмотрел, уже нашёл ошибку. В функции QuestionBoxForPlayers вы задаёте функцию, которая будет вызываться при ответе "Да". Эта функция не принимает параметров, т.е. в строке function captureF (heroName) в скобках должно быть пусто. Выход есть, например такой - до всего этого куска задать глобальную переменную, т.е. написать строчку типа hero=''. Далее в функции, где написан QuestionBox, этой переменной присвоить имя героя таким образом: hero= heroName. И уже в функции StartCombat использовать эту переменную. Получится всё примерно так:
dir = GetMapDataPath() hero=''; Trigger(OBJECT_TOUCH_TRIGGER, "tres1", "tres1F"); function tres1F (heroName) number=GetCurrentPlayer(); hero=heroName; QuestionBoxForPlayers(number,dir.."Capture.txt", "captureF", "nocaptureF"); end; function captureF () number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."gettreasure.txt"); StartCombat (hero, nil, 2, CREATURE_THANE, 20, CREATURE_WARLORD, 20, nil); end; function alreadyCapturedF (heroName) number=GetCurrentPlayer(); MessageBoxForPlayers(number,dir.."alreadyCaptured.txt"); end; function nocaptureF () number=GetCurrentPlayer(); hero=''; MessageBoxForPlayers(number,dir.."Coward.txt"); end; SetObjectEnabled("tres1", nil);
позволю ещё себе заметить, что не прлохо было бы в функцию StartCombat добавить функцию, которая вызовится после сражения. Благодаря ей можно будет наградить героя, снять триггер со строения и т.п.
Спасибо большое, теперь всё работает! Учту на будущее, что подобные функции надо писать без параметров. В StartCombat функцию после сражения я и планировала добавить, просто делаю всё поэтапно, чтобы не запутаться.
RedHeavenHero
Да, и MessageBoxForPlayers принимает первым параметром не игрока, а его фильтр GetPlayerFilter(number). Разницы не будет видно, если игроков 1-2, но для >2 будут возникать ошибки. Желательно ещё сделать проверку, является ли игрок компом или нет.
Доступа к этому объекту будет только у одного игрока. Поэтому я лучше оставлю, как есть. Но учту на будущее, спасибо!