Форум » Вопросы и ответы » Вопросы по скриптам » Ответить

Вопросы по скриптам

Киллер: Задавайте вопросы по скриптовому языку ЗОД и ждите скорейшего ответа на них!

Ответов - 285, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

slava98: Anti_Killer а почему тогда? data/campaign/War System/scripts/main.lua:157: object of type 'player_local' has no property 'health' Добавлено: можно записать как runtime error: data/campaign/War System/scripts/functions.lua:73 (третья линия): unexpected symbol near '=' Добавлено: Исправил: function user.WaterFire() local obj1=object("obj_water"); obj2=object("dec_water") if obj1.health == 2000 then obj2.texture="user/water1" elseif obj1.health == 1500 then obj2.texture="user/water2" elseif obj1.health == 1000 then obj2.texture="user/water3" elseif obj1.health == 500 then obj2.texture="user/water4" elseif obj1.health == 100 then obj2.texture="user/waterfinal" elseif obj1.health == 1 then kill("obj_water") --kill("dec_water") -- и вот это не правильно все равно. Если хочешь чтоб при смерти одного объекта умер и второй, добавь событие в on_die или в on_destroy объекта при убийстве которого надо убивать второй end end Добавлено: И всё-равно это не работает

Anti_Killer: а почему тогда? мне то по чем знать что у тебя что ? Если у тебя obj_water это service player_local, тогда тебе надо сначала получить vehname, задать его как object, потом уже получать от него health

VIRUS: Я хочу чтобы при дамаге этого особого объекта менялись текстуры у декорации.


Anti_Killer: Я хочу чтобы при дамаге этого особого объекта менялись текстуры у декорации. Ну вот самый минимум для этого, начинай с малого проверяй на каком моменте тупит local actor_who_take_damage=actor('tank',100,100,{on_damage='user.damage()',skin='yellow'}) --тот кого бъем local actor_who_change_skin=actor('tank',80,100,{}) --тот кто меняет скин\текстуру при повреждении того кого надо бить function user.damage() actor_who_change_skin.skin='red' end

slava98: Если у тебя obj_water это service player_local, тогда тебе надо сначала получить vehname, задать его как object, потом уже получать от него health Вообще то это разные объекты. Плэер у меня ourplayer. PS. Работает, спасибо.

slava98: У меня вопрос. В Бейсике есть бесконечный цикл DO.. LOOP. Как в ТЗОДе создать бесконечный цикл? function user.1() pushcmd(function() loadmap("maps/dm1.map") end, 5) pushcmd(function() loadmap("maps/dm2.map") end, 10) pushcmd(function() loadmap("maps/dm3.map") end, 15) pushcmd(function() message("TZOD Forever!!!") end, 20) user.1() end Будет работать? На 5 секунде загружается карта 1, на 10 - 2, на 15 - 3, на 20 - пишится текст и потом всё сначала, на 25 опять грузится 1 карта. Мне это нужно для того, чтобы сделать вращающиеся фонари и триггеры. Последние должны перемещаться по свету фонарей. Типа тревоги.

VIRUS: Это похоже на рекурсию функций из С++... Эта функция никогда не завершится! (если она еще будет работать) Вот цикл for в ТЗоДе есть, синтаксис у него какой? Как в С++?

slava98: В Бейсике можно задать с помощью цикла for переменную, имеющую несколько значении, чаще всего от одного числа до другого. В ТЗОДЕ скорее всего тоже самое. Только используется по-другому. Ещё в Бейсике можно отключить цикл DO.. LOOP, функцией EXIT DO, а в ТЗОДЕ я его могу отключить с помощью if.. then.

Morse: такая функция вылетит с ошибкой переполнения стека. последний вызов user.1() надо тоже пихнуть в очередь, тогда будет работать. Я называю этот прием "рекурсивным заполнением очереди", и он у меня встречается во всем чем только можно. Для примера можешь глянуть мою кампанию "такой большой и такой адронный" или карту dm5_disco_edition (где-то тут на форуме все должно быть)

slava98: СПС, Morse. Всё твоё у меня в компе пылится. Посмотрю-полюбопытствую.

VIRUS: Morse пишет: dm5_disco_edition Во во, там цикл for

slava98: if exists ("e1") == true then pset("ourwarrior1", "active", 0) elseif exists ("e2") == true then pset("ourwarrior2", "active", 0) elseif exists ("e4") == true then pset("ourwarrior4", "active", 0) end end И не выходит! Короче, скрипт должен проверять существование танка и отключать его, если он существует (я использую pset, так как по-другому не получается) И ещё. actor("trigger", user.get32(36), user.get32(18), { name="movetrig6",on_enter="if who.name==e4 then user.M1ActionBot4_2() else end"}) Тоже не работает. Триггер спавниться, всё хорошо, только функция не работает. Выходит только actor("trigger", user.get32(36), user.get32(18), { name="movetrig6",on_enter="if who.name==e4 then user.M1ActionBot4_2() else user.M1ActionBot4_2() end"}) Но это тоже самое, что и actor("trigger", user.get32(36), user.get32(18), { name="movetrig6",on_enter="user.M1ActionBot4_2()"})

Morse: if who.name==e4 заменить на if who.name=="e4" Это для начала. Так как кавычки будут внутри строки - заэскейпить их, т.е. if who.name==\"e4\" По поводу первого - не знаю, инфы мало. А вообще, гляди в консоль - там оно ругаться должно что именно не работает.

slava98: Спасибо! А то я не знаю, как использовать функции. "" мог бы догадаться. А про эскейп не знал... Ах да! С кавычками не работал, вот и удалил... Ещё вопрос: а можно было перед этим поставить e4="e4"? А вообще, гляди в консоль - там оно ругаться должно что именно не работает. Я забыл сказать, что ничего не пишет. Писало бы - сам исправил. Удалил бы кампанию.

VIRUS: Вопрос к Антикиллеру... Функция Attacker была удалена, а как заменить ее? Вот код: service ("ai", {name="ourwarrior1", vehname="e1", nick="Поселенец", class="ekivator1", skin="ekivatorl", team=3, on_die="user.M1OnDieBot1()", on_damage="nameofatacker = who.name; user.DamageOurvarrior()", active=0}) и: function user.DamageOurvarrior() if nameofatacker ~= "ourplayer1" then damagesourvarriors = damagesourvarriors + 1 if damagesourvarriors == 1 then message("Поселенец: Эй! Не стреляй по своим!!") elseif damagesourvarriors == 2 then message("Поселенец: Ты что не понял?! Не стреляй по поселенцем!!!") elseif damagesourvarriors == 3 then message("Поселенец: Последнее предупреждение! Хватит стрелять по своим!!!") elseif damagesourvarriors > 3 then message("Командир поселенцев: Он предатель, бей его!") pset("ourplayer", "team", 2) pset("ourwarrior3", "active", 1) user.EnemyAttack() end end end В чем ошибка?

Morse: slava98 пишет: Ещё вопрос: а можно было перед этим поставить e4="e4"? "Перед этим" где? Если это будет локальная переменная, то она пропадет вместе с контекстом. С глобальным доступом у нас там было поле user если я правильно помню. Так что можешь действительно где-нибудь "перед этим" написать user.e4 = "e4", или там user.myVeryImportantString = "e4", без разницы, а потом в скрипт подставлять это поле. Кстати в питоне можно сделать вложенные кавычки используя двойные и одинарные. text = "Here comes 'quoted text'" Возможно в луа так же, не пробовал.

Максим: Вопросик: 1. Как с помощью скриптов переключить день в ночь, затем ночь в день и т.д. автоматически причём чтоб это было? 2. Как с помощью скриптов включить жизни?

VIRUS: 1. conf.sv_nightmode = false (Выключить) true (Включить) 2. Тут посложнее. 1) В создании сервиса [pre] service( "player_local", { name="player1", skin="yellow", team=1, on_die="user.OnDiePlayer()", class="default", nick="Player1" } )[/pre] (можно записать в строку) Обязательно записать какую либо функцию в on_die! 2) Теперь нужно создать саму функцию. [pre]function user.OnDiePlayer() user.life = user.life - 1 if user.life > 0 then message("У вас осталось " .. user.life .. " жизней") else user.Defeat() end end[/pre] Создай какую либо переменную, например, user.life = x (х - любое число - количество жизней) При выполнении функции от переменной отнимается единица (1 жизнь) Далее проходится проверка количества жизней. Если больше нуля, то пишем количество оставшихся жизней. Если же равно нулю или каким-то непонятным образом меньше, то выполняем любую команду (в примере - поражение игрока) И наконец завершение цикла и самой функции. П.С. Смотри кампании, разбирай сам примеры. Это может быть сложно. Но спрашивай) П.С.С. Примеры из кампании Battle City.

slava98: Максим пишет: автоматически причём чтоб это было? Если как в сталкере, то нужен бесконечный цикл. Например: function user.DayAndNight() pushcmd(function() conf.sv_nightmode = true end, 1) pushcmd(function() conf.sv_nightmode = false end, 270) pushcmd(function() user.DayAndNight() end, 540) end А ты кампанию затеял?

VIRUS: Можно просто for(;;) { code }



полная версия страницы