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

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

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

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

Киллер: Нуи ессно сразу вопрос: Каким макаром в танках рассчитывается координата объекта (например actor("", x, y, {...}))? Смотрел в других кампаниях, ни х. не понял... Единственное дошло то, что реальная координата, которая отображается в редакторе map, должна домнажаться на n-ю переменную...

hmh: Каждая клетка равна 32*32 пикселям. Т.е. координата клетки равна номеру клетки*32.

Morse: hmh пишет: Каждая клетка равна 32*32 пикселям. Т.е. координата клетки равна номеру клетки*32. Тут надо уточнить, что указанная "координата клетки" - это ее верхний левый угол. Если требуется поместить объект в центр клетки надо прибавить к координатам по 16.


Киллер: hmh, Morse - большое спасибо!!! Мне это было очень важно...

Киллер: Теперь хотел спросить: Можно ли сейчас по средствам скрипто ввести отслеживание нажатия кнопки. На сколько мне известно, в CPP эту функция реализуется через eof...

Morse: Единственные события которые может отслеживать скрипт - въезд в зону триггера (ну и выезд), респаун танка, дамаг и дестрой объектов, и подбор предметов. А C++ тут вообще непричем.

Киллер: 1. who можно использовать только в триггере? 2. Как записать убить "того-то" с пом. who, а то kill(who) и kill("who") не контачат... 3. Не могли бы подробно объяснить принцип действия for.

Morse: who - да, используется только в триггере. она и создана-то была специально для него. who - это имя танка, который въехал в область триггера. Но есть один важный момент, на который не поставлено должного акцента. Чтобы вся эта байда работала, ЭТО ИМЯ ДОЛЖНО СУЩЕСТВОВАТЬ. Запомните это правило и передайте другим: В СКРИПТАХ ЗАДАВАЙТЕ ИМЯ ВСЕМ ВОЗМОЖНЫМ ОБЪЕКТАМ, ДАЖЕ ЕСЛИ, КАК ВАМ КАЖЕТСЯ, ЭТО ИМЯ НИКОГДА И НИГДЕ НЕ ПОНАДОБИТСЯ. Поверьте мне - я имею опыт в написании скриптов. Ничего плохого не случится если несколько лишних объектов получат имена, а вот отсутствие имени у нужного объекта может вызвать ошибку в самом неожиданном месте. В частности ошибка с которой я сам часто сталкивался: дают имя сервису, и забывают дать имя танку, который этот сервис будет себе рожать. там есть одна переменная, vehname если я не ошибаюсь, она должна быть непустой. иначе все это не будет работать. Про цикл for: http://www.lua.ru/doc/2.4.5.html подробнее ты нигде не найдешь

slava98: Киллер пишет: Как записать убить "того-то" с пом. who, а то kill(who) и kill("who") не контачат... Если убить, то вроде damage(100000,who) Kill - убрать Damage - убить Не путай

Киллер: Morse, зачем так нервничать? Имя было, но ,как ты сказал, - сервисное... slava98, спасибо конечно, но про kill и damage я и так знаю, но kill для меня - это убить, а damage - повредить.

Morse: Я не нервничаю. Я наоборот - стараюсь уменьшить колисечство нервирования у различных скриптописателей, которые будут биться головой о стену с криками: "что не так!?". Так как мое благое начинание в виде тутора по скриптописи никто не продолжил приходится эти важные моменты оповещать здесь. Кстати у меня тоже вопрос: есть ли такая штука, как массив ВСЕХ объектов которые есть на карте? Или, если быть более точным: можно ли добраться хоть как-нибудь до объекта без имени? Напрямую - нельзя, это понятно, но может можно по какому-нибудь индексу в каком-нибудь массиве?

Киллер: Morse пишет: Кстати у меня тоже вопрос: есть ли такая штука, как мас... Хм... Вопрос хороший. Думаю что навярнека это знает только Insert, а его уже с 1.5 месяца нет. Вообще такой массив даже не должен, а обязан быть. Если открыть любой файл *.map, то в нем содержится код, содержащий все координаты построения объектов на карте, а таковых - очень много. Отсюда можно сделать вывод, что если у каждого объекта не будет личного индекса, то впринципе взаимодействие с объектами будет невозможно. Как я себе представляю, в этом случае будут массовые конфликты, и так, уничтожив 1 кирпич, мы уничтожим все... Так что они есь! П.С. Конечно, комуто может показать ся, что я несу полный бред, но во всех, даже самых простых играх каждый объект занимает определенную ячейку памяти... вот так... П.П.С. Однако же, навярняка знает сам Insert.

romald: А мне бы хотелось узнать по подробнее о командах, приписываемых к conf.

slava98: И мне

Genesis: Есть какой нить тутор про скрипты в танках, кроме этого: http://ru.zod.wikia.com/wiki/%D0%A2%D1%83%D1%82%D0%BE%D1%80_%D0%BF%D0%BE_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8E_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2

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

Genesis: Morse что можно вписать в on_destroy и что вообще оно обозначает?

Morse: вписать туда можно строку - аналогично on_damage, а означает по-моему очевидно что.

Insert: Я тут иногда) Попробую ответить сразу всем. Конечно внутри игры есть список всех объектов, да не один а штук 10 разных глобальных и еще в каждой локации 8 на 8 клеток есть свои локальные списки. Но пользы от них мало, потому что по индексу оттуда достать объект невозможно, ибо это не массивы а двусвязные списки. Нажатия кнопок отслеживать нельзя. conf это таблица всех настроек игры. Их список можно получить если открыть в блокноте config.cfg или набрать в консоли "conf." и нажать Tab. Назначение большинства из них должно быть понятно из названия. Если что не понятно - спрашивайте. А вообще хорошо бы на wiki иметь про это статью. Начните кто-нибудь, а я потом поправлю

Genesis: Insert мдя, я всюравно ничего не понял =) лучше буду для кс продожлать карты мапить)

Diamond00744: Genesis пишет: Есть какой нить тутор про скрипты в танках Есть что-то на Скрипты

slava98: Да это ерунда! Это плагиат с танкопедии.

VIRUS: А можно ли сделать постоянный скрипт (например прожекторы светятся по кругу как на дискотеке)?

Morse: что значит "постоянный скрипт"? бесконечный цикл вращения можно сделать с помощью нехитрой рекурсии. пример есть в моей недокампании в самом конце. там целая карта посвящена исключительно объекту который бесконечно ездит по кругу.

VIRUS: Morse в какой "недокампании"?

hmh: http://zod.borda.ru/?1-8-0-00000008-000-0-0-1255259314 Ссылка на slil.ru скончалась от старости, так что качай с сайта slava98, он выдал ссылку несколькими постами позже начального.

VIRUS: hmh у мя она есть, но я ничего не видел в конце!

Morse: в данном случае я имел в виду "последнюю надежду". http://zod.borda.ru/?1-8-0-00000012-000-0-0-1219295148 если нигде не найдешь - вот фрагмент кода который отвечает за вечнодвижущийся объект [pre2] --создает объект "лес", который повреждает все находящиеся рядом танки со скоростью 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 [/pre2] это конечно довольно сложный вариант, для простого поворота вполне возможно будет достаточно просто отредактировать свойство угла поворота, но идея рекурсивной очереди здесь должна быть вполне понятна.

VIRUS: Morse А если например устроить вечную дискотеку с прожекторов(Включается - выключается и так до бесконечности)

Morse: А какая разница? если понять идею рекурсивной очереди можно забабахать в вечный цикл абсолютно все что угодно

Артур: Можно ли сделать например в on_destroy вместе damage и actor?

Артур: и если можно то как разделять части скриптов?

slava98: Артур пишет: Можно ли сделать например в on_destroy вместе damage и actor? Разумеется. Объект создастся и взорвётся. Только нужно между ними поставить ; Артур пишет: и если можно то как разделять части скриптов? На этот вопрос тебе ответит Morse (если объяснишь, то может и я смогу).

Артур: slava98 пишет: Артур пишет: цитата: Можно ли сделать например в on_destroy вместе damage и actor? Разумеется. Объект создастся и взорвётся. Только нужно между ними поставить ; Артур пишет: цитата: и если можно то как разделять части скриптов? На этот вопрос тебе ответит Morse (если объяснишь, то может и я смогу). Спасибо! (ты мне на 2ой вопрос тоже ответил , я имел ввиду actor... и damage... как разделить )

Артур: Еще до и после ; надо ставить пробелы? и как настроить who в триггере? а то у меня не действует

Артур: У мя стоит who но все равно у меня появляется бустер но не берется сразу командой equip после actor

slava98: Артур пишет: Еще до и после ; надо ставить пробелы? Только 1. Артур пишет: и как настроить who в триггере? а то у меня не действует К сожфлению у меня тоже . Артур пишет: У мя стоит who но все равно у меня появляется бустер но не берется сразу командой equip после actor У меня equip вообще не работает. Я хотел его поставить в нашу с Вирусом кампанию.

Morse: slava98 , Артур на ваш вопрос ответ был дан на предыдущей странице - большими красными буквами, специально чтоб все видели. Следовало бы ту фразу поместить в шапку топика - чтоб все ее всегда видели. А то ей-богу уже устал от одной и той же ошибки.

инс: Артур, slava98 Бустер нельзя дать с помощью equip, это такой баг. Дело в том, что бустер - это единственный бонус, который прикрепляется не к танку, а к оружию, и это реализовано через эту... не очень правильно, вот.

slava98: инс я это знаю. Я пытался прикрепить к танку оружие.

Morse: инс пишет: Дело в том, что бустер - это единственный бонус, который прикрепляется не к танку, а к оружию, и это реализовано через эту... "эта" называется "интерфейс" http://bash.org.ru/quote/19902 полиморфизм в подавляющем большинстве случаев именно через него(неё) работает...

Инс: http://burrarum.livejournal.com/32707.html

Артур: У мя who не работает в триггере! Вот неработающий скрипт: actor("weap_zippo", 0, 0, {name="zippo"} ); equip(who, "zippo")

Morse: Вы мне все уже надоели... Потрудитесь наконец хотя бы перечитать с самого начала этот топик. Всего три страницы - не так уж и много. Тем более что вам нужна только первая. Есть уже все-таки предел сколько раз можно отвечать на один и тот же вопрос.

Артур: Я не пойму тот пост должна быть какаято вещь с названием "who" или что?

Insert: вообще, наверно мне правильнее будет сделать возможность надевать предметы не только на танки, но и на ихних игроков, ибо конца подобным вопросам не предвидится :) Артур В обработчик триггера передается спец переменная who, в которой записано name въехавшего танка. Дело в том, что танком управляет player, у которого тоже есть свое name, другое и которое совсем не то, которым подписывается игрок. Танк периодически дохнет и рождается заново, а player живет все время. У player'а есть еще одно свойство vehname, которое определяет как будет называться танк. Когда играешь в мясо, у игроков по умолчанию все эти поля пустые, следовательно в триггерах who не сработает. У меня есть идея, как убрать вообще геморрой с именами и обрести счастье. Плохая новость заключается в том, что у меня совсем нет времени :)

Артур: Insert пишет: Артур В обработчик триггера передается спец переменная who, в которой записано name въехавшего танка. Дело в том, что танком управляет player, у которого тоже есть свое name, другое и которое совсем не то, которым подписывается игрок. Танк периодически дохнет и рождается заново, а player живет все время. У player'а есть еще одно свойство vehname, которое определяет как будет называться танк. Когда играешь в мясо, у игроков по умолчанию все эти поля пустые, следовательно в триггерах who не сработает. Спасибо Insert! я все понял Думал-думал как who поставить в "Мясо", триггеры хотел поставить чтоб оружие появлялось и к танку прикреплялось сразу Теперь поставлю чтоб оружие под триггером появлялось

Артур: Почему damage не работает???

VIRUS: Morse А можно селать так чтобы бетон постоянно двигался и когда на него попадает танк он останавливался (таким образом танк оказываеться в ловушке)

VIRUS: Меня очень волнует этот вопрос: "А можно задавать команды ботам?". И еще много вопросов по ботам... например заставлять ехать бота куда-то, делать что-то и т.д. Может это будет в дальнейшем, а сейчас я хочу узнать как можно это сделать с помошью скриптов (если можно)?

Morse: официально давать команды ботам нельзя. неофициально есть один способ: создаешь в нужной точке бустер, и все боты в радиусе видимости немедленно ломятся туда. бустер в принципе можно сразу уничтожить - боты все равно поедут в точку где он был.

VIRUS: Morse ну это я знаю, ну например такой способ что-юы бот ехал по пути.

Artistik: чисто пофантазировал сейчас, ставишь бустер подальше от бота, удаляешь его, он едет в ту сторону, на его пути ставишь триггер который спавнит бустер в другом месте, на пути к нему еще один его удаляющий, и так постоянно...только я уже не помню, у триггера есть возможность удалять объекты?

VIRUS: Artistik пишет: у триггера есть возможность удалять объекты? Есть! Artistik вывод конечно хорошый, но для этого нужно невидимый бустер и если несколько ботов по разным путям?

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

Insert: В готовящейся к выходу версии можно будет отдавать прямые команды ботам: ехать, подбирать, стрелять

Morse: Insert пишет: В готовящейся к выходу версии можно будет отдавать прямые команды ботам: ехать, подбирать, стрелять подбирать и стрелять - понятно, в качестве аргумента будет даваться имя объекта, а вот ехать - это как? "триггеры" таки превратятся в "локации"?

Insert: ai_march(player, x, y) -- просто указываем координаты точки куда ехать

Артур: Как equip теперь пользоваться???

Insert: Артур так же как и раньше: equip(танк, предмет)

Артур: А who теперь работает?=) Или надо писать user.имя игрока?=)

VIRUS: А можно поподробнее о командах?

инс: Артур who работает. например, если хочешь убить того, кто наехал на триггер, просто пишешь damage(1000,who) VIRUS http://ru.zod.wikia.com/wiki/Function_ai_attack http://ru.zod.wikia.com/wiki/Function_ai_march http://ru.zod.wikia.com/wiki/Function_ai_pickup

VIRUS: инс спасибо.

vlad0dalv: Я попробовал создать свою кампанию. У меня вопросы: триггер предназначен в данном случае для экипировки танка под именем "1"; почему при попадании в зону триггера в командной строке пишет: объект под именем "1" не является танком. И ещё почему при попадании в зону триггера, который должен дамагить на 1000000 танк, в командной строке пишет damage(100000, "tank") (null)

VIRUS: vlad0dalv пишет: И ещё почему при попадании в зону триггера, который должен дамагить на 1000000 танк, в командной строке пишет damage(100000, "tank") (null) Посмотри, инс пишет: например, если хочешь убить того, кто наехал на триггер, просто пишешь damage(1000,who) vlad0dalv пишет: Я попробовал создать свою кампанию. У меня вопросы: триггер предназначен в данном случае для экипировки танка под именем "1"; почему при попадании в зону триггера в командной строке пишет: объект под именем "1" не является танком. vlad0dalv почитай эту тему Morse уже кучи раз отвечал на этот вопрос. Morse пишет: В частности ошибка с которой я сам часто сталкивался: дают имя сервису, и забывают дать имя танку, который этот сервис будет себе рожать. там есть одна переменная, vehname если я не ошибаюсь, она должна быть непустой. иначе все это не будет работать.

Артур: Insert вау!=) damage работает!=) Но equip нет=( почему он не работает???? =(

Insert: Артур и правда ведь не работает...

vlad0dalv: VIRUS и vehname и name я заполнял: результат один и тот же, а за "who"- спасибо

vlad0dalv: как сделать так, чтобы при попадании в зону триггера менялась команда танка? Я пробовал pset("1","team","2"), но пишет что для свойства 'team' необходимо целое значение 'value'. '1'- name, и vehname, и nick 'team'- prop '2'- value (целое число) (Вроде всё правильно)

Morse: двойку надо без кавычек, иначе это не число а строка. и в последней версии можно писать [pre2]1.team = 2[/pre2]

vlad0dalv: Morse нет, 1.team=2 не подходит, пишет: malform number near '1.team' А если написать who.team=2 , то пишет: object 'tank' не имеет свойство 'team'

vlad0dalv: А почему ai_march не работает? Я пишу ai_march("tank",32,32). Вообще ничего не пишет!

Morse: vlad0dalv пишет: Morse нет, 1.team=2 не подходит, пишет: malform number near '1.team' А если написать who.team=2 , то пишет: object 'tank' не имеет свойство 'team' да, точно, не совсем так. короче если ты пишешь [pre2] service("ai",{name="qwe",team=1})[/pre2] то поменять команду ты можешь ажно двумя путями 1. классический [pre2] pset("qwe","team",2)[/pre2] 2. более верный [pre2] qwe_obj = object("qwe") qwe_obj.team = 2[/pre2] ну и до кучи способ третий - самый верный изначально писать [pre2] user.qwe_obj=service("ai",{name="qwe",team=1})[/pre2] и потом спокойно [pre2] user.qwe_obj.team=2[/pre2] команда боту у тебя не пашет потому что это команда боту, т.е. сервису, а не танку.

Insert: Я добавлю, что в третем способе даже не обязательно зававать имя сервиса, достаточно просто [pre2]user.qwe_obj=service("ai",{team=1})[/pre2]

vlad0dalv: Morse пишет: команда боту у тебя не пашет потому что это команда боту, т.е. сервису, а не танку. Что ты имеешь в виду? А как тогда сделать так чтобы сервис выполнял последовательно разные ai действия с самого появления?

VIRUS: vlad0dalv service("ai",{name="qwe",active=0}) ai_attack("qwe", "target1")

vlad0dalv: VIRUS пишет: vlad0dalv service("ai",{name="qwe",active=0}) ai_attack("qwe", "target1") Я знаю это, но потом что написать чтобы он к примеру пошёл c командой ai_march?

VIRUS: vlad0dalv это точно можно с помошью if или then

VIRUS: в луа

vlad0dalv: жаль

Morse: vlad0dalv пишет: А как тогда сделать так чтобы сервис выполнял последовательно разные ai действия с самого появления? как ты себе это представляешь? допустим ты выдал сервису последовательность команд - как он должен определить что данная команда выполнена и можно приступать к следующей? ну предположим с маршем и подбором еще можно - бот добирается до определенной точки и это можно считать завершением. а атака? до первого попадания? до уничтожения? до обращения в бегство? ведь самостоятельно все это проделать очень просто: сказал боту ехать туда-то, и шмяк туда триггер, в on_enter которого следующую команду. сказал подобрать предмет, а в on_pickup ему новую дерективу. сказал боту "убить", а в on_destroy убиенного - продолжение. А вообще конечно боты кривовастенькие. Округление пути B-сплайнами это конечно сурово, но при этом следует признать что к нынешней версии они уже устарели. Что ж, ничто не идеально, надо выбирать ориентироваться ли на игру с людьми (сеть) или с компом (боты). Думаю большинство предпочтет сеть.

vlad0dalv: как ты себе это представляешь? допустим ты выдал сервису последовательность команд - как он должен определить что данная команда выполнена и можно приступать к следующей? ну предположим с маршем и подбором еще можно - бот добирается до определенной точки и это можно считать завершением. а атака? до первого попадания? до уничтожения? до обращения в бегство? ведь самостоятельно все это проделать очень просто: сказал боту ехать туда-то, и шмяк туда триггер, в on_enter которого следующую команду. сказал подобрать предмет, а в on_pickup ему новую дерективу. сказал боту "убить", а в on_destroy убиенного - продолжение. Morse ДЕЛО В ТОМ, ЧТО Я ЭТО И ДЕЛАЛ ТАК ЖЕ НО НЕ ПОЛУЧАЛОСЬ, ПОЭТОМУ Я СЮДА И ПРИШЁЛ. Попробуй сам так сделать и проверь.

Morse: вот даже специально попробовал [pre] reset() conf.sv_timelimit = 0 conf.sv_fraglimit = 0 conf.sv_nightmode = false loadmap("campaign/Demo/maps/part1.map") actor("respawn_point", 100, 100, {team=1}) user.ai_obj=service("ai", {nick="Subj", team=1, active=0}) actor("trigger",100,100,{on_enter="ai_march(user.ai_obj,500,100)"}) actor("trigger",500,100,{on_enter="ai_march(user.ai_obj,500,500)"}) actor("trigger",500,500,{on_enter="ai_march(user.ai_obj,100,500)"}) actor("trigger",100,500,{on_enter="ai_march(user.ai_obj,100,100)"}) [/pre]создай файл <имя твоей любимой девушки>.lua в папке campaign и скопируй туда этот текст, и запусти как кампанию. убедишься что все работает. кстати баг: боты не оставляют следов от гусениц.

vlad0dalv: А почему у меня не получилось?, ведь тоже самое!

vlad0dalv: Ладно скажи в чём я ошибся: В ИГРЕ [pre] on_enter= actor("respawn_point", 100, 100, {team=0}) я on_enter= user.ai_obj=service("ai", {name="helper", team=0, active=0}) я on_enter= ai_pickup(user.ai_obj,"gun") бот on_pickup= ai_march(user.ai_obj,200,200) бот on_enter= ai_attack(user.ai_obj,"enemy") бот on_destroy= ai_march(...)[/pre] и т. д. пишет: object or name expected to, got nil и самое смешное, что они начинают ездить, но оружие по команде не берут (и вообще не берут; передвигаются хаотично или обычно от стационарных пушек)

Morse: Да без понятия я где ты там ошибся. Одно могу сказать наверняка: где-то - точно ошибся. Пример #2 [pre] reset() conf.sv_timelimit = 0 conf.sv_fraglimit = 0 conf.sv_nightmode = false loadmap("campaign/Demo/maps/part1.map") actor("respawn_point", 100, 100, {team=1}) user.ai_obj=service("ai", {nick="Subj", team=1,active=0,on_respawn="ai_march(user.ai_obj,500,100)"}) user.weapon=actor("weap_autocannon",500,500,{on_pickup="ai_attack(user.ai_obj,user.stat)"}) user.stat=actor("turret_cannon",100,500) actor("trigger",500,100,{on_enter="ai_pickup(user.ai_obj,user.weapon)"}) [/pre] Рецепт тот же самый

vlad0dalv: А зачем писать user.ai_obj, если можно просто имя (У меня с именем работает, но только один раз с момента появления)

Morse: во-первых так грамотнее с точки зрения теории программирования - в качестве параметра ты передаешь в функцию объект, а не какую-то бессмысленную строку. во-вторых объекты - вещь знакомая, всегда очевидно чего он может и как его можно использовать. ну и наконец в-третьих - чтобы не эскейпить кавычки. текст из-за них в такую мешанину превращается...

инс: vlad0dalv затем еще, чтобы не выдумывать уникальных имен для всех объектов, чтобы по-простому работать с массивами объектов, чтобы иметь возможность обращаться к безымянным объектам, чтобы удобнее обращаться к свойствам объектов через точку, а не через pset/pget, чтобы при отладке скрипта в консоли получать подсказку по свойствам (пишешь user.ai_obj. потом жмешь Tab и сразу видишь, какие у объекта есть свойства). Наконец, это быстрее в плане производительности - ссылка напрямую связана с конкретным объектом, а по имени нужно каждый раз искать нужный объект среди кучи других.

VIRUS: Morse пишет: --создает объект "лес", который повреждает все находящиеся рядом танки со скоростью 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 пишет: stx sty Morse пишет: rx ry Morse пишет: t Morse пишет: ax ay

Morse: эти знаки значат названия переменных. что эти переменные делают вроде бы описано весьма четко. линия впринципе тоже являет собой фигуру лиссажу, просто одна из частот должна быть равной нулю, или частоты должны быть равны.

VIRUS: Morse я не понимаю что такое частоты...

VIRUS: Morse мой мозг понял всё, единствинный вопрос - обьект создаеться или создан?

VIRUS: А как сделать взрыв по неизвесным координатам, которые узнаються с помошью Positon

инс: [pre2]damage(10, actor("user_object", position(obj), {health=1,max_health=1})) -- obj - это имя ссылка на объект, от которого нам нужны координаты[/pre2]

VIRUS: инс большое спасибо

Артур: инс пишет: damage(10, actor("user_object", position(obj), {health=1,max_health=1})) В точности так? =) И в дополнение к VIRUS - что надо добавить чтоб взрыв был например с перерывом в х секунд, но постоянно на протяжении всей карты??? И еще, куда скрипт выше писать в редакторе КАРТ (не кампании)?

VIRUS: Артур пишет: И в дополнение к VIRUS - что надо добавить чтоб взрыв был например с перерывом в х секунд, но постоянно на протяжении всей карты??? http://zod.borda.ru/?1-4-0-00000033-000-0-0#012 почитай! Артур пишет: И еще, куда скрипт выше писать в редакторе КАРТ (не кампании)? Перефразируй

Артур: VIRUS пишет: Перефразируй ну в обычном редакторе карт это куда писать??? (Можно в триггер с радиусом 999999999?)

VIRUS: Артур можно, но не все ети скрипты там работают

Morse: а еще можно микроскопом гвозди забивать. в каждой карте есть такая шняга как скрипт инициализации. туда всю эту радость можно преспокойно запихать. вот только скрипта на бесконечную бомбежку никто покамест не писал - придется потрудиться самому.

VIRUS: Morse или над макросами потрудиться

vlad0dalv: [pre] reset() conf.sv_timelimit = 0 conf.sv_fraglimit = 0 conf.sv_nightmode = true loadmap("campaign/Demo/maps/part1.map") end[/pre] Почему это не действует?

Morse: во-первых действует. во-вторых end в конце не нужен. и в-третьих, а что собственно требуется получить?

vlad0dalv: просто чтоб файл запускал карту и всё

Morse: Файл просто запускает карту и все. Только "end" в конце убери.

vlad0dalv: спасибо

Артур: Morse пишет: скрипт инициализации Morse, а где он???=)

VIRUS: Артур в редакторе нажми ф8

Артур: VIRUS спс

FEAR: Подскажите плиз. Хочу сделать такукую фишку- выключатель), врезаешься в кирпич и включаются прожектора. Можно ли такое сделать? И что тогда писать в строке on_damage у объекта, выполняющего роль выключателя?

FEAR: И ещё, можно ли сделать так чтобы он и включал и выключал прожектора

vlad0dalv: [pre]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[/pre] Не знаю

Инс: в папке scripts создаем файл lightToggle.lua [pre]local function ToggleLight(light) if light.active == 0 then light.active = 1 else light.active = 0 end end function user.ToggleLights(...) for k,v in ipairs({...}) do ToggleLight(object(v)) end end [/pre] В скрипт инициализации добавляем [pre2]dofile("scripts/lightToggle.lua")[/pre2] В on_damage объекта пишем [pre2]user.ToggleLights("L1","L2","L3","L4");pset("W1","health",500)[/pre2] где L1,L2,... - имена прожекторов, их может быть сколько угодно много, W1 имя самого объекта

FEAR: хорошо, попробую

Morse: теперь уже у меня есть вопросы) 1. зачем пихать всю эту байду в отдельные файл, разве не сработает если пихнуть напрямик в инит-скрипт? 2. а сработает ли такая штука: [pre2] local function ToggleLight(light) light.active = !(light.active) -- или not(light.active), я уж не помню как там end [/pre2]3. какое-то странное применение переменнопараметрической функции... почему пары? в каком виде такие параметры представляются в функции? чему будет равняться, скажем, "a", если я напишу в этой функции [pre2]a={...}[/pre2]

Инс: Morse конечно можно запихать и в инит скрипт, только в одну строчку неудобно же. Штука не сработает из-за особенностей обработки луой булевых значений. Дело в том, что луа воспринимает всего две вещи как false - собственно false и nil. Любая строка, включая пустую, таблица, все числа, включая 0, воспринимаются как true. Свойство active возвращает число, следовательно not active всегда будет false. Кроме того, нельзя неявно конвертировать буль обратно в число, то есть light.active = true даст ошибку. пары потому, что в стандартной луа есть два удобных способа перебрать элементы таблицы - pairs & ipairs. Первое работает с любыми ключами, а второе только c целочисленными ключами до первого промежутка. Троеточие - это способ записи многих аргументов. Оно по сути работает как множественное значение, то есть можно записать local x,y=... и надеяться что число аргументов совпадет. Если троеточие сунуть в скобки {...} то сконструируется таблица, как если бы мы написали {x,y,13}. В такой таблице ключами будут следующие подряд целые числа, начиная с 1 - как нам того и хотелось для ipairs :) Есть еще один менее удобный способ перебрать элементы с целыми ключами - использовать оператор # для определения длины массива.

Morse: навеяно новая карта: dm5_disco_edition! качаем, переименовываем в rar распаковываем

VIRUS: Morse Где?

slava98: Morse класс! VIRUS

Insert: Morse прикольно! я кстати не догадался зафигачить многострочный текст в строку инициализации кстати, массив user.lights={} можно так же сделать локальным local lights={} чтобы не замусоривать пространство имен

slava98: VIRUS сохраняешь картинку и открываешь с помощью архиватора.

Insert: VIRUS сохрани картинку на диске и переименуй jpg в rar

VIRUS: slava98 Insert спасибо Morse кул, моя идея?

vlad0dalv: Morse а как ты сделал так, чтобы картинка содержала всю информацию? [pre]local i=1 user.lights = {} repeat user.lights=object("l"..i) i = i + 1 until not exists("l"..i) function user.disco() for i,o in ipairs(user.lights) do o.active=(math.random()>0.75) and 0 or 1 end pushcmd(function() user.disco() end,1) end[/pre] можешь объяснить, что означает каждое составляющие?

Morse: по строчкам задаем переменную i задаем пустой "массив" (или что тут под ним понимают) входим в цикл с постусловием тут у тебя ошибка. i-тому элементу массива мы присваиваем ссылку на объект с соотв. именем инкремент если объекты с заданными именами кончились, выходим из цикла объявляем функцию начинаем итерацию по элементам массива если рандомное число больше 0.75 свойству active присваиваем 0, иначе 1 конец цикла рекурсивно закидываем функцию в очередь конец функции вызываем функцию в первый раз всем фонарям на карте были вручную даны имена (от l1 и далее по порядку). это конечно неудобно, но другого варианта нет (по крайней мере пока)

FEAR: вопрос по скрипту: я хочу чтобы при уничтожение какого-либо объекта игра становилась на паузу и писалось сообщение, вот я прописываю в on_destroy такую фразу freeze(true); message("Команда хХх выиграла"). Уничтожаю объект и ничего не происходит, что я делаю не так З.Ы. у меня версия 1:48

vlad0dalv: Morse Спс

vlad0dalv: Morse а ты писал названия с [pre2]L0[/pre2] (с нуля)?

Morse: во-первых l - маленькое, не L, а во-вторых, у меня - нет с единицы. а вообще без разницы, хоть с -10, только переменную i надо будет нужным числом инициализировать. и я не уверен как с таким вывертом ipairs подружится... и кстати если уж на то пошло то и l можно на L заменить, только тогда уж везде.

FEAR: И ещё подскажите пожалуйста. В версии 1.49-1.51 есть объект- декорация. В его свойствах под его текстуру можно подогнать любой файл из папки textures(вроде бы как), а как сделать чтобы в декорацию можно было загнать простую картинку, ну например эту

Morse: картинку надо перегнать в 32-х битный (обязательно) tga, потом написать для этой картинки lua файл с извращенным синтаксисом (пример - в любой крупной кампании или в файле textures.lua), а потом на этот луа-файл кастануть loadtheme, после этого он появится в списке текстур

Инс: А лучше этот луа-файл положить в папку с темами и поставить его как тему в сойствах карты, иначе подцепленная подобным образом текстура на объекте не сохранится после save/load.

vlad0dalv: [pre]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 ...[/pre] почему это не получается?

VIRUS: vlad0dalv ты супер скрипмейкер, откуда у тебя столько времени?

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

vlad0dalv: я пишу в скрипте инициализации [pre]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[/pre] Как ты с диско и при нахождении на триггер выполняется действие с помощью этих функций: взрывается пол стадии

hmh: "Человек" и "vlad0dalv", сидящие с одного IP: не используйте никаких форматирующих тегов. Ваши сообщения после премодерации приходят в нечитабельное состояние. Что именно не работает? Триггер? Тогда поэкспериментируй с pushcmd. Пол стадии(я так понимаю, пол в значении "пол", а не "половина"?) взрывается по всей площади в один момент? Проверь, выставил ли ты все параметры в функции dangerzone, а time не равно 0.

FEAR: я хочу чтобы при уничтожение какого-либо объекта игра становилась на паузу и писалось сообщение, вот я прописываю в on_destroy такую фразу freeze(true); message("Команда хХх выиграла"). Уничтожаю объект и ничего не происходит, что я делаю не так З.Ы. у меня версия 1:48

hmh: http://ru.zod.wikia.com/wiki/Function_pushcmd Используй это, когда кодируешь on_destroy, on_damage, триггеры и тому подобное.

TDiamond: А работает ли прикрепление бустера тогда, когда он появляется? Во-первых, с того сообщения (про баг с бустером) немало времени прошло, может исправили. Во-вторых, я не скриптописатель и если прикрепление уже возможно, то поподробнее пожалуйста. ЗАРАНННЕЕ СаПаСибо!

инс: прикрепление бустера работает, за примерами в танкопедию

TDiamond: спс

FEAR: Незнал куда написать этот вопрос, думаю тут ему место. Я, человек плохо разбирающийся в скриптах(!) решил сделать карту своего городачерез прогу mkmap (если её ещё помнят). Вот отрывок из ReadMe Чтобы преобразовать рисунок в карту, необходимо передать через командную строку имя входного и выходного файла: mkmap input [output] input - имя входного графического файла output - имя выходного файла карты (можно не указывать) Вот я открываю "пуск-- стандартные-- командная строка и ввожу в ней mkmap D:\1 [D:\map] И мне выводится надпись "mkmap не является внутреней и внешней командой, исполняемой программой или пакетным файлом Что мне делать?

Киллер: перетащи свою карту на mkmap.exe и будет счастье А если из командной строки - сперва перейди в директорию с mkmap.exe командой "CD", а только потом вводи "mkmap.exe <обрабатываемый файл> [<обработанный файл>]".

FEAR: переношу эту картинку на ярлык mkmap.exe и выводит "функция не поддерживается, а в командной строке опять не является внутреней или внешней командой...

Dark-FoX: Как создать кампанию со скриптами? Что нужно сделать?

Morse: Dark-FoX пишет: Что нужно сделать? для начала - форум почитать. хотя бы чуть-чуть http://zod.borda.ru/?1-6-0-00000036-000-0-0-1237968230

VIRUS: А можно в новой версии сделать что бы бот ехал за игроком? Постоянно до команды "стоп".

VIRUS: Так например function() ai_march("player1", position("boo"))

Anti_Killer: А можно в новой версии сделать что бы бот ехал за игроком? Постоянно до команды "стоп". Вобще вот как то так 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 который атаковал. А от него уже можно плясать дальше (вообщем в примере найдете). в редакторе НЕ обращаем внимания на Особый динамический Объект, он если и появится у Инса то будет реализован по другому, на основе ящика, чтобы боты его осязали, да и так правильней. Мультиплеер отключен т.к. в текущем состоянии у него нет будущего, его надо переделывать под корень. http://files.vhabare.ru/files/581_sv1qn/tank_.rar

VIRUS: Anti_Killer это твоя профиксенная? (старая или новая) Я вот не понимаю как сделать двигающеюся стену

Anti_Killer: Anti_Killer это твоя профиксенная? (старая или новая) Я вот не понимаю как сделать двигающеюся стену да. То что было у меня Исправления относительно той , которую я кидал для проверки мультиплеера и возможно тебе на мейл. То что стены двигать Morse пример выкладывал http://tankzod.do.am/load/2-1-0-15 , там тупо убить старый объект, создать новый но чуть в сторону, на этом и основано , но это геморно немножко

VIRUS: Но это можно делать до китайской пасхи (если сдвигать на 100 клеток например)

Anti_Killer: Но это можно делать до китайской пасхи (если сдвигать на 100 клеток например) там все на таймерах основано. Уменьшаеш время таймера, объект телепортируется из места в место быстрее.

VIRUS: Смотрю и нифига не понимаю. Можешь расписать функции 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

Anti_Killer: Эта функция просто перемещает объекты которые по Х Тут тебе только время в таймере стоит редактировать, все остальное это подгонка под 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. Посмотри через редактор что и как расставлено и какие кординаты имеет. Последний параметр это с какой стороны ведем отсчет, слева или с права. Правда не понял относительно чего лево и право, но методом тыка понять можно :)

VIRUS: -- Move reset() conf.sv_timelimit = 0 conf.sv_fraglimit = 0 conf.sv_nightmode = false loadmap("campaign/Move/maps/m_map.map") service("player_local", {name="player", nick="Убийцо",vehname="veh1", class="default"}) function user.moveObjectsX(1,1,6,"ww",1,3,1); 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 Не работает

Anti_Killer: Не работает по адекватней чутка пиши. Какие ошибки? все ли функции заинклудил. Если это полный код то тебе надо еще function ()user.moveObjectsOneIteration(stx+intx*i,sty,name,sti,endi,tox,toy) найти у него в коде и вставить в твой код

VIRUS: Я так и не понял как оно работает. Вот как сделать стенку передвигающеюся по наезду на тригер?

Anti_Killer: Пособирал сейчас. В общем например user.toggle1Close=1 user.toggle1Active=0 conf.sv_timelimit = 0 conf.sv_fraglimit = 0 loadmap("-----------------------------------Путь до мапы---------------------------------") service("player_local", {name="player", nick="tester",vehname="veh1", class="default"}) 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" и до "---применяем к первой карте---"

slava98: А как переместить бетон с 42.14 на 51.14? Я пробовал. user.moveObjectsX(42,14,51,"p2",42,51,1)

Morse: Способ создания-уничтожения надо признать идеологически неверным, устаревшим, и идущим вразрез с генеральной линией партии. Трясите антикиллера - пусть он в объектах сделает возможным редактирование координат. Сразу жить станет намного проще.

VIRUS: Morse о нематериален. Трясти не сможем, но мы со Славой уговорим его.

slava98: VIRUS пишет: Трясти не сможем, но мы со Славой уговорим его. Да, наверное .

slava98: Morse пишет: Способ создания-уничтожения надо признать идеологически неверным, устаревшим, и идущим вразрез с генеральной линией партии. А мне он нравится. Кроме того, я в нём разобрался и всё вышло. Теперь можно хоть мобильную тюрель сделать .

VIRUS: slava98

Morse: мобильная "тюрель" у тебя не выйдет - она не сможет стрелять. а разобраться можно в чем угодно, даже в женщинах.

Anti_Killer: Способ создания-уничтожения надо признать идеологически неверным, устаревшим, и идущим вразрез с генеральной линией партии. Трясите антикиллера - пусть он в объектах сделает возможным редактирование координат. Сразу жить станет намного проще. Идея хорошая, только проблемка в том что я исходники от своей версии мягко говоря запорол, соберу из своих патчей её заново, так что как восстановлю , постараюсь реализовать это 8 чудо света если координаты не слишком намертво там заделаны. Хотя способ с -удалить-восстановить на данном этапе еще можно использовать и не надо на него сильно плеваться. Если пере создавать объект со скоростью 0.01 секунды то получается очень красиво, фпс при этом практически не падает. Сейчас доделываю одну компанию. После неё займусь ) -----добавил позже-------- Все положение дел описал в подфоруме компаний

VIRUS: Anti_Killer У меня вышло их сдвинуть!

VIRUS: У кого осталась Mkmap а то на сайтах не рабочие?

Anti_Killer: забыл про официальный сайт ? ) http://ins-games.narod.ru/download.htm

slava98: VIRUS http://tankzod.do.am/load/8-1-0-61 Всё работает.

VIRUS: [pre]loadmap(user.campFmaps.."map01.map") service( "player_local", { name="player1", skin="yellow", team=1, on_die="user.OnDiePlayer()", class="default", nick="Player1" } ) if user.boo = 5 then message("Вы собрали все бустеры.") end -------------------------- user.boo=0 [/pre] Ошибка в 9-ой строке.

slava98: VIRUS пишет: if user.boo = 5 then message("Вы собрали все бустеры.") end Короче, вот здесь. А может надо поставить function user....

Morse: черт, я с этим питоном луа уже забыл. попробуй if (user.boo == 5) then ...

Anti_Killer: можно и без скобок. Главное == не путать с =

VIRUS: [pre]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 [/pre] Как разобратся?

Anti_Killer: Как разобратся? в чем проблема конкретно ? Функция создает диалоговое окно в котором в зависимости от значения переменной botreduce выводит разные сообщения . Все остальное это применение класса боту.

VIRUS: Anti_Killer у меня классы как их вставить. Я это не понимаю

slava98: Ставь функции. К примеру я так пробую.Одна функция определённые классы запускает.

Anti_Killer: Anti_Killer у меня классы как их вставить. Я это не понимаю у меня все классы в самом начале скрипта идут , там где написано МОИ КЛАССЫ. А потом я их уже применяю когда хочу и где хочу

VIRUS: У меня тоже. Но как их в скрипт вставить? Чтобы просто у всех игроков был класс в состоянии от левела. А как сделать что бы танк постоянно ехал, а игрок только поворачивал?

slava98: 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

VIRUS: slava98 Понял

slava98: Хорошо, только скрипт, кажется, не работает. Anti_Killer, если что-то не так скажи, пожалуйста.

Anti_Killer: У меня тоже. Но как их в скрипт вставить? Чтобы просто у всех игроков был класс в состоянии от левела для нужного бота если при создании то задаешь свой класс в параметре class для ai \ player_local а если потом то какой то ф-цией то вылавливаешь его как объект и меняеш что надо local bot = object("name_of_ai_service") bot.class="название_твоего_класса" А как сделать что бы танк постоянно ехал, а игрок только поворачивал? похоже что никак, но нет ничего невозможного, нужно просто найти подходящий модуль. http://lua-users.org/wiki/LibrariesAndBindings Здесь есть всякие например [libkeybinder] (5.1) - Global keyboard shortcuts for GTK+ Applications. похоже подойдет, похоже можно с помощью него "зажать" любую клавишу, но я не пробовал добавлять дополнительные модули и не знаю работают ли они в танке.

Anti_Killer: 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 end -- и нужно добавить этот end

slava98: Anti_Killer пишет: похоже что никак, но нет ничего невозможного, нужно просто найти подходящий модуль. http://lua-users.org/wiki/LibrariesAndBindings Здесь есть всякие например [libkeybinder] (5.1) - Global keyboard shortcuts for GTK+ Applications. похоже подойдет, похоже можно с помощью него "зажать" любую клавишу, но я не пробовал добавлять дополнительные модули и не знаю работают ли они в танке. Это надо в коде рыться или в файле луа? Кто-нибудь объясните мне, зачем нужны pget и position . А то в Танкопедии ничего непонятно. Как они работают, мне понятно, но непонятно зачем.

Anti_Killer: Это надо в коде рыться или в файле луа? Сам пока незнаю как модули подключать. Но когда подключ так там и так в примерах все приведено , врятли можно лучше объяснить. pget раньше (да и сейчас при необходимости) использовался для получения параметра объекта (health, class, on_die и т.д. все параметры которые видны в редакторе при редактировании объекта) вот как получали параметр объекта раньше actor("pu_booster", 42, 128, {name="boo", respawn_time=10}) print( pget("boo", "respawn_time") ) а вот как можно получить сейчас user.object=actor("pu_booster", 42, 128, {respawn_time=10}) print(user.object.respawn_time) в обоих случаях выведет 10 position выдает координаты объекта. На этом принципе основано перемещение объекта. Берем старые координаты-> прибавляем к ним шаг и получаем новые координаты-> двигаем объект на новые координаты-> получаем движение

VIRUS: Anti_Killer пишет: 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 end -- и нужно добавить этот end Тоесть это должно работать.

VIRUS: Вот. Все что я вписал работает, но есть проблема с менюшкой. Вот я делаю функцию менюшки: function user.Menu(n) if n==1 then user.Game() elseif n==2 then user.Options() elseif n==3 then user.About() end end Вызываю её: service("menu",{title="gui_splash",name="menu",names="Старт|Настройки|О компании",on_select="user.Menu(n)"}) При нажатии на кнопку "Настройки" должна открыться меню настроек. function user.Options() service("menu",{title="gui_splash",name="menu",names="Сложность|Режим||Назад",on_select="user.MenuOpt(n)"}) end end У нее есть функции, но сама меню не работает: function user.MenuOpt(n) if n==1 then user.ChangeDifficult() elseif n==2 then user.Rm() elseif n==3 then user.Back() end end Вот ошибка: [string "campaign/Snake.lua"]:51: attempt to call field 'Options' (a nil value)

Anti_Killer: незнаю почему ошибку именно ту выдает но для начала исправь хотябы 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

VIRUS: Anti_Killer я просто не понимаю как устроены твои скрипты. А лишний слеш для того что бы сделать пробел. Добавлено позже: Как я понял мы не создаем еще одно а изменяем имена и функции прошлого? Но как? Еще позже: Разобрался! Наверно...

Anti_Killer: Как я понял мы не создаем еще одно а изменяем имена и функции прошлого? Но как? лишний слеш обработается как отдельная кнопка service возвращает ссылку на наш объект, мы приравниваем её нашей глобальной переменной user.menu и через нее работаем с объектом в дальнейшем . Просто сервис menu в отличии от messageboxа сам не удаляется пока не перезагрузишь карту (тебе же в любой момент времени может понадобиться меню по нажатию ESC, по этому автоудаление бессмысленно)

VIRUS: У меня теперь эта ошибка при нажатии на Настройки [pre][string "campaign/Snake.lua"]:77: attempt to index field 'menuservice' (a nil value)[/pre] Вот как выглядит функция [pre]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[/pre]

Anti_Killer: приравняй service там где ты меню создаешь к user.menuservice

VIRUS: [pre]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[/pre] У меня здесь не работает кнопка "Назад" [pre]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[/pre] А здесь кнопка "Закрыть" я пробовал окно кильнуть не выходить

Anti_Killer: У меня здесь не работает кнопка "Назад" у тебя так вообще ни одна кнопка в user.Options не будет работать т.к. ты не передаешь n т.е. n у тебя всегда ==nil А здесь кнопка "Закрыть" я пробовал окно кильнуть не выходить а тут у тебя в on_select рекурсия и user.ChangeDifficult вызывается всегда по новой, т.е. заново создается и msgbox пофтыкай сам. Просто внимательней надо быть

Morse: Да там лучше даже не "фтыкать". От рекурсивных вызовов непонятных функций у любого парсера крыша съедет. И вообще весь этот код вызовет жгучую зависть у любого индуса. Попробуй как-нибудь так (луа у меня нету, за правильность не отвечаю, наверняка где-нибудь слажал, но идея должна быть ясна): [pre]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 [/pre]

VIRUS: Anti_Killer пишет: а тут у тебя в on_select рекурсия и user.ChangeDifficult вызывается всегда по новой, т.е. заново создается и msgbox У тебя в скрипте также, тоже создает каждый раз новое. Попробую разобраться

Anti_Killer: У тебя в скрипте также, тоже создает каждый раз новое. Попробую разобраться ну ненадо же все подчистую слизывать с меня у меня там в скрипте идет вполне логичное исключение "if n ~= 3 then" т.е. 3 вариант ответа исключен и продолжения при нем нет.

VIRUS: Anti_Killer пишет: у тебя так вообще ни одна кнопка в user.Options не будет работать т.к. ты не передаешь n т.е. n у тебя всегда ==nil Все работает кроме "Назад"

Anti_Killer: user.menuservice.on_select="user.MenuOpt(n)" Так у тебя же меню настроек user.Options() т.е. вместо user.menuservice.on_select="user.MenuOpt(n)" надо user.menuservice.on_select="user.Options(n)" ну и function user.Options() исправить на function user.Options(n)

VIRUS: Anti_Killer пишет: 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 Возможно тут есть ошибки но мысль понятна

VIRUS: Если боту сказать ехать с клетки 1/1 на клетку 1/500 он поедет через стену?

slava98: Попробуй . Мне кажется, нет.

VIRUS: 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 Возможно тут есть ошибки но мысль понятна Помогите

Anti_Killer: Дам еще один мини урок. смотри мою последнюю версию скрипта 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 , ну у тебя вроде в этом плане нормально про меню это нужен весь код. Но возможно у тебя все в одной функции идет и ты где то что то случайно повторно вызываешь или еще чего.

VIRUS: Вотъ [pre]--функции меню-- user.menuservice = service("menu",{title="gui_splash",name="menu",names="Игра|Настройки|О кампании",on_select="user.Menu(n)"}) ---------------------------------------------- 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[/pre]

Anti_Killer: 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 зачем здесь передавать n ? проверь везде. Т.е. он у тебя тут автоматом кудато лезть сразу же будет в user.Game(1) в user.Options(2)

VIRUS: Anti_Killer не понял --- А понял, все же так просто

VIRUS: Как можно сделать что бы можно было выбирать левела и при нажатии на кнопку старт выбранный левел запускался?

slava98: VIRUS пишет: function user.Rm() service("msgbox", {text="К сожалению эта функция еще не реализована\n Ждите релиза в следующих версиях"}) end Интересно, как это закрыть.

VIRUS: slava98 легко.

VIRUS: Похоже я Anti_Killerа уже достал. Но вот как сделать ПРАВИЛЬНО не пойму. [pre]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[/pre]

Anti_Killer: Да помогу пока настроение есть 1. не ставь числа в ковычки вроде "1" 2. end не там где надо поставил . Ставь до if levelname=="Без лабиринта" then levelid="1" и убирай один снизу. 3. функция user.Start() у тебя нигде не прописана. Т.е. ее не что не вызывает

VIRUS: Anti_Killer пишет: 3. функция user.Start() у тебя нигде не прописана. Т.е. ее не что не вызывает Там есть скрипт что её вызывает

VIRUS: А можно ли писать так pushcmd( function() service ("player_local", {name"snake1", nick="Змея", class="user.Class"}) end, 1) ------------------------------------------------------------------------------------------------------------↑ это функция

Anti_Killer: LUA name"snake1" как минимум на это накричит. Насчет функций без параметров не пробывал на LUA , но так часто применяют. Пробуй

VIRUS: 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 Никакой ошибки нет, но при нажатии на старт ничег не работает

Anti_Killer: Отлаживай. Проверяй через message до куда доходит и что выдает. Передается ли levelid, выполняется ли user.start() и т.д.

VIRUS: Доходит до user.start() а дальше гнет

Anti_Killer: проверяй дальше. У тебя levelid что выдает у тебя присваивается 1 2 3 4 5 , а проверяется на mapa1 mapa2 . просто цифрой везде пиши

VIRUS: Anti_Killer пишет: проверяй дальше. У тебя levelid что выдает у тебя присваивается 1 2 3 4 5 , а проверяется на mapa1 mapa2 . просто цифрой везде пиши С этим все нормально

slava98: А с картами всё нормально?

VIRUS: slava98 естественно

slava98: 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 function user.shockout() kill("shocksprite") pset("shocktrig", "active", 0) actor("pu_shock", 470, 695, { name="shocker2" }) pushcmd(function() message("Через десять секунд взрывчатка взорвётся.") end, 1) pushcmd(function() message("5") end, 6) pushcmd(function() message("4") end, 7) pushcmd(function() message("3") end, 8) pushcmd(function() message("2") end, 9) pushcmd(function() message("1") end, 10) pushcmd(function() kill("shocker2") explosion(47, 69) explosion(47, 70) kill("k1_v1") kill("k2_v1") end, 12) end Тут всё правильно? И как сделать так, чтобы объект появился на 48, а не на 4,8 и не на 480?

Anti_Killer: А это ошибка. Объясните, что не так. функция у тебя user.pda() а зовешь просто pda() которой не существует. (это я тебе просто перевел сообщение ошибки. Внимательно читай еррор месаги, в них почти всегда вся соль) Тут всё правильно? И как сделать так, чтобы объект появился на 48, а не на 4,8 и не на 480? если лень каждый раз выщитывать то вместо числа - кординаты пиши get32(кордината) предварительно вставив в свой скрипт сверху функцию local function get32(num) return ((num-1) * 32) + 16; end она будет пересчитывать твои "клетки" из редактора в пиксели

slava98: если лень каждый раз выщитывать то вместо числа - кординаты пиши 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 Всё работает, кроме кнопки "Закрыть". Ошибок нет. П.С. Я имел ввиду, что игра не ругается.

Anti_Killer: else if n==3 then end это вообще не обязательно было писать , а в on_select исправить on_select="if n ~= 3 then user.mailbox(n) end "

slava98: Спасибо, громадное! А то, не успел я изучить функцию, появился сервис. Теперь кампания поедет дальше .

slava98: function user.shockin() kill("shoker1") pushcmd(function() message("Это электро-взрывчатка! Она поможет достать бустер!") end, 1) actor("user_sprite", get32(47), get32(69.5), { name="shocksprite", texture="user/ekivator", layer=11 }) actor("trigger", get32(48), get32(69.6), { name="shocktrig", on_enter="user.shockout()" }) end function user.shockout() kill("shocksprite") pset("shocktrig", "active", 0) actor("pu_shock", get32(47), get32(69.5), { name="shocker2" }) pushcmd(function() message("Через десять секунд взрывчатка взорвётся.") end, 1) pushcmd(function() message("5") end, 6) pushcmd(function() message("4") end, 7) pushcmd(function() message("3") end, 8) pushcmd(function() message("2") end, 9) pushcmd(function() message("1") end, 10) pushcmd(function() kill("shocker2") explosion(47, 69) explosion(47, 70) kill("k1_v1") kill("k2_v1") end, 12) end Так можно.

VIRUS: Не работает :( 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

slava98: lifeobj = nill И нечего не происходит! Он вообще не задаётся.

VIRUS: А как задать? хп объекта

Anti_Killer: А как задать? хп объекта 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

slava98: Anti_Killer спасибо. Но второй объект и не должен умирать. Но у меня есть тоже вопрос: - Как взять хп с помощью pget у сервиса player? Создаётся танк и сервис, а имя только у сервиса. А мне нужно взять хп у танка. (с помощью функции pget) И ещё один (мы с Вирусом закидываем вопросами , но это потому что я не знал новинки новой версии, и они в Танкопедии не записаны ): - Я знаю, что можно загрузить какой-нибудь файл в скриптах. Так игра сохранялась и загржалась в The Race. А можно сделать так, чтобы игра запускала файл lang.cfg с помощью скриптов из указанного места?

Anti_Killer: Как взять хп с помощью pget у сервиса player? vehname и есть объект танк. Проверяй хп у танка . вот и все. Создаётся танк и сервис, а имя только у сервиса. А мне нужно взять хп у танка. (с помощью функции pget) не вижу проблемы в задании параметра vehname у player_local - Я знаю, что можно загрузить какой-нибудь файл в скриптах. Так игра сохранялась и загржалась в The Race. А можно сделать так, чтобы игра запускала файл lang.cfg с помощью скриптов из указанного места? нет. Скрипты и игровые файлы вроде lang.cfg никак не связаны. lang.cfg обрабатывается при запуске игры

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 }

Максим: slava98 Я не умею их делать. Я делаю просто карту с переключением режима дня и ночи! P.S. Не-а. Не помог твой код. Он ввёлся успешно, но ничего такого нету!

VIRUS: Максим пишет: P.S. Не-а. Не помог твой код. Он ввёлся успешно, но ничего такого нету! Чей код?

Максим: VIRUS Код aka slava98!

slava98: а ты запустил user.DayAndNight()? в моём коде нужно смены деня/ночи ждать 5 мин и всё работает на только ничего не видно... зы. теперь я затеял сделать кампанию с этой функцией, а то в ws она не смотрится

Максим: slava98 Я хотел, чтобы в самом начале карты он запустился (скрипт инициализации).

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; user.DayAndNight() Скопируй это и вставь в скрипт инициализации. Я проверял, работает.

Максим: slava98 Помогло! Спасибо!

Anti_Killer: VIRUS 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}) 1.Если не получается чтото сперва проверяй передается ли функция в переменную и чему равна через вывод на экран сообщения 2.Не используй глобальные переменные (ставь перед переменными слово local ) Допустимо только использование глобальной переменной user. Вместо Attackerа привычная переменная who, все правильно, но в on_damage нужно поместить по минимуму, обычно достаточно просто написать "user.DamageOurvarrior(who)", далее работать уже внутри функции, а у тебя глобальная переменная создается, а это пункт 2, все остальные преобразования делаются уже внутри функции. И как трактовать эту строчку ? if nameofatacker ~= "ourplayer1" then т.е. если ударил кто то кроме игрока то бот взбунтуется. Ты этого и хотел или как?

VIRUS: Anti_Killer пишет: if nameofatacker ~= "ourplayer1" then Это по моему Слава редактил)) Да а если написать user.DamageOurWarriour(who) то как извлечь who.name или who содержит name?

VIRUS: хахахаха) Может функция и работала просто объект с именем ourplayer1 не существует)) ourplayer1 - vehname Сейчас переделаю функцию как ты сказал. Посмотрим...

VIRUS: я все равно не понимаю как сделать... Помоги пожалуйста

Sanctus (slava98)7: VIRUS пишет: Это по моему Слава редактил)) Я там только кавычки поставил. Я тоже не понимал, почему там ~=.

Максим: Теперь подвопрос по 2 (сделано). 2.1. Как сделать так, чтобы когда появится ночь, то все боты бы остановились и спали, кроме специального класса "Ночные убийцы". Класс такой же, как и класс defaunt, но ночью он не спит. Сам игрок тоже не спит. 2.1.1. Собственно, класс "Ночные убийцы" создайте и выложите в раздел "Классы" (или я сам создам, если скрипты помогут).

VIRUS: Максим пишет: 2.1. Как сделать так, чтобы когда появится ночь, то все боты бы остановились и спали, кроме специального класса "Ночные убийцы". Класс такой же, как и класс defaunt, но ночью он не спит. Сам игрок тоже не спит. Нужно отключить тех игроков

Максим: VIRUS Автоматически снова, а не через редактор.

VIRUS: ну да pset("name", "active", 0 или 1)

Максим: VIRUS Для классов, а не для определённого игрока! И причём если наступила ночь каждый раз применялось!

slava98: Ну типо ставить триггеры на точках рождения с именем, например 'n_trig(и здесь номер триггера)', даже скорее вокруг: if who.class=='night' then for i=1, (здесь мах кол-во игроков) do who.name='night'..i kill('n_trig(и здесь номер триггера)'') end и сама функция тогда: function user.DayAndNight() pushcmd(function() conf.sv_nightmode = true local tank = object('night'..i) tank.playername="" kill('night'..i) end, 1) end, 1) pushcmd(function() conf.sv_nightmode = false end, 270) pushcmd(function() user.DayAndNight() end, 540) end; user.DayAndNight() PS. Только не работает.

VIRUS: Максим пишет: VIRUS Для классов, а не для определённого игрока! И причём если наступила ночь каждый раз применялось! А не легче когда ставится ночь, ставить всем нужным ботам актив 0?

slava98: VIRUS насколько я понял, там игрок ставит ботов. И классы. Я говорю, типа если класс у игрока такой то, то его имя такое то и ночью у него отнимается актив. Короче, завтра сам попробую. Это выполнимо, но очень сложно.

VIRUS: Я скачал исходники, но скомпилировать не могу... Читал все описания но не совсем понял.

Morse: Это такой вопрос по скриптам? Там чтобы скомпилять помимо MSVC студии неплохо бы еще DirectX sdk поставить. Возможно еще что-нибудь, но это первое что в голову приходит. И да, компиляция она ж не просто "не получается" - там наверное вылезает какая-нибудь ошибка? Если ее выложить сюда вероятность получить осмысленный ответ сильно увеличится. libastral как известно на винду пока не портирован.

slava98: Morse пишет: Это такой вопрос по скриптам? Да, я это уже заметил. Хотел поискать тему про вопросы по программированию (но не нашёл).

slava98: Если тут ещё остались скриптеры, кроме меня, то я спрашиваю: А можно объявить переменную локальной в цикле fоr? Например: for local r = 1,20 do pset("r"..r, "max_health", 1) pset("r"..r, "health", 1) end

VIRUS: Скорее всего - да. Но что мешает протестировать?



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