Отправлено: 07.06.08 07:33. Заголовок: Нуи ессно сразу вопр..
Нуи ессно сразу вопрос: Каким макаром в танках рассчитывается координата объекта (например actor("", x, y, {...}))? Смотрел в других кампаниях, ни х. не понял... Единственное дошло то, что реальная координата, которая отображается в редакторе map, должна домнажаться на n-ю переменную...
Отправлено: 07.06.08 11:31. Заголовок: hmh пишет: Каждая к..
hmh пишет:
цитата:
Каждая клетка равна 32*32 пикселям. Т.е. координата клетки равна номеру клетки*32.
Тут надо уточнить, что указанная "координата клетки" - это ее верхний левый угол. Если требуется поместить объект в центр клетки надо прибавить к координатам по 16.
Отправлено: 08.06.08 11:46. Заголовок: Теперь хотел спросит..
Теперь хотел спросить: Можно ли сейчас по средствам скрипто ввести отслеживание нажатия кнопки. На сколько мне известно, в CPP эту функция реализуется через eof...
Единственные события которые может отслеживать скрипт - въезд в зону триггера (ну и выезд), респаун танка, дамаг и дестрой объектов, и подбор предметов. А C++ тут вообще непричем.
Отправлено: 12.06.08 08:59. Заголовок: 1. who можно использ..
1. who можно использовать только в триггере? 2. Как записать убить "того-то" с пом. who, а то kill(who) и kill("who") не контачат... 3. Не могли бы подробно объяснить принцип действия for.
Отправлено: 12.06.08 10:48. Заголовок: who - да, использует..
who - да, используется только в триггере. она и создана-то была специально для него. who - это имя танка, который въехал в область триггера. Но есть один важный момент, на который не поставлено должного акцента. Чтобы вся эта байда работала, ЭТО ИМЯ ДОЛЖНО СУЩЕСТВОВАТЬ. Запомните это правило и передайте другим:
В СКРИПТАХ ЗАДАВАЙТЕ ИМЯ ВСЕМ ВОЗМОЖНЫМ ОБЪЕКТАМ, ДАЖЕ ЕСЛИ, КАК ВАМ КАЖЕТСЯ, ЭТО ИМЯ НИКОГДА И НИГДЕ НЕ ПОНАДОБИТСЯ.
Поверьте мне - я имею опыт в написании скриптов. Ничего плохого не случится если несколько лишних объектов получат имена, а вот отсутствие имени у нужного объекта может вызвать ошибку в самом неожиданном месте. В частности ошибка с которой я сам часто сталкивался: дают имя сервису, и забывают дать имя танку, который этот сервис будет себе рожать. там есть одна переменная, vehname если я не ошибаюсь, она должна быть непустой. иначе все это не будет работать.
Отправлено: 12.06.08 11:17. Заголовок: Morse, зачем так нер..
Morse, зачем так нервничать? Имя было, но ,как ты сказал, - сервисное... slava98, спасибо конечно, но про kill и damage я и так знаю, но kill для меня - это убить, а damage - повредить.
Отправлено: 12.06.08 11:54. Заголовок: Я не нервничаю. Я на..
Я не нервничаю. Я наоборот - стараюсь уменьшить колисечство нервирования у различных скриптописателей, которые будут биться головой о стену с криками: "что не так!?". Так как мое благое начинание в виде тутора по скриптописи никто не продолжил приходится эти важные моменты оповещать здесь.
Кстати у меня тоже вопрос: есть ли такая штука, как массив ВСЕХ объектов которые есть на карте? Или, если быть более точным: можно ли добраться хоть как-нибудь до объекта без имени? Напрямую - нельзя, это понятно, но может можно по какому-нибудь индексу в каком-нибудь массиве?
Кстати у меня тоже вопрос: есть ли такая штука, как мас...
Хм... Вопрос хороший. Думаю что навярнека это знает только Insert, а его уже с 1.5 месяца нет. Вообще такой массив даже не должен, а обязан быть. Если открыть любой файл *.map, то в нем содержится код, содержащий все координаты построения объектов на карте, а таковых - очень много. Отсюда можно сделать вывод, что если у каждого объекта не будет личного индекса, то впринципе взаимодействие с объектами будет невозможно. Как я себе представляю, в этом случае будут массовые конфликты, и так, уничтожив 1 кирпич, мы уничтожим все... Так что они есь! П.С. Конечно, комуто может показать ся, что я несу полный бред, но во всех, даже самых простых играх каждый объект занимает определенную ячейку памяти... вот так... П.П.С. Однако же, навярняка знает сам Insert.
Отправлено: 09.11.08 22:33. Заголовок: Я тут иногда) Попроб..
Я тут иногда) Попробую ответить сразу всем.
Конечно внутри игры есть список всех объектов, да не один а штук 10 разных глобальных и еще в каждой локации 8 на 8 клеток есть свои локальные списки. Но пользы от них мало, потому что по индексу оттуда достать объект невозможно, ибо это не массивы а двусвязные списки.
Нажатия кнопок отслеживать нельзя.
conf это таблица всех настроек игры. Их список можно получить если открыть в блокноте config.cfg или набрать в консоли "conf." и нажать Tab. Назначение большинства из них должно быть понятно из названия. Если что не понятно - спрашивайте. А вообще хорошо бы на wiki иметь про это статью. Начните кто-нибудь, а я потом поправлю
Отправлено: 16.11.09 01:12. Заголовок: что значит "пост..
что значит "постоянный скрипт"? бесконечный цикл вращения можно сделать с помощью нехитрой рекурсии. пример есть в моей недокампании в самом конце. там целая карта посвящена исключительно объекту который бесконечно ездит по кругу.
--создает объект "лес", который повреждает все находящиеся рядом танки со скоростью dam*60 hp в секунду --сам объект движется по фигуре лиссажу с центром в stx sty радиусами rx ry частотами ax ay начальной фазой t --и скоростью 1/sp. nameo - имя, должно быть непустым и уникальным. например запуск с параметрами --user.moveRadiation(10,10,7,3,1,1,0,500,10,"test") создаст объкт движущийся по эллипсу с центром в 10 10 и радиусами --7 по горизонтали и 3 по вертикали с малой скоростью и сильным дамагом (танк выносится за один проход) function user.moveRadiation(stx,sty,rx,ry,ax,ay,t,sp,dam,nameo) for i=1,60 do local coordx = stx*32+rx*32*math.cos(ax*(i+t)*2*3.1415/sp) local coordy = sty*32+ry*32*math.sin(ay*(i+t)*2*3.1415/sp) pushcmd(function() if exists(nameo.."wo") then kill(nameo.."wo") end if exists(nameo.."tr") then kill(nameo.."tr") end actor("wood",coordx,coordy,{name=nameo.."wo"}) actor("trigger",coordx,coordy,{name=nameo.."tr",radius=2,on_enter="damage("..dam..",who)"}) end,i/60) end t=t+60 if t>=sp then t=t-sp end pushcmd(function() user.moveRadiation(stx,sty,rx,ry,ax,ay,t,sp,dam,nameo) end, 1) end
это конечно довольно сложный вариант, для простого поворота вполне возможно будет достаточно просто отредактировать свойство угла поворота, но идея рекурсивной очереди здесь должна быть вполне понятна.
Отправлено: 28.11.09 22:59. Заголовок: slava98 , Артур на ..
slava98 , Артур на ваш вопрос ответ был дан на предыдущей странице - большими красными буквами, специально чтоб все видели. Следовало бы ту фразу поместить в шапку топика - чтоб все ее всегда видели. А то ей-богу уже устал от одной и той же ошибки.
Артур, slava98 Бустер нельзя дать с помощью equip, это такой баг. Дело в том, что бустер - это единственный бонус, который прикрепляется не к танку, а к оружию, и это реализовано через эту... не очень правильно, вот.
Отправлено: 01.12.09 19:14. Заголовок: Вы мне все уже надое..
Вы мне все уже надоели... Потрудитесь наконец хотя бы перечитать с самого начала этот топик. Всего три страницы - не так уж и много. Тем более что вам нужна только первая. Есть уже все-таки предел сколько раз можно отвечать на один и тот же вопрос.
Отправлено: 01.12.09 21:45. Заголовок: вообще, наверно мне ..
вообще, наверно мне правильнее будет сделать возможность надевать предметы не только на танки, но и на ихних игроков, ибо конца подобным вопросам не предвидится :)
Артур В обработчик триггера передается спец переменная who, в которой записано name въехавшего танка. Дело в том, что танком управляет player, у которого тоже есть свое name, другое и которое совсем не то, которым подписывается игрок. Танк периодически дохнет и рождается заново, а player живет все время. У player'а есть еще одно свойство vehname, которое определяет как будет называться танк. Когда играешь в мясо, у игроков по умолчанию все эти поля пустые, следовательно в триггерах who не сработает.
У меня есть идея, как убрать вообще геморрой с именами и обрести счастье. Плохая новость заключается в том, что у меня совсем нет времени :)
Артур В обработчик триггера передается спец переменная who, в которой записано name въехавшего танка. Дело в том, что танком управляет player, у которого тоже есть свое name, другое и которое совсем не то, которым подписывается игрок. Танк периодически дохнет и рождается заново, а player живет все время. У player'а есть еще одно свойство vehname, которое определяет как будет называться танк. Когда играешь в мясо, у игроков по умолчанию все эти поля пустые, следовательно в триггерах who не сработает.
Спасибо Insert! я все понял Думал-думал как who поставить в "Мясо", триггеры хотел поставить чтоб оружие появлялось и к танку прикреплялось сразу Теперь поставлю чтоб оружие под триггером появлялось
Отправлено: 26.12.09 15:44. Заголовок: Меня очень волнует э..
Меня очень волнует этот вопрос: "А можно задавать команды ботам?". И еще много вопросов по ботам... например заставлять ехать бота куда-то, делать что-то и т.д. Может это будет в дальнейшем, а сейчас я хочу узнать как можно это сделать с помошью скриптов (если можно)?
Отправлено: 26.12.09 19:00. Заголовок: официально давать ко..
официально давать команды ботам нельзя. неофициально есть один способ: создаешь в нужной точке бустер, и все боты в радиусе видимости немедленно ломятся туда. бустер в принципе можно сразу уничтожить - боты все равно поедут в точку где он был.
Отправлено: 26.12.09 22:35. Заголовок: чисто пофантазировал..
чисто пофантазировал сейчас, ставишь бустер подальше от бота, удаляешь его, он едет в ту сторону, на его пути ставишь триггер который спавнит бустер в другом месте, на пути к нему еще один его удаляющий, и так постоянно...только я уже не помню, у триггера есть возможность удалять объекты?
Отправлено: 27.12.09 21:21. Заголовок: да хоть что то...и с..
да хоть что то...и с одним побаловаться тоже можно) а невидимый бустер, можно просто сделать прозрачную текстуру, хотя тогда играть будет не очень удобно)
Отправлено: 30.12.09 10:01. Заголовок: Я попробовал создать..
Я попробовал создать свою кампанию. У меня вопросы: триггер предназначен в данном случае для экипировки танка под именем "1"; почему при попадании в зону триггера в командной строке пишет: объект под именем "1" не является танком. И ещё почему при попадании в зону триггера, который должен дамагить на 1000000 танк, в командной строке пишет damage(100000, "tank") (null)
Отправлено: 30.12.09 10:29. Заголовок: vlad0dalv пишет: И ..
vlad0dalv пишет:
цитата:
И ещё почему при попадании в зону триггера, который должен дамагить на 1000000 танк, в командной строке пишет damage(100000, "tank") (null)
Посмотри, инс пишет:
цитата:
например, если хочешь убить того, кто наехал на триггер, просто пишешь damage(1000,who)
vlad0dalv пишет:
цитата:
Я попробовал создать свою кампанию. У меня вопросы: триггер предназначен в данном случае для экипировки танка под именем "1"; почему при попадании в зону триггера в командной строке пишет: объект под именем "1" не является танком.
vlad0dalv почитай эту тему Morse уже кучи раз отвечал на этот вопрос. Morse пишет:
цитата:
В частности ошибка с которой я сам часто сталкивался: дают имя сервису, и забывают дать имя танку, который этот сервис будет себе рожать. там есть одна переменная, vehname если я не ошибаюсь, она должна быть непустой. иначе все это не будет работать.
Отправлено: 03.01.10 20:59. Заголовок: как сделать так, что..
как сделать так, чтобы при попадании в зону триггера менялась команда танка? Я пробовал pset("1","team","2"), но пишет что для свойства 'team' необходимо целое значение 'value'. '1'- name, и vehname, и nick 'team'- prop '2'- value (целое число) (Вроде всё правильно)
Отправлено: 05.01.10 16:14. Заголовок: vlad0dalv пишет: А ..
vlad0dalv пишет:
цитата:
А как тогда сделать так чтобы сервис выполнял последовательно разные ai действия с самого появления?
как ты себе это представляешь? допустим ты выдал сервису последовательность команд - как он должен определить что данная команда выполнена и можно приступать к следующей? ну предположим с маршем и подбором еще можно - бот добирается до определенной точки и это можно считать завершением. а атака? до первого попадания? до уничтожения? до обращения в бегство? ведь самостоятельно все это проделать очень просто: сказал боту ехать туда-то, и шмяк туда триггер, в on_enter которого следующую команду. сказал подобрать предмет, а в on_pickup ему новую дерективу. сказал боту "убить", а в on_destroy убиенного - продолжение. А вообще конечно боты кривовастенькие. Округление пути B-сплайнами это конечно сурово, но при этом следует признать что к нынешней версии они уже устарели. Что ж, ничто не идеально, надо выбирать ориентироваться ли на игру с людьми (сеть) или с компом (боты). Думаю большинство предпочтет сеть.
Отправлено: 05.01.10 17:35. Заголовок: Morse ДЕЛО В ТОМ, ЧТ..
цитата:
как ты себе это представляешь? допустим ты выдал сервису последовательность команд - как он должен определить что данная команда выполнена и можно приступать к следующей? ну предположим с маршем и подбором еще можно - бот добирается до определенной точки и это можно считать завершением. а атака? до первого попадания? до уничтожения? до обращения в бегство? ведь самостоятельно все это проделать очень просто: сказал боту ехать туда-то, и шмяк туда триггер, в on_enter которого следующую команду. сказал подобрать предмет, а в on_pickup ему новую дерективу. сказал боту "убить", а в on_destroy убиенного - продолжение.
Morse ДЕЛО В ТОМ, ЧТО Я ЭТО И ДЕЛАЛ ТАК ЖЕ НО НЕ ПОЛУЧАЛОСЬ, ПОЭТОМУ Я СЮДА И ПРИШЁЛ. Попробуй сам так сделать и проверь.
и т. д. пишет: object or name expected to, got nil и самое смешное, что они начинают ездить, но оружие по команде не берут (и вообще не берут; передвигаются хаотично или обычно от стационарных пушек)
Отправлено: 06.01.10 21:08. Заголовок: во-первых так грамот..
во-первых так грамотнее с точки зрения теории программирования - в качестве параметра ты передаешь в функцию объект, а не какую-то бессмысленную строку. во-вторых объекты - вещь знакомая, всегда очевидно чего он может и как его можно использовать. ну и наконец в-третьих - чтобы не эскейпить кавычки. текст из-за них в такую мешанину превращается...
Отправлено: 07.01.10 02:18. Заголовок: vlad0dalv затем еще,..
vlad0dalv затем еще, чтобы не выдумывать уникальных имен для всех объектов, чтобы по-простому работать с массивами объектов, чтобы иметь возможность обращаться к безымянным объектам, чтобы удобнее обращаться к свойствам объектов через точку, а не через pset/pget, чтобы при отладке скрипта в консоли получать подсказку по свойствам (пишешь user.ai_obj. потом жмешь Tab и сразу видишь, какие у объекта есть свойства). Наконец, это быстрее в плане производительности - ссылка напрямую связана с конкретным объектом, а по имени нужно каждый раз искать нужный объект среди кучи других.
--создает объект "лес", который повреждает все находящиеся рядом танки со скоростью dam*60 hp в секунду --сам объект движется по фигуре лиссажу с центром в stx sty радиусами rx ry частотами ax ay начальной фазой t --и скоростью 1/sp. nameo - имя, должно быть непустым и уникальным. например запуск с параметрами --user.moveRadiation(10,10,7,3,1,1,0,500,10,"test") создаст объкт движущийся по эллипсу с центром в 10 10 и радиусами --7 по горизонтали и 3 по вертикали с малой скоростью и сильным дамагом (танк выносится за один проход) function user.moveRadiation(stx,sty,rx,ry,ax,ay,t,sp,dam,nameo) for i=1,60 do local coordx = stx*32+rx*32*math.cos(ax*(i+t)*2*3.1415/sp) local coordy = sty*32+ry*32*math.sin(ay*(i+t)*2*3.1415/sp) pushcmd(function() if exists(nameo.."wo") then kill(nameo.."wo") end if exists(nameo.."tr") then kill(nameo.."tr") end actor("wood",coordx,coordy,{name=nameo.."wo"}) actor("trigger",coordx,coordy,{name=nameo.."tr",radius=2,on_enter="damage("..dam..",who)"}) end,i/60) end t=t+60 if t>=sp then t=t-sp end pushcmd(function() user.moveRadiation(stx,sty,rx,ry,ax,ay,t,sp,dam,nameo) end, 1) end
наконецто это понял :) но не могу понять что значят эти знаки: (если я хочу создать несколько ящиков которые движутся по линии) Morse пишет:
Отправлено: 09.01.10 20:39. Заголовок: эти знаки значат наз..
эти знаки значат названия переменных. что эти переменные делают вроде бы описано весьма четко. линия впринципе тоже являет собой фигуру лиссажу, просто одна из частот должна быть равной нулю, или частоты должны быть равны.
В точности так? =) И в дополнение к VIRUS - что надо добавить чтоб взрыв был например с перерывом в х секунд, но постоянно на протяжении всей карты??? И еще, куда скрипт выше писать в редакторе КАРТ (не кампании)?
Отправлено: 10.01.10 22:38. Заголовок: а еще можно микроско..
а еще можно микроскопом гвозди забивать. в каждой карте есть такая шняга как скрипт инициализации. туда всю эту радость можно преспокойно запихать. вот только скрипта на бесконечную бомбежку никто покамест не писал - придется потрудиться самому.
Подскажите плиз. Хочу сделать такукую фишку- выключатель), врезаешься в кирпич и включаются прожектора. Можно ли такое сделать? И что тогда писать в строке on_damage у объекта, выполняющего роль выключателя?
function user.onToggle1Damage() pset("tog1","health",500); if (user.toggle1Active==0) then user.toggle1Active=1 if (user.toggle1Close == 1) then pset("spotlight","active",(0)); user.toggle1Close=0; pset("tog1","corner",3); else pset("spotlight","active",(1)); user.toggle1Close=1; pset("tog1","corner",1); end pushcmd(function() user.toggle1Active=0 end,3) end end
Отправлено: 18.01.10 14:47. Заголовок: теперь уже у меня ес..
теперь уже у меня есть вопросы)
1. зачем пихать всю эту байду в отдельные файл, разве не сработает если пихнуть напрямик в инит-скрипт?
2. а сработает ли такая штука:
local function ToggleLight(light) light.active = !(light.active) -- или not(light.active), я уж не помню как там end
3. какое-то странное применение переменнопараметрической функции... почему пары? в каком виде такие параметры представляются в функции? чему будет равняться, скажем, "a", если я напишу в этой функции
Отправлено: 18.01.10 16:26. Заголовок: Morse конечно можно..
Morse конечно можно запихать и в инит скрипт, только в одну строчку неудобно же.
Штука не сработает из-за особенностей обработки луой булевых значений. Дело в том, что луа воспринимает всего две вещи как false - собственно false и nil. Любая строка, включая пустую, таблица, все числа, включая 0, воспринимаются как true. Свойство active возвращает число, следовательно not active всегда будет false. Кроме того, нельзя неявно конвертировать буль обратно в число, то есть light.active = true даст ошибку.
пары потому, что в стандартной луа есть два удобных способа перебрать элементы таблицы - pairs & ipairs. Первое работает с любыми ключами, а второе только c целочисленными ключами до первого промежутка. Троеточие - это способ записи многих аргументов. Оно по сути работает как множественное значение, то есть можно записать local x,y=... и надеяться что число аргументов совпадет. Если троеточие сунуть в скобки {...} то сконструируется таблица, как если бы мы написали {x,y,13}. В такой таблице ключами будут следующие подряд целые числа, начиная с 1 - как нам того и хотелось для ipairs :)
Есть еще один менее удобный способ перебрать элементы с целыми ключами - использовать оператор # для определения длины массива.
Отправлено: 18.01.10 21:54. Заголовок: Morse прикольно! я к..
Morse прикольно! я кстати не догадался зафигачить многострочный текст в строку инициализации кстати, массив user.lights={} можно так же сделать локальным local lights={} чтобы не замусоривать пространство имен
Отправлено: 19.01.10 23:07. Заголовок: по строчкам задаем ..
по строчкам
задаем переменную i задаем пустой "массив" (или что тут под ним понимают) входим в цикл с постусловием тут у тебя ошибка. i-тому элементу массива мы присваиваем ссылку на объект с соотв. именем инкремент если объекты с заданными именами кончились, выходим из цикла
объявляем функцию начинаем итерацию по элементам массива если рандомное число больше 0.75 свойству active присваиваем 0, иначе 1 конец цикла рекурсивно закидываем функцию в очередь конец функции
вызываем функцию в первый раз
всем фонарям на карте были вручную даны имена (от l1 и далее по порядку). это конечно неудобно, но другого варианта нет (по крайней мере пока)
Отправлено: 20.01.10 13:29. Заголовок: вопрос по скрипту: я..
вопрос по скрипту: я хочу чтобы при уничтожение какого-либо объекта игра становилась на паузу и писалось сообщение, вот я прописываю в on_destroy такую фразу freeze(true); message("Команда хХх выиграла"). Уничтожаю объект и ничего не происходит, что я делаю не так З.Ы. у меня версия 1:48
Отправлено: 20.01.10 21:22. Заголовок: во-первых l - малень..
во-первых l - маленькое, не L, а во-вторых, у меня - нет с единицы. а вообще без разницы, хоть с -10, только переменную i надо будет нужным числом инициализировать. и я не уверен как с таким вывертом ipairs подружится...
и кстати если уж на то пошло то и l можно на L заменить, только тогда уж везде.
Отправлено: 20.01.10 21:44. Заголовок: И ещё подскажите пож..
И ещё подскажите пожалуйста. В версии 1.49-1.51 есть объект- декорация. В его свойствах под его текстуру можно подогнать любой файл из папки textures(вроде бы как), а как сделать чтобы в декорацию можно было загнать простую картинку, ну например эту
Отправлено: 20.01.10 22:14. Заголовок: картинку надо перегн..
картинку надо перегнать в 32-х битный (обязательно) tga, потом написать для этой картинки lua файл с извращенным синтаксисом (пример - в любой крупной кампании или в файле textures.lua), а потом на этот луа-файл кастануть loadtheme, после этого он появится в списке текстур
Отправлено: 21.01.10 10:52. Заголовок: А лучше этот луа-фай..
А лучше этот луа-файл положить в папку с темами и поставить его как тему в сойствах карты, иначе подцепленная подобным образом текстура на объекте не сохранится после save/load.
hdr{ attr heightd attr widthd attr author attr desc attr e-mail attr link-url attr on_init attr function explosion(x, y, times, spd) local times = times or 1 local spd = spd or 0 for i=0, times-1 do pushcmd(function() actor("user_object", x, y, {name="exploder"}); damage(100, "exploder") end, 0+i/100*spd) end end
function bombard(x1, y1, x2, y2, times, spd, explo, explospd) times = times or 24 spd = spd or 15 explo = explo or 1 explospd = explospd or 0 local pixx = (x2-x1)/times local pixy = (y2-y1)/times for i=0, times-1 do pushcmd(function() explosion(x1+pixx*i, y1+pixy*i, explo, explospd) end, 0+i/100*spd) end end
function dangerzone(x1, y1, x2, y2, time, spd, islinear, linspd) time = time or 500 spd = spd or 500 islinear = islinear or 0 linspd = linspd or math.random(5, 20) if islinear==0 then local i=time/spd for q=0, i-1 do pushcmd(function() rx = math.random(x1*32, x2*32) ry = math.random(y1*32, y2*32) explosion(rx, ry) end, spd*q/100) end end if islinear==1 then local i=time/spd for q=0, i-1 do pushcmd(function() local rx1 = math.random(x1*32, x2*32) local rx2 = math.random(x1*32, x2*32) local ry1 = math.random(y1*32, y2*32) local ry2 = math.random(y1*32, y2*32) bombard(rx1, rx2, ry1, ry2, linspd, spd) end, spd*q/100) end end end theme desertattr type deathmatchattr version 5395}hdr dfn:y wall_concrete name x y health health_max on_destroy on_damage corner styleobj:" ЂA ЂA HB HB obj:" @B ЂA HB HB obj:" B ЂA HB HB obj:" C ЂA HB HB obj:" 0C ЂA HB HB obj:" PC ЂA HB HB obj:" ?C ЂA HB HB obj:" ЁC ЂA HB HB obj:" ёC ЂA HB HB obj:" ИC ЂA HB HB obj:" ШC ЂA HB HB obj:" иC ЂA HB HB obj:" шC ЂA HB HB obj:" D ЂA HB HB obj:" D ЂA HB HB obj:" D ЂA HB HB obj:" D ЂA HB HB obj:" $D ЂA HB HB obj:" ,D ЂA HB HB obj:" 4D ЂA HB HB ...
Отправлено: 22.01.10 01:33. Заголовок: опиши что именно не ..
опиши что именно не получается, и не печатай скрипты таким вырвиглазным методом.
и кстати: вывод консоли очень часто может ответить на все вопросы. поглядывай туда если тебе кажется что скрипты воркают не как надо, там ошибки всегда весьма заметны.
Отправлено: 22.01.10 20:37. Заголовок: я пишу в скрипте ини..
я пишу в скрипте инициализации
function explosion(x, y, times, spd) local times = times or 1 local spd = spd or 0 for i=0, times-1 do pushcmd(function() actor("user_object", x, y, {name="exploder"}); damage(100, "exploder") end, 0+i/100*spd) end end
function bombard(x1, y1, x2, y2, times, spd, explo, explospd) times = times or 24 spd = spd or 15 explo = explo or 1 explospd = explospd or 0 local pixx = (x2-x1)/times local pixy = (y2-y1)/times for i=0, times-1 do pushcmd(function() explosion(x1+pixx*i, y1+pixy*i, explo, explospd) end, 0+i/100*spd) end end
function dangerzone(x1, y1, x2, y2, time, spd, islinear, linspd) time = time or 500 spd = spd or 500 islinear = islinear or 0 linspd = linspd or math.random(5, 20) if islinear==0 then local i=time/spd for q=0, i-1 do pushcmd(function() rx = math.random(x1*32, x2*32) ry = math.random(y1*32, y2*32) explosion(rx, ry) end, spd*q/100) end end if islinear==1 then local i=time/spd for q=0, i-1 do pushcmd(function() local rx1 = math.random(x1*32, x2*32) local rx2 = math.random(x1*32, x2*32) local ry1 = math.random(y1*32, y2*32) local ry2 = math.random(y1*32, y2*32) bombard(rx1, rx2, ry1, ry2, linspd, spd) end, spd*q/100) end end end
Как ты с диско и при нахождении на триггер выполняется действие с помощью этих функций: взрывается пол стадии
Отправлено: 22.01.10 21:00. Заголовок: "Человек" и ..
"Человек" и "vlad0dalv", сидящие с одного IP: не используйте никаких форматирующих тегов. Ваши сообщения после премодерации приходят в нечитабельное состояние.
Что именно не работает? Триггер? Тогда поэкспериментируй с pushcmd. Пол стадии(я так понимаю, пол в значении "пол", а не "половина"?) взрывается по всей площади в один момент? Проверь, выставил ли ты все параметры в функции dangerzone, а time не равно 0.
Отправлено: 22.01.10 21:00. Заголовок: я хочу чтобы при уни..
я хочу чтобы при уничтожение какого-либо объекта игра становилась на паузу и писалось сообщение, вот я прописываю в on_destroy такую фразу freeze(true); message("Команда хХх выиграла"). Уничтожаю объект и ничего не происходит, что я делаю не так З.Ы. у меня версия 1:48
Отправлено: 25.01.10 22:56. Заголовок: А работает ли прикре..
А работает ли прикрепление бустера тогда, когда он появляется? Во-первых, с того сообщения (про баг с бустером) немало времени прошло, может исправили. Во-вторых, я не скриптописатель и если прикрепление уже возможно, то поподробнее пожалуйста. ЗАРАНННЕЕ СаПаСибо!
Отправлено: 29.01.10 21:57. Заголовок: Незнал куда написать..
Незнал куда написать этот вопрос, думаю тут ему место. Я, человек плохо разбирающийся в скриптах(!) решил сделать карту своего городачерез прогу mkmap (если её ещё помнят). Вот отрывок из ReadMe Чтобы преобразовать рисунок в карту, необходимо передать через командную строку имя входного и выходного файла: mkmap input [output] input - имя входного графического файла output - имя выходного файла карты (можно не указывать) Вот я открываю "пуск-- стандартные-- командная строка и ввожу в ней mkmap D:\1 [D:\map] И мне выводится надпись "mkmap не является внутреней и внешней командой, исполняемой программой или пакетным файлом Что мне делать?
Отправлено: 30.01.10 09:16. Заголовок: перетащи свою карту ..
перетащи свою карту на mkmap.exe и будет счастье А если из командной строки - сперва перейди в директорию с mkmap.exe командой "CD", а только потом вводи "mkmap.exe <обрабатываемый файл> [<обработанный файл>]".
Отправлено: 30.01.10 12:22. Заголовок: переношу эту картинк..
переношу эту картинку на ярлык mkmap.exe и выводит "функция не поддерживается, а в командной строке опять не является внутреней или внешней командой...
Отправлено: 25.07.10 03:34. Заголовок: А можно в новой верс..
цитата:
А можно в новой версии сделать что бы бот ехал за игроком? Постоянно до команды "стоп".
Вобще вот как то так
цитата:
function user.FolowToPlayer(ainame,vehtank) if ((exists(vehtank) == true) and (exists(pget(ainame,'vehname'))) == true) then local x,y = position(vehtank); local x1,y1 = position(pget(ainame,'vehname')); ai_stop(ainame); if (math.sqrt((x-x1)^2+(y-y1)^2) > 140) then ai_march(ainame, x, y); end end if (stop ==false ) then pushcmd(function() user.FolowToPlayer(ainame,vehtank); end, 0.4) end end
Юзать user.FolowToPlayer("Имя_любого_Бота","Название_танка_за_которым_следовать") . Глобальная переменная stop, изменяем на true и танк перестает двигаться за игроком, иначе, постоянно следует. но надо саму ф-цию стопа профиксить (т.к. она не стирает пути, а только стирает цель). Скину с утречка по вашему времени пофиксеную версию если надо
------------------------------------------
как и сказал вот профиксенный версия + исправленный мой скрипт-пример (удалил дофига лишнего + один из танков следует за игроком, но легко сделать и больше) убраны on_damage, on_pickup, health для игрока. В скрипте показано что легко обойтись и без них. А вот attacker реализован по другому и там это наглядно показано. В событии on_respawn (т.к. именно в этот момент создается объект с названием vehname) для любого игрока\бота задается событие on_damage для его танка. Т.е. появилось новое событие on_damage для танка в котором возвращается объект в локальной переменной who который атаковал. А от него уже можно плясать дальше (вообщем в примере найдете). в редакторе НЕ обращаем внимания на Особый динамический Объект, он если и появится у Инса то будет реализован по другому, на основе ящика, чтобы боты его осязали, да и так правильней. Мультиплеер отключен т.к. в текущем состоянии у него нет будущего, его надо переделывать под корень.
Отправлено: 25.07.10 13:37. Заголовок: Смотрю и нифига не п..
Смотрю и нифига не понимаю. Можешь расписать функции
цитата:
function user.moveObjectsX(stx,sty,endx,name,sti,endi,tox) local numi = (endx - stx) * 16 local toy = 0 stx = ((stx - 1) * 32) + 16 sty = ((sty - 1) * 32) + 16 endx = ((endx - 1) * 32) + 16 if numi < 0 then numi = - numi -- аналог math.abs - я не знаю существует ли он end local intx = (endx-stx)/numi for i = 1,numi do pushcmd(function ()user.moveObjectsOneIteration(stx+intx*i,sty,name,sti,endi,tox,toy) end,i/16) end end
Отправлено: 25.07.10 14:05. Заголовок: Эта функция просто п..
Эта функция просто перемещает объекты которые по Х Тут тебе только время в таймере стоит редактировать, все остальное это подгонка под 32 пиксельные клетки, чтобы передвегаться по ним, остальное менять здесь ничего не стоит , все и так отлажено.
цитата:
function user.moveObjectsX(stx,sty,endx,name,sti,endi,tox) -- перемещение объекта по X local numi = (endx - stx) * 16 local toy = 0 stx = ((stx - 1) * 32) + 16 sty = ((sty - 1) * 32) + 16 endx = ((endx - 1) * 32) + 16 if numi < 0 then numi = - numi -- аналог math.abs - я не знаю существует ли он end local intx = (endx-stx)/numi for i = 1,numi do pushcmd(function ()user.moveObjectsOneIteration(stx+intx*i,sty,name,sti,endi,tox,toy) end,i/16) --если поставить вместо 16 64 то будет вообще плавный ход end end
Ну и как это работает. функция для передвижки первой стены. Читаем коментарий автора
--двигаем объект(ы) с точки stx sty до точки endx sty. объекты имеют вид --n1,n2,n3,...,nk где n - name а индексы - от sti до endi, --tox - +1 если нумирация слева направо, -1 если наоборот
цитата:
function user.onToggle1Damage() pset("tog1","health",500); if (user.toggle1Active==0) then user.toggle1Active=1 --открыть if (user.toggle1Close == 1) then user.moveObjectsY(7,5,3,"w",1,3,1); user.toggle1Close=0; pset("tog1","corner",3); else --закрыть user.moveObjectsY(7,3,5,"w",1,3,1); user.toggle1Close=1; pset("tog1","corner",1); end pushcmd(function() user.toggle1Active=0 end,3) end end
т.е. у нас user.moveObjectsY(7,5,3,"w",1,3,1); это мы двигаем все объекты у которых имя имеет вид "w1" "w2" "w3" ("w",1,3) с точки с кординатами по клеточной системе от X = 7 и Y=5 (те что возле мышки в редакторе подписываются в общем) до точки с кординатой по Y = 3 соответственно для user.moveObjectsX третий параметр это точка конца по X. Посмотри через редактор что и как расставлено и какие кординаты имеет. Последний параметр это с какой стороны ведем отсчет, слева или с права. Правда не понял относительно чего лево и право, но методом тыка понять можно :)
function user.moveObjectsX(stx,sty,endx,name,sti,endi,tox) local numi = (endx - stx) * 16 local toy = 0 stx = ((stx - 1) * 32) + 16 sty = ((sty - 1) * 32) + 16 endx = ((endx - 1) * 32) + 16 if numi < 0 then numi = - numi -- аналог math.abs - я не знаю существует ли он end local intx = (endx-stx)/numi for i = 1,numi do pushcmd(function ()user.moveObjectsOneIteration(stx+intx*i,sty,name,sti,endi,tox,toy) end,i/64) end end
Отправлено: 26.07.10 13:31. Заголовок: Не работает ты по ад..
цитата:
Не работает
по адекватней чутка пиши. Какие ошибки? все ли функции заинклудил. Если это полный код то тебе надо еще function ()user.moveObjectsOneIteration(stx+intx*i,sty,name,sti,endi,tox,toy) найти у него в коде и вставить в твой код
actor("trigger",272 + 32, 32, {name="t", on_enter="user.onOpen()"}) for i = 1, 10 do pushcmd(function() actor("wall_concrete", 272, i*32, {name="wall_n"..i}) end, 1 + 0.1 * i) end
function user.onOpen() if (user.toggle1Active==0) then user.toggle1Active=1 if (user.toggle1Close == 1) then user.moveObjectsY(9,2,30,"wall_n",1,10,1); user.toggle1Close=0; else user.moveObjectsY(9,30,2,"wall_n",1,10,1); user.toggle1Close=1; end pushcmd(function() user.toggle1Active=0 end,3) end end
создаст стену из 10 блоков в самом начале любой мапы. И тригер справа от первого блока этой стены , сразу на соседней клетке, по наезду на который стена проедит до 30 клетки. Еще раз заедишь и она начнет двигаться обратно. НО Так же тебе надо скопировать все функции Morse начиная строкой "--------БИБЛИОТЕКА ФУНКЦИЙ-by Morse" и до "---применяем к первой карте---"
Отправлено: 03.08.10 13:11. Заголовок: Способ создания-унич..
Способ создания-уничтожения надо признать идеологически неверным, устаревшим, и идущим вразрез с генеральной линией партии. Трясите антикиллера - пусть он в объектах сделает возможным редактирование координат. Сразу жить станет намного проще.
Отправлено: 04.08.10 04:35. Заголовок: Способ создания-унич..
цитата:
Способ создания-уничтожения надо признать идеологически неверным, устаревшим, и идущим вразрез с генеральной линией партии. Трясите антикиллера - пусть он в объектах сделает возможным редактирование координат. Сразу жить станет намного проще.
Идея хорошая, только проблемка в том что я исходники от своей версии мягко говоря запорол, соберу из своих патчей её заново, так что как восстановлю , постараюсь реализовать это 8 чудо света если координаты не слишком намертво там заделаны. Хотя способ с -удалить-восстановить на данном этапе еще можно использовать и не надо на него сильно плеваться. Если пере создавать объект со скоростью 0.01 секунды то получается очень красиво, фпс при этом практически не падает.
Сейчас доделываю одну компанию. После неё займусь )
function user.LevelChangeBox(n) if n~=nil then if n==1 then botreduce=botreduce-1 elseif n==2 then botreduce=botreduce+1 end end local levelname; if botreduce==1 then levelname="Средний" elseif botreduce==2 then levelname="Ниже среднего" elseif botreduce==3 then levelname="Легкий" elseif botreduce==4 then levelname="Сверх легкий" elseif botreduce==5 then levelname="для дошколят" elseif botreduce==0 then levelname="Сложный" elseif botreduce==-1 then levelname="Аццки сложный" elseif botreduce==-2 then levelname="Непобедимый" elseif botreduce<-2 then levelname="Чтото нереальное" elseif botreduce>5 then levelname="еще легче =/" end local low = botreduce*100 if n ~= 3 then service("msgbox", {text="Настройка уровня сложности\n Вы сейчас играете на уровне сложности \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.LevelChangeBox(n)",option1="Повысить",option2="Понизить",option3="Закрыть"}) for n = 1,3 do if exists("enemy"..n) then local bot = object("enemy"..n) if user.cpower==nil or user.cmax_speed==nil or user.cpower==0 or user.cmax_speed==0 then user.cpower=classes[bot.class].power[1] user.cmax_speed=classes[bot.class].max_speed[1] end classes[bot.class].max_speed[1]=user.cmax_speed-low classes[bot.class].power[1] = user.cpower-low bot.class=bot.class end end end
Отправлено: 17.08.10 11:53. Заголовок: Как разобратся? в че..
цитата:
Как разобратся?
в чем проблема конкретно ? Функция создает диалоговое окно в котором в зависимости от значения переменной botreduce выводит разные сообщения . Все остальное это применение класса боту.
Отправлено: 17.08.10 12:48. Заголовок: У меня тоже. Но как ..
У меня тоже. Но как их в скрипт вставить? Чтобы просто у всех игроков был класс в состоянии от левела. А как сделать что бы танк постоянно ехал, а игрок только поворачивал?
Отправлено: 17.08.10 12:59. Заголовок: VIRUS пишет: У меня..
VIRUS пишет:
цитата:
У меня тоже. Но как их в скрипт вставить? Чтобы просто у всех игроков был класс в состоянии от левела.
Честно говоря я тебе это и говорил. Я писал скрипт, но не дописал.
цитата:
function user.LevelChangeBox(n) botreduce = botreduce or 3 -- По умолчанию Нормальная сложность if n==1 then botreduce=botreduce-1 -- Если нажали "Понизить"- понижается elseif n==2 then botreduce=botreduce+1 --Аналогично)) end -- Честно, не знаю, сколько надо эндов end local levelname -- levelname локальный, а не глобальный if botreduce==0 then botreduce=botreduce+1 -- Если сложность ниже 1 возвращается на 1 elseif botreduce==1 then levelname="Кошмар" elseif botreduce==2 then levelname="Сложный" elseif botreduce==3 then levelname="Нормальный" elseif botreduce==4 then levelname="Лёгкий" elseif botreduce==5 then botreduce=botreduce-1 -- Если выше, то на 5 end service("msgbox", {text="Настройка уровня сложности\n Уровень сложности: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.LevelChangeBox(n)",option1="Повысить",option2="Понизить",option3="Закрыть"}) -- Ну тут разбираться не обязательно, наверное)) if levelname=="Лёгкий" then user.easy() -- Если сложнось лёгкая переходит на user.easy() Там хранятся классы для лёгкого режима elseif levelname=="Нормальный" then user.normal() elseif levelname=="Сложный" then user.hard() elseif levelname=="Кошмар" then user.nichtmare() -- =) end
Отправлено: 17.08.10 13:16. Заголовок: У меня тоже. Но как ..
цитата:
У меня тоже. Но как их в скрипт вставить? Чтобы просто у всех игроков был класс в состоянии от левела
для нужного бота если при создании то задаешь свой класс в параметре class для ai \ player_local а если потом то какой то ф-цией то вылавливаешь его как объект и меняеш что надо local bot = object("name_of_ai_service") bot.class="название_твоего_класса"
цитата:
А как сделать что бы танк постоянно ехал, а игрок только поворачивал?
Отправлено: 17.08.10 13:29. Заголовок: function user.LevelC..
цитата:
function user.LevelChangeBox(n) botreduce = botreduce or 3 if n==1 then botreduce=botreduce-1 -- Если нажали "Понизить"- понижается elseif n==2 then botreduce=botreduce+1 --Аналогично)) end -- Честно, не знаю, сколько надо эндов end --лишний end закрываем только конструкцию if then elseif then end, если бы было if then else if then end end то было бы 2 end'a local levelname -- levelname локальный, а не глобальный if botreduce==0 then botreduce=botreduce+1 -- Если сложность ниже 1 возвращается на 1 elseif botreduce==1 then levelname="Кошмар" elseif botreduce==2 then levelname="Сложный" elseif botreduce==3 then levelname="Нормальный" elseif botreduce==4 then levelname="Лёгкий" elseif botreduce==5 then botreduce=botreduce-1 -- Если выше, то на 5 end service("msgbox", {text="Настройка уровня сложности\n Уровень сложности: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.LevelChangeBox(n)",option1="Повысить",option2="Понизить",option3="Закрыть"}) -- Ну тут разбираться не обязательно, наверное)) if levelname=="Лёгкий" then user.easy() -- Если сложнось лёгкая переходит на user.easy() Там хранятся классы для лёгкого режима elseif levelname=="Нормальный" then user.normal() elseif levelname=="Сложный" then user.hard() elseif levelname=="Кошмар" then user.nichtmare() -- =) end
Это надо в коде рыться или в файле луа? Кто-нибудь объясните мне, зачем нужны pget и position . А то в Танкопедии ничего непонятно. Как они работают, мне понятно, но непонятно зачем.
Отправлено: 18.08.10 05:33. Заголовок: Это надо в коде рыть..
цитата:
Это надо в коде рыться или в файле луа?
Сам пока незнаю как модули подключать. Но когда подключ так там и так в примерах все приведено , врятли можно лучше объяснить. pget раньше (да и сейчас при необходимости) использовался для получения параметра объекта (health, class, on_die и т.д. все параметры которые видны в редакторе при редактировании объекта) вот как получали параметр объекта раньше
position выдает координаты объекта. На этом принципе основано перемещение объекта. Берем старые координаты-> прибавляем к ним шаг и получаем новые координаты-> двигаем объект на новые координаты-> получаем движение
function user.LevelChangeBox(n) botreduce = botreduce or 3 if n==1 then botreduce=botreduce-1 -- Если нажали "Понизить"- понижается elseif n==2 then botreduce=botreduce+1 --Аналогично)) end -- Честно, не знаю, сколько надо эндов end --лишний end закрываем только конструкцию if then elseif then end, если бы было if then else if then end end то было бы 2 end'a local levelname -- levelname локальный, а не глобальный if botreduce==0 then botreduce=botreduce+1 -- Если сложность ниже 1 возвращается на 1 elseif botreduce==1 then levelname="Кошмар" elseif botreduce==2 then levelname="Сложный" elseif botreduce==3 then levelname="Нормальный" elseif botreduce==4 then levelname="Лёгкий" elseif botreduce==5 then botreduce=botreduce-1 -- Если выше, то на 5 end service("msgbox", {text="Настройка уровня сложности\n Уровень сложности: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.LevelChangeBox(n)",option1="Повысить",option2="Понизить",option3="Закрыть"}) -- Ну тут разбираться не обязательно, наверное)) if levelname=="Лёгкий" then user.easy() -- Если сложнось лёгкая переходит на user.easy() Там хранятся классы для лёгкого режима elseif levelname=="Нормальный" then user.normal() elseif levelname=="Сложный" then user.hard() elseif levelname=="Кошмар" then user.nichtmare() -- =) end
Отправлено: 18.08.10 10:52. Заголовок: незнаю почему ошибку..
незнаю почему ошибку именно ту выдает но для начала исправь хотябы
цитата:
function user.Options() service("menu",{title="gui_splash",name="menu",names="Сложность|Режим|--[[лишний слеш]]-- |Назад",on_select="user.MenuOpt(n)"}) end --лишний end end
и надо не создавать новое меню , а использовать уже созданное как у меня в скриптах. т.е. user.menu = service.... и далее если что то меняем , например переменную names ...то так и пишем
цитата:
function user.Options() user.menu.names="blablabla" user.menu.open=1 user.menu.open=1 - это обновит список опций меню . Можно вынести в отдельную функцию типо user.refresh() end
Отправлено: 18.08.10 11:17. Заголовок: Как я понял мы не со..
цитата:
Как я понял мы не создаем еще одно а изменяем имена и функции прошлого? Но как?
лишний слеш обработается как отдельная кнопка service возвращает ссылку на наш объект, мы приравниваем её нашей глобальной переменной user.menu и через нее работаем с объектом в дальнейшем . Просто сервис menu в отличии от messageboxа сам не удаляется пока не перезагрузишь карту (тебе же в любой момент времени может понадобиться меню по нажатию ESC, по этому автоудаление бессмысленно)
Отправлено: 18.08.10 11:22. Заголовок: У меня теперь эта ош..
У меня теперь эта ошибка при нажатии на Настройки
[string "campaign/Snake.lua"]:77: attempt to index field 'menuservice' (a nil value)
Вот как выглядит функция
function user.Options() user.menuservice.names="Сложность|Режим|Назад" user.menuservice.on_select="user.MenuOpt(n)" user.Refresh() --для обновления меню if n == nil then return end if n ==1 then user.ChangeDifficult() elseif n == 2 then user.Rm() else user.menuservice.names="Старт|Настройки|О кампании" user.menuservice.on_select="user.Menu(n)" user.Refresh() end end
Отправлено: 18.08.10 11:45. Заголовок: function user.Option..
function user.Options() user.menuservice.names="Сложность|Режим|Назад" user.menuservice.on_select="user.MenuOpt(n)" user.Refresh() --для обновления меню if n == nil then return end if n ==1 then user.ChangeDifficult() elseif n == 2 then user.Rm() else user.menuservice.names="Старт|Настройки|О кампании" user.menuservice.on_select="user.Menu(n)" user.Refresh() end end
У меня здесь не работает кнопка "Назад"
function user.ChangeDifficult(n) botreduce = botreduce or 2 -- По умолчанию средняя сложность if n==1 then botreduce=botreduce-1 -- Если нажали "Понизить"- понижается elseif n==2 then botreduce=botreduce+1 --Аналогично end local levelname -- levelname локальный, а не глобальный if botreduce==0 then botreduce=botreduce+1 -- Если сложность ниже 1 возвращается на 1 elseif botreduce==1 then levelname="Лёгкий" elseif botreduce==2 then levelname="Средний" elseif botreduce==3 then levelname="Выше среднего" elseif botreduce==4 then levelname="Сложный" elseif botreduce==5 then levelname="Очень сложный" elseif botreduce==6 then botreduce=botreduce-1 -- Если выше, то на 5 end service("msgbox", {name="db", text="Настройка уровня сложности\n Уровень сложности: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.ChangeDifficult(n)",option1="Понизить",option2="Повысить",option3="Закрыть"}) if levelname=="Лёгкий" then user.Diff1() -- Если сложнось лёгкая переходит на user.Diff1() Там хранятся классы для лёгкого режима elseif levelname=="Средний" then user.Diff2() elseif levelname=="Выше среднего" then user.Diff3() elseif levelname=="Сложный" then user.Diff4() elseif levelname=="Очень сложный" then user.Diff5() end end
А здесь кнопка "Закрыть" я пробовал окно кильнуть не выходить
Отправлено: 18.08.10 12:13. Заголовок: У меня здесь не рабо..
цитата:
У меня здесь не работает кнопка "Назад"
у тебя так вообще ни одна кнопка в user.Options не будет работать т.к. ты не передаешь n т.е. n у тебя всегда ==nil
цитата:
А здесь кнопка "Закрыть" я пробовал окно кильнуть не выходить
а тут у тебя в on_select рекурсия и user.ChangeDifficult вызывается всегда по новой, т.е. заново создается и msgbox пофтыкай сам. Просто внимательней надо быть
Отправлено: 18.08.10 12:28. Заголовок: Да там лучше даже не..
Да там лучше даже не "фтыкать". От рекурсивных вызовов непонятных функций у любого парсера крыша съедет. И вообще весь этот код вызовет жгучую зависть у любого индуса.
Попробуй как-нибудь так (луа у меня нету, за правильность не отвечаю, наверняка где-нибудь слажал, но идея должна быть ясна):
function user.ChangeDiff() local botdiff = 2 local levelname = ["Easy","Normal","Advanced","Hard","Impossible"]
while (button != 3) service("msgbox", {---Черт вас в душу разберет что тут теперь писать надо---}) if ((button==1)and(botdiff > 1)) then botdiff -= 1 end if ((button==2)and(botdiff < 5)) then botdiff += 1 end end user.Diff(botdiff) end
Отправлено: 18.08.10 13:09. Заголовок: У тебя в скрипте так..
цитата:
У тебя в скрипте также, тоже создает каждый раз новое. Попробую разобраться
ну ненадо же все подчистую слизывать с меня у меня там в скрипте идет вполне логичное исключение "if n ~= 3 then" т.е. 3 вариант ответа исключен и продолжения при нем нет.
user.menuservice.on_select="user.MenuOpt(n)" надо user.menuservice.on_select="user.Options(n)"
А я смотрю смотрю и не замечаю --- Вот нашел ошибку как исправить не знаю. Когда нажимаю на кнопку меню, нажатие как бы дублируется в открывшемся меню. --- А можно ли создать локальную переменную в одной функции, а использовать её в другой. Пример: function primer() local nyk if not exits "eto" then nyk="1" end end
function primer2() if nyk=="1" then actor("water"{name="eto"}) end end
Отправлено: 19.08.10 10:41. Заголовок: slava98 Я пробую. У ..
slava98 Я пробую. У меня бот едет к точке а потом куда хочет.
VIRUS пишет:
цитата:
Вот нашел ошибку как исправить не знаю. Когда нажимаю на кнопку меню, нажатие как бы дублируется в открывшемся меню. --- А можно ли создать локальную переменную в одной функции, а использовать её в другой. Пример: function primer() local nyk if not exits "eto" then nyk="1" end end
function primer2() if nyk=="1" then actor("water"{name="eto"}) end end
Отправлено: 19.08.10 11:09. Заголовок: Дам еще один мини ур..
Дам еще один мини урок. смотри мою последнюю версию скрипта The Race (от 18 числа) , я там очень сильно все переделал в плане переменных, фактически все заново переписал . Глобальных там теперь почти нет , практически все и сплошь локальное как функции так и переменные. Основное правило Все глобальные переменные нужно помещать в табличку user, иначе будут проблемы с загрузкой/сохранением. То же самое касается функций, например function new() - неправильно Надо писать чтобы ф-ция была доступна для обработчиков событий объектов (on_select, on_damage, on_die и т.д.) function user.new() либо если нигде объектом не обрабатывается то local function new()
Локальные переменные работают в рамках своего end'a в твоем примере так работать не будет , надо делать глобальную user.nyk либо в самом начале скрипта (вообще до начала публикаций функций и т.д. её задать) написать local nyk т.е. сработает только так
цитата:
local nyk
function primer() if not exits "eto" then nyk="1" end end
function primer2() if nyk=="1" then actor("water"{name="eto"}) end end
с локальными функциями также, Если одна локальная ф-ция используется другой, то локальная функция должна быть обязательно задана вышей той что её вызывает
Ну и надо не забывать что по умолчанию все переменные являются глобальными и надо приписывать везде либо user. либо делать local , ну у тебя вроде в этом плане нормально
про меню это нужен весь код. Но возможно у тебя все в одной функции идет и ты где то что то случайно повторно вызываешь или еще чего.
function user.Menu(n) if n == 1 then user.Game(n) elseif n == 2 then user.Options(n) elseif n == 3 then user.About() end end
function user.About() service("msgbox", {text="Кампания Snake созданна как модификация танков\nКампания создавалась на основе неофициальной версии\n(c)\n Автор VIRUS\n Версия 1.0"}) end
function user.Rm() service("msgbox", {text="К сожалению эта функция еще не реализована\n Ждите релиза в следующих версиях"}) end
function user.Refresh() if exists(user.menuservice.name)==true then --фактически пересоздаем меню если нам надо посмотреть изменения user.menuservice.open=1 user.menuservice.open=1 end end
function user.Options(n) user.menuservice.names="Сложность|Режим|Назад" user.menuservice.on_select="user.Options(n)" user.Refresh() --для обновления меню if n == nil then return end if n == 1 then user.ChangeDifficult() elseif n == 2 then user.Rm() else user.menuservice.names="Игра|Настройки|О кампании" user.menuservice.on_select="user.Menu(n)" user.Refresh() end end
function user.Game(n) user.menuservice.names="Старт|Карта|Назад" user.menuservice.on_select="user.Game(n)" user.Refresh() if n == nil then return end if n == 1 then user.Start() elseif n == 2 then user.ChangeMap() else user.menuservice.names="Игра|Настройки|О кампании" user.menuservice.on_select="user.Menu(n)" user.Refresh() end end
function user.ChangeDifficult(n) botreduce = botreduce or 2 -- По умолчанию средняя сложность if n==1 then botreduce=botreduce-1 -- Если нажали "Понизить"- понижается elseif n==2 then botreduce=botreduce+1 --Аналогично end local levelname -- levelname локальный, а не глобальный if botreduce==0 then botreduce=botreduce+1 -- Если сложность ниже 1 возвращается на 1 elseif botreduce==1 then levelname="Лёгкий" elseif botreduce==2 then levelname="Средний" elseif botreduce==3 then levelname="Выше среднего" elseif botreduce==4 then levelname="Сложный" elseif botreduce==5 then levelname="Очень сложный" elseif botreduce==6 then botreduce=botreduce-1 -- Если выше, то на 5 end if n ~= 3 then service("msgbox", {text="Настройка уровня сложности\n Уровень сложности: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.ChangeDifficult(n)",option1="Понизить",option2="Повысить",option3="Закрыть"}) if levelname=="Лёгкий" then user.Diff1() -- Если сложнось лёгкая переходит на user.Diff1() Там хранятся классы для лёгкого режима elseif levelname=="Средний" then user.Diff2() elseif levelname=="Выше среднего" then user.Diff3() elseif levelname=="Сложный" then user.Diff4() elseif levelname=="Очень сложный" then user.Diff5() end end end
local levelid
function user.ChangeMap(n) botreduce = botreduce or 1 if n==1 then botreduce=botreduce-1 elseif n==2 then botreduce=botreduce+1 end local levelname if botreduce==0 then botreduce=botreduce+1 elseif botreduce==1 then levelname="Без лабиринта" elseif botreduce==2 then levelname="Квадрат" elseif botreduce==3 then levelname="Квадрат внутри" elseif botreduce==4 then levelname="Паралели и перпендекуляр" elseif botreduce==5 then levelname="Комнаты" elseif botreduce==6 then botreduce=botreduce-1 end if n ~= 3 then service("msgbox", {text="Выбор карты для игры\n Карта: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.ChangeMap(n)",option1="Предыдущая",option2="Следующая",option3="Закрыть"}) if levelname=="Без лабиринта" then levelid="1" elseif levelname=="Квадрат" then levelid="2" elseif levelname=="Квадрат внутри" then levelid="3" elseif levelname=="Паралели и перпендекуляр" then levelid="4" elseif levelname=="Комнаты" then levelid="5" end end end
function user.Start() if levelid=="1" then user.LoadLevel1() elseif levelid=="2" then user.LoadLevel2() elseif levelid=="3" then user.LoadLevel3() elseif levelid=="4" then user.LoadLevel4() elseif levelid=="5" then user.LoadLevel5() end end
Отправлено: 20.08.10 08:53. Заголовок: Похоже я Anti_Killer..
Похоже я Anti_Killerа уже достал. Но вот как сделать ПРАВИЛЬНО не пойму.
local levelid
function user.ChangeMap(n) botreduce = botreduce or 1 if n==1 then botreduce=botreduce-1 elseif n==2 then botreduce=botreduce+1 end local levelname if botreduce==0 then botreduce=botreduce+1 elseif botreduce==1 then levelname="Без лабиринта" elseif botreduce==2 then levelname="Квадрат" elseif botreduce==3 then levelname="Квадрат внутри" elseif botreduce==4 then levelname="Паралели и перпендекуляр" elseif botreduce==5 then levelname="Комнаты" elseif botreduce==6 then botreduce=botreduce-1 end if n ~= 3 then service("msgbox", {text="Выбор карты для игры\n Карта: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.ChangeMap(n)",option1="Предыдущая",option2="Следующая",option3="Закрыть"}) if levelname=="Без лабиринта" then levelid="1" elseif levelname=="Квадрат" then levelid="2" elseif levelname=="Квадрат внутри" then levelid="3" elseif levelname=="Паралели и перпендекуляр" then levelid="4" elseif levelname=="Комнаты" then levelid="5" end end end
function user.Start() if levelid=="1" then user.LoadLevel1() elseif levelid=="2" then user.LoadLevel2() elseif levelid=="3" then user.LoadLevel3() elseif levelid=="4" then user.LoadLevel4() elseif levelid=="5" then user.LoadLevel5() end end
Отправлено: 20.08.10 09:38. Заголовок: Да помогу пока настр..
Да помогу пока настроение есть 1. не ставь числа в ковычки вроде "1" 2. end не там где надо поставил . Ставь до if levelname=="Без лабиринта" then levelid="1" и убирай один снизу. 3. функция user.Start() у тебя нигде не прописана. Т.е. ее не что не вызывает
Отправлено: 20.08.10 10:39. Заголовок: А можно ли писать та..
А можно ли писать так pushcmd( function() service ("player_local", {name"snake1", nick="Змея", class="user.Class"}) end, 1) ------------------------------------------------------------------------------------------------------------↑ это функция
Отправлено: 20.08.10 11:08. Заголовок: function user.Start(..
function user.Start() if levelid=="mapa1" then user.LoadLevel1() elseif levelid=="mapa2" then user.LoadLevel2() elseif levelid=="mapa3" then user.LoadLevel3() elseif levelid=="mapa4" then user.LoadLevel4() elseif levelid=="mapa5" then user.LoadLevel5() end end ----------------------------------------------
--функции игры--
function user.LoadLevel1() pushcmd( function() loadmap ("campaign/Snake/maps/Snake_1.map") end, 1) pushcmd( function() service ("player_local", {name="snake1", nick="Змея", class="user.Class"}) end, 1) end
Никакой ошибки нет, но при нажатии на старт ничег не работает
Отправлено: 01.11.10 12:18. Заголовок: function pda() if us..
цитата:
function pda() if user.pda == 1 then user.msg=Проверка КПК. Сообщение 1 elseif user.pda == 2 then user.msg=Проверка КПК. Сообщение 2 elseif user.pda == 3 then user.msg=Проверка КПК. Сообщение 3 end end end end
Это моя попытка сделать ПДА, как в Doom 3.
цитата:
function user.pdabox(n) botreduce = botreduce or 0 if n==1 then botreduce=botreduce-1 elseif n==2 then botreduce=botreduce+1 end end pda() if botreduce==0 then botreduce=botreduce+1 elseif botreduce==1 then user.pda=1 elseif botreduce==2 then user.pda=2 elseif botreduce==3 then user.pda=3 elseif botreduce==4 then botreduce=botreduce-1 end service("msgbox", {text="[..user.msg..]",on_select="user.pdabox(n)",option1=">",option2="<",option3="Закрыть"})
Это тоже. Только другой отрывок.
цитата:
--*Мы загружаем PDA. Пока в тестовом режиме. user.pda=1 -- Нам нужно 1-ое сообщение... pda() -- ...и мы его загружаем.. user.pdabox() -- ...и высвечиваем.
А это я пробую его вызывать.
цитата:
runtime error: data/campaign/War System/scripts/level1.lua:6: attempt to call global 'pda' (a nil value)
А это ошибка. Объясните, что не так. И ещё:
цитата:
function user.shockin() kill("shoker1") pushcmd(function() message("Это электро-взрывчатка! Она поможет достать бустер!") end, 1) actor("user_sprite", 470, 695, { name="shocksprite", texture="user/ekivator", layer=11 }) actor("trigger", 480, 695, { name="shocktrig", on_enter="user.shockout()" }) end
Отправлено: 07.11.10 14:30. Заголовок: А это ошибка. Объяс..
цитата:
А это ошибка. Объясните, что не так.
функция у тебя user.pda() а зовешь просто pda() которой не существует. (это я тебе просто перевел сообщение ошибки. Внимательно читай еррор месаги, в них почти всегда вся соль)
цитата:
Тут всё правильно? И как сделать так, чтобы объект появился на 48, а не на 4,8 и не на 480?
если лень каждый раз выщитывать то вместо числа - кординаты пиши get32(кордината) предварительно вставив в свой скрипт сверху функцию
цитата:
local function get32(num) return ((num-1) * 32) + 16; end
она будет пересчитывать твои "клетки" из редактора в пиксели
Отправлено: 07.11.10 19:02. Заголовок: если лень каждый раз..
цитата:
если лень каждый раз выщитывать то вместо числа - кординаты пиши get32(кордината) предварительно вставив в свой скрипт сверху функцию
СПС, попробую. А сеёчас у меня совсем другой скрипт.
цитата:
function user.mailbox(n) if n==nil then if n==1 then botreduce=botreduce-1 elseif n==2 then botreduce=botreduce+1 end end if botreduce==0 then botreduce=botreduce+1 elseif botreduce==1 then mailnum=1 elseif botreduce==2 then mailnum=2 elseif botreduce==3 then mailnum=3 elseif botreduce==4 then mailnum=4 elseif botreduce==5 then botreduce=botreduce-1 end mail(mailnum) service("msgbox", {text=user.msg,on_select="user.mailbox(n)",option1="Назад",option2="Вперёд",option3="Закрыть"}) end else if n==3 then end end
function mail(message) if message == 1 then user.msg="Добро пожаловать в наше боевое поселение Экиваторов!" elseif message == 2 then user.msg="Проверка КПК. Сообщение 2" elseif message == 3 then user.msg="Проверка КПК. Сообщение 3" elseif message == 4 then user.msg="4" end end
Всё работает, кроме кнопки "Закрыть". Ошибок нет. П.С. Я имел ввиду, что игра не ругается.
Отправлено: 13.11.10 18:29. Заголовок: Не работает :( funct..
Не работает :( function user.WaterFire() local lifeobj lifeobj = pget("obj_water", "health") if lifeobj == 2000 then pset("dec_water", "texture", "user/water1") elseif lifeobj == 1500 then pset("dec_water", "texture", "user/water2") elseif lifeobj == 1000 then pset("dec_water", "texture", "user/water3") elseif lifeobj == 500 then pset("dec_water", "texture", "user/water4") elseif lifeobj == 100 then pset("dec_water", "texture", "user/waterfinal") elseif lifeobj == 1 then kill("obj_water") elseif lifeobj == 1 then kill("dec_water") end end
Отправлено: 15.11.10 07:13. Заголовок: А как задать? хп объ..
цитата:
А как задать? хп объекта
pset и pget надо использовать редко. С тех пор как Insert ввел функцию object они ушли на второй план
цитата:
function user.WaterFire() local lifeobj lifeobj = pget("obj_water", "health") if lifeobj == 2000 then pset("dec_water", "texture", "user/water1") elseif lifeobj == 1500 then pset("dec_water", "texture", "user/water2") elseif lifeobj == 1000 then pset("dec_water", "texture", "user/water3") elseif lifeobj == 500 then pset("dec_water", "texture", "user/water4") elseif lifeobj == 100 then pset("dec_water", "texture", "user/waterfinal") elseif lifeobj == 1 then kill("obj_water") elseif lifeobj == 1 then kill("dec_water") end end
можно записать как
цитата:
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" else then kill("obj_water") kill("dec_water") -- и вот это не правильно все равно. Если хочешь чтоб при смерти одного объекта умер и второй, добавь событие в on_die или в on_destroy объекта при убийстве которого надо убивать второй end end
соответственно задать хп объекта можно просто приравняв obj1.health = 100
Anti_Killer спасибо. Но второй объект и не должен умирать. Но у меня есть тоже вопрос: - Как взять хп с помощью pget у сервиса player? Создаётся танк и сервис, а имя только у сервиса. А мне нужно взять хп у танка. (с помощью функции pget) И ещё один (мы с Вирусом закидываем вопросами , но это потому что я не знал новинки новой версии, и они в Танкопедии не записаны ): - Я знаю, что можно загрузить какой-нибудь файл в скриптах. Так игра сохранялась и загржалась в The Race. А можно сделать так, чтобы игра запускала файл lang.cfg с помощью скриптов из указанного места?
Отправлено: 15.11.10 13:18. Заголовок: Как взять хп с помо..
цитата:
Как взять хп с помощью pget у сервиса player?
vehname и есть объект танк. Проверяй хп у танка . вот и все.
цитата:
Создаётся танк и сервис, а имя только у сервиса. А мне нужно взять хп у танка. (с помощью функции pget)
не вижу проблемы в задании параметра vehname у player_local
цитата:
- Я знаю, что можно загрузить какой-нибудь файл в скриптах. Так игра сохранялась и загржалась в The Race. А можно сделать так, чтобы игра запускала файл lang.cfg с помощью скриптов из указанного места?
нет. Скрипты и игровые файлы вроде lang.cfg никак не связаны. lang.cfg обрабатывается при запуске игры
Отправлено: 15.11.10 15:39. Заголовок: Anti_Killer а почему..
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
Отправлено: 16.11.10 02:43. Заголовок: а почему тогда? мне..
цитата:
а почему тогда?
мне то по чем знать что у тебя что ? Если у тебя obj_water это service player_local, тогда тебе надо сначала получить vehname, задать его как object, потом уже получать от него health
Отправлено: 16.11.10 15:52. Заголовок: Я хочу чтобы при дам..
цитата:
Я хочу чтобы при дамаге этого особого объекта менялись текстуры у декорации.
Ну вот самый минимум для этого, начинай с малого проверяй на каком моменте тупит
цитата:
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
Будет работать? На 5 секунде загружается карта 1, на 10 - 2, на 15 - 3, на 20 - пишится текст и потом всё сначала, на 25 опять грузится 1 карта. Мне это нужно для того, чтобы сделать вращающиеся фонари и триггеры. Последние должны перемещаться по свету фонарей. Типа тревоги.
Отправлено: 24.12.10 14:21. Заголовок: В Бейсике можно зада..
В Бейсике можно задать с помощью цикла for переменную, имеющую несколько значении, чаще всего от одного числа до другого. В ТЗОДЕ скорее всего тоже самое. Только используется по-другому. Ещё в Бейсике можно отключить цикл DO.. LOOP, функцией EXIT DO, а в ТЗОДЕ я его могу отключить с помощью if.. then.
Отправлено: 24.12.10 15:59. Заголовок: такая функция вылети..
такая функция вылетит с ошибкой переполнения стека. последний вызов user.1() надо тоже пихнуть в очередь, тогда будет работать. Я называю этот прием "рекурсивным заполнением очереди", и он у меня встречается во всем чем только можно. Для примера можешь глянуть мою кампанию "такой большой и такой адронный" или карту dm5_disco_edition (где-то тут на форуме все должно быть)
Отправлено: 11.06.11 12:56. Заголовок: if exists ("e1..
цитата:
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"})
Тоже не работает. Триггер спавниться, всё хорошо, только функция не работает. Выходит только
Отправлено: 11.06.11 18:30. Заголовок: if who.name==e4 заме..
if who.name==e4 заменить на if who.name=="e4" Это для начала. Так как кавычки будут внутри строки - заэскейпить их, т.е. if who.name==\"e4\" По поводу первого - не знаю, инфы мало.
А вообще, гляди в консоль - там оно ругаться должно что именно не работает.
Отправлено: 12.06.11 11:44. Заголовок: Спасибо! А то я не з..
Спасибо! А то я не знаю, как использовать функции. "" мог бы догадаться. А про эскейп не знал... Ах да! С кавычками не работал, вот и удалил... Ещё вопрос: а можно было перед этим поставить e4="e4"?
цитата:
А вообще, гляди в консоль - там оно ругаться должно что именно не работает.
Я забыл сказать, что ничего не пишет. Писало бы - сам исправил. Удалил бы кампанию.
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
Отправлено: 12.06.11 13:48. Заголовок: slava98 пишет: Ещё ..
slava98 пишет:
цитата:
Ещё вопрос: а можно было перед этим поставить e4="e4"?
"Перед этим" где? Если это будет локальная переменная, то она пропадет вместе с контекстом. С глобальным доступом у нас там было поле user если я правильно помню. Так что можешь действительно где-нибудь "перед этим" написать user.e4 = "e4", или там user.myVeryImportantString = "e4", без разницы, а потом в скрипт подставлять это поле. Кстати в питоне можно сделать вложенные кавычки используя двойные и одинарные. text = "Here comes 'quoted text'" Возможно в луа так же, не пробовал.
Отправлено: 19.06.11 06:43. Заголовок: Вопросик: 1. Как с п..
Вопросик: 1. Как с помощью скриптов переключить день в ночь, затем ночь в день и т.д. автоматически причём чтоб это было? 2. Как с помощью скриптов включить жизни?
(можно записать в строку) Обязательно записать какую либо функцию в on_die!
2) Теперь нужно создать саму функцию.
function user.OnDiePlayer() user.life = user.life - 1 if user.life > 0 then message("У вас осталось " .. user.life .. " жизней") else user.Defeat() end end
Создай какую либо переменную, например, user.life = x (х - любое число - количество жизней) При выполнении функции от переменной отнимается единица (1 жизнь) Далее проходится проверка количества жизней. Если больше нуля, то пишем количество оставшихся жизней. Если же равно нулю или каким-то непонятным образом меньше, то выполняем любую команду (в примере - поражение игрока) И наконец завершение цикла и самой функции.
П.С. Смотри кампании, разбирай сам примеры. Это может быть сложно. Но спрашивай) П.С.С. Примеры из кампании Battle City.
Отправлено: 19.06.11 11:31. Заголовок: slava98 Я не умею их..
slava98 Я не умею их делать. Я делаю просто карту с переключением режима дня и ночи! P.S. Не-а. Не помог твой код. Он ввёлся успешно, но ничего такого нету!
Отправлено: 19.06.11 16:07. Заголовок: а ты запустил user.D..
а ты запустил user.DayAndNight()? в моём коде нужно смены деня/ночи ждать 5 мин и всё работает на только ничего не видно... зы. теперь я затеял сделать кампанию с этой функцией, а то в ws она не смотрится
1.Если не получается чтото сперва проверяй передается ли функция в переменную и чему равна через вывод на экран сообщения 2.Не используй глобальные переменные (ставь перед переменными слово local ) Допустимо только использование глобальной переменной user.
Вместо Attackerа привычная переменная who, все правильно, но в on_damage нужно поместить по минимуму, обычно достаточно просто написать "user.DamageOurvarrior(who)", далее работать уже внутри функции, а у тебя глобальная переменная создается, а это пункт 2, все остальные преобразования делаются уже внутри функции.
И как трактовать эту строчку ?
цитата:
if nameofatacker ~= "ourplayer1" then
т.е. если ударил кто то кроме игрока то бот взбунтуется. Ты этого и хотел или как?
Отправлено: 20.06.11 13:30. Заголовок: хахахаха) Может функ..
хахахаха) Может функция и работала просто объект с именем ourplayer1 не существует)) ourplayer1 - vehname Сейчас переделаю функцию как ты сказал. Посмотрим...
Отправлено: 21.06.11 09:55. Заголовок: Теперь подвопрос по ..
Теперь подвопрос по 2 (сделано). 2.1. Как сделать так, чтобы когда появится ночь, то все боты бы остановились и спали, кроме специального класса "Ночные убийцы". Класс такой же, как и класс defaunt, но ночью он не спит. Сам игрок тоже не спит. 2.1.1. Собственно, класс "Ночные убийцы" создайте и выложите в раздел "Классы" (или я сам создам, если скрипты помогут).
2.1. Как сделать так, чтобы когда появится ночь, то все боты бы остановились и спали, кроме специального класса "Ночные убийцы". Класс такой же, как и класс defaunt, но ночью он не спит. Сам игрок тоже не спит.
Отправлено: 21.06.11 22:19. Заголовок: VIRUS насколько я по..
VIRUS насколько я понял, там игрок ставит ботов. И классы. Я говорю, типа если класс у игрока такой то, то его имя такое то и ночью у него отнимается актив. Короче, завтра сам попробую. Это выполнимо, но очень сложно.
Отправлено: 25.06.11 18:20. Заголовок: Это такой вопрос по ..
Это такой вопрос по скриптам?
Там чтобы скомпилять помимо MSVC студии неплохо бы еще DirectX sdk поставить. Возможно еще что-нибудь, но это первое что в голову приходит.
И да, компиляция она ж не просто "не получается" - там наверное вылезает какая-нибудь ошибка? Если ее выложить сюда вероятность получить осмысленный ответ сильно увеличится. libastral как известно на винду пока не портирован.
Все даты в формате GMT
3 час. Хитов сегодня: 13
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет