#TheDoktor : Gun12 Я сначала закинул "ak74u.ogf" и "wpn_ak74u_hud.ogf", у меня даже игра не запустилась.
Откуда ты взял эти модели? Дело в том (для начала), что в них могут прописаны пути к СВОИМ "БЫВШИМ" текстурам, которых нет в оригинале.
Повторю.
Покажи лог.
отредактировал(а) Gun12: 13-05-2010 22:55 GMT3 час. Не стань номинантом премии Дарвина.
Люди подскажите пожалуйста есть ли возможность создать проверку на приближение ГГ к НПС?
Т.Е. если ГГ подошел на растояние 3-х метров к НПС то... действие. Помогите написать такую функцию если это возможно конечно. :-)
karavan
Задай больше условий.
Из этих, ИМХО, я бы сделал из логики НПС. Как? Это вопрос второй, если тебя устроит.
А если нужен именно СКРИПТ - то это уже вопрос третий.
Gun12 Мне именно и нужна такая функция которая будет биндится и условие как я написал:
Если ГГ подошел к НПС (с любым отношением к ГГ) на растояние 3-х метров то например вывести сообщение "отвали Меченый!!!".
Логика отдельного НПС не подходит. Хотя как это сделать я примерно понимаю. Нужен именно скрипт. Если организовать такую проверку конечно возможно вообще. :-G
karavan Смотри, а мод "по одёжке встречают" не на этом принципе основан? Там получается неписи"смотрят" в какой ты одежде, допустим ты нейтрал подходишь к бандитам в куртке бандита, то они тебя принимают за своего.
Я – хозяин своей судьбы, но только судьба знает, где закончится мой путь.
Я не совсем в адеквате, поэтому даю что даю. На большее сейчас мозгов не хватает. Да ещё и с теле**50016ea8aab1bb10eeba**
if obj:position():distance_to(db.actor:position()) <= сколько нужно метров then
тут пиши чё те надо
end
end
end
[/code]
function Come_Nearer(obj_id,Dictanse)
if not Dictanse then Dictanse = M end --/ если дистанция не опредена, сравниваем с M метрами
local PositionActor = db.actor:position() --/ позиция ГГ (вычисляем 1-раз)
local function Compare(id) --/ внутренняя локальная функция сравнения
local obj = level.object_by_id(id)
if obj and IsStalker(obj) then
if obj:position():distance_to(PositionActor) <= Dictanse then
return true--/> дистанция не больше заданной
end
end
end
if obj_id then --/ если задан id конкретного сталкера
Compare(obj_id)
else --/ иначе перебираем всех на локации
for id=1,65534 do
Compare(id)
end
end
return false--/> не близко
end
Вместо 'М' вставить нужное чисто (в метрах).
Вызывается или без аргументов, тогда функция выдаст результат о приближении к любому 'сталкеру' на дистанцию М метров, или с аргументами (Id-сталкера, Дистанция до него) - на выходе: достиг ли ГГ этой дистанции.
Artos Благодарю. А где в этой функции можно поставить вывод сообщения? Т.е действие. Там где дистанция не больше заданой? Зарание прошу простить за тупость.
karavan
Вызывай данную функцию, к примеру, такой (из биндера):
funсtion Check_Distanse() --/ общий мониторинг
if Come_Nearer() then
news_manager.send_tip(db.actor, "кто-то близко от ГГ", 0, "default", 8000)
end
end
или
funсtion Check_Distanse(IdObj,nil) --/ персональный мониторинг
if Come_Nearer(IdObj,5) then
news_manager.send_tip(db.actor, "ГГ подошел к персу на M метров", 0, "default", 8000)
end
end
где IdObj - или уже известное число или уже определенная переменная, соответствующая искомому Id-перса.
можно и так:
funсtion Check_Distanse(nil,8) --/ мониторинг по дистании
if Come_Nearer(nil,8) then
news_manager.send_tip(db.actor, "ГГ подошел к кому-то на 8 метров", 0, "default", 8000)
end
end
т.е. задается только дистанция 'приближения', которая может менятся от неких условий.
Или прямо в основной функции замени "return true" на нужный код действия.
Само собою: НЕ забыть в любом случае заменить "М" (в основной функции) на нужное число.
Gun12
Аргументы вызова в 1-й строке, т.е. на входе в функцию определяются модмейкером в зависимости от условий.
Если если известно имя непися - определяем его Id и gthtlftv на вход функции
Если известен сид (story_id) - определяем Id по этому сиду.
Если есть некий список сталкеровЮ то перебирая список и определяя Id - вызываем функцию ...
Все зависит от конкретики и уже имеющихся данных.
Artos
Так в том то и дело, что нет никакой конкретики.
Именно от этого я и отталкивался.
Вы предполагаете что ID известно. А в условии я этого не увидел (возможно я их не увидел. Но причины я уже объяснил :-))
Поэтому и спрашивал, - "Откуда взялись аргументы, если по условию они должны быть неизвестны?"
При знании конкретных неписей, я бы не морочил себе голову, и проверял бы из логики (прав я или нет - это вопрос второй, но НЕ неверный. Может быть только не оптимальный).
karavan
Да, вставив в сталкер-биндер получишь постоянный мониторинг о приближении ГГ к любому сталкеру на любой локации. Вопрос неоптимальности/чрезмерности такого решения для ресурсов - сейчас не рассматривается, это отдельная огромная тема.
"Лишний" тэг 'end' - закрывающий тэг для внутренней функции 'local Compare(id) ... end'. Т.е. НЕ лишний.
Gun12
Я дал универсальную (если ее так можно назвать) функцию, эквивалентную твоему варианту, но(!):
- несколько оптимизированней, т.к. позиция ГГ определяется один раз;
- функция может использоваться НЕ только мониторингом "по всем", а точечным (конкретного сталкера) и/или с вариациями по дистанции проближения.
Т.о. если нет конкретики - используется безаргументный вариант, если конкретика появится - почти "все" есть, чтобы ее использовать ...
function Come_Nearer(obj_id,Dictanse)
if not Dictanse then Dictanse = 5 end --/ если дистанция не опредена, сравниваем с M метрами
local PositionActor = db.actor:position() --/ позиция ГГ (вычисляем 1-раз)
local Compare(id) --/ внутренняя локальная функция сравнения
local obj = level.object_by_id(id)
if obj and IsStalker(obj) then
if obj:position():distance_to(PositionActor) <= Dictanse then
return true --/> дистанция не больше заданной
end
end
end
if obj_id then --/ если задан id конкретного сталкера
Compare(obj_id)
else --/ иначе перебираем всех на локации
for id=1,65534 do
Compare(id)
end
end
return false --/> не близко
end
funktion Check_Distanse() -- В бинд_сталкер на апдейт дельта
if Come_Nearer() then
news_manager.send_tip(db.actor, "кто-то близко от ГГ", 0, "default", 8000)
end
end
добавлено спустя 2 минут
А Dictanse ненадо задавать как локальную переменную?
karavan
сорри, подправь все что выделено оранжевым ...
Distanse - можешь задавать в качестве аргумента, можешь НЕ задавать, вроде веде пояснил. В варианте 2 этот аргумент хоть и вроде задается, но как "nil", что можно рассматривать как незадано.
Я тоже люблю заниматься оптимизацией, просто в условиях "задания" я этого не увидел.
Поэтому дал конкретный ответ на конкретный вопрос.
Я посмотрю всё позже, дома с компьютера. На телефоне это плохочитабельно.
Идею я понял. Мой вариант не самый удачный, но ...
Пока никто не отвечал, другого не было.
У меня нет причин не доверять Вашему выбору. Разберемся. Усвоим.
Gun12
Я же ни чего не имею против. :-) Просто постоянное вычисление/определение одного и того же параметра в цикле по-любому стОит выносить из цикла (даже если нет в "задании", а ведь в задании - использовать в биндере!). ИМХО.
Artos Теперь не вылетает но сообщение при приближении к НПС не появляется
function Come_Nearer(obj_id,Dictanse)
if not Dictanse then Dictanse = 5 end --/ если дистанция не опредена, сравниваем с M метрами
local PositionActor = db.actor:position() --/ позиция ГГ (вычисляем 1-раз)
local function Compare(id) --/ внутренняя локальная функция сравнения
local obj = level.object_by_id(id)
if obj and IsStalker(obj) then
if obj:position():distance_to(PositionActor) <= Dictanse then
return true -- дистанция не больше заданной
end
end
end
if obj_id then -- если задан id конкретного сталкера
Compare(obj_id)
else -- иначе перебираем всех на локации
for id=1,65534 do
Compare(id)
end
end
return false -- не близко
end
function Check_Distanse() -- общий мониторинг
if Come_Nearer() then
news_manager.send_tip(db.actor, "кто-то близко от ГГ", 0, "default", 8000)
end
end
Artos
Да мне самому все эти циклы как серпом ...
Я прошу время (теперь уже до после завтра:-)) чтобы оптимизировать всё это.
Хотя Вы уже всё сделали.
Я понимаю это подспудно (т.к. состояние оставляет желать лучшего), и в конце концов я соглашусь с Вами, НО! при условии, что "заказчик" сам определится, - что ему нужно. И поставлю акцент - КОНКРЕТНО.
Дальше для всех остальных.
Акцент поставлен не случайно.
Как Вы зададите Вопрос - таков будет и ответ.
Р.S.
Такие страсти разгорелись, что даже интересно - получится или нет:-)
отредактировал(а) Gun12: 14-05-2010 02:29 GMT3 час. Не стань номинантом премии Дарвина.
В function actor_binder:update(delta)
перед последним end пришу вызов
music_near.Check_Distanse()
Ну а в файле music_near.script вот это
function Check_Distanse() -- общий мониторинг
if Come_Nearer() then
news_manager.send_tip(db.actor, "кто-то близко от ГГ", 0, "default", 8000)
end
end
function Come_Nearer(obj_id,Dictanse)
if not Dictanse then Dictanse = 5 end --/ если дистанция не опредена, сравниваем с M метрами
local PositionActor = db.actor:position() --/ позиция ГГ (вычисляем 1-раз)
local function Compare(id) --/ внутренняя локальная функция сравнения
local obj = level.object_by_id(id)
if obj and IsStalker(obj) then
if obj:position():distance_to(PositionActor) <= Dictanse then
return true -- дистанция не больше заданной
end
end
end
if obj_id then -- если задан id конкретного сталкера
Compare(obj_id)
else -- иначе перебираем всех на локации
for id=1,65534 do
Compare(id)
end
end
return false -- не близко
end
добавлено спустя 2 минут
Результат. Игра не вылетает, но и сообшение при приближении к НПС не выводится.
karavan
Если ты используешь "общий" мониторинг, то почему же ты в основной функции оставил опциональные аргументы?
function Come_Nearer(obj_id,Dictanse)
Если в твоем "music_near.script" где-то определена "obj_id", то будет затык.
сотри и напиши без аргументов вызова:
function Come_Nearer()
Вот, вставь это в свой music_near.script
function Check_Distanse()
if not Dictanse then Dictanse = 5 end
local PositionActor = db.actor:position() --/ позиция ГГ (вычисляем 1-раз)
local idActor = db.actor:id() --/ Id ГГ, чтобы НЕ проверял себя же!
local function Compare(id) --/ внутренняя локальная функция сравнения
local obj = level.object_by_id(id)
if obj and IsStalker(obj) and id ~= idActor then
if obj:position():distance_to(PositionActor) <= Dictanse then
news_manager.send_tip(db.actor, "кто-то близко от ГГ", 0, "default", 8000)
end
end
end
if obj_id then --/ если задан id конкретного сталкера
Compare(obj_id)
else --/ иначе перебираем всех на локации
for id=1,65534 do
Compare(id)
end
end
end
Выделенное синим - можешь менять по д свои нужды.
Выделенное зеленым - позже сможешь задействовать, если потребуется.
Вопрос чисто из любопытства: вот это IsStalker движковое? И где можно посмотреть эти методы (не знаю как правально называются)? Просто вдруг понадобится заменить IsStalker на что-то другое. Например монстров и Сидора функция не определила как НПС, вот и заинтересовало. :)
Есть редактор Notepad++.
Помогает. Только я им уже не пользуясь очень давно.
Перешел на SciTE.
Теперь не представляю редактирования файлов без него.
Тем более занимаюсь Lua исключительно на нём. Artos
Привычка большое дело.
И не столько привычка, сколько способность свободно ориентироваться в "знакомой местности".
Уже начав пользоваться SсiТЕ пытался найти что-то лучшее. Но "ностальгия" не дала :-). Да и мало редакторов такого класса.
Его файлы сами могут быть учебным пособием. На официальном сайте есть куча расширений для него.
Заключение (ИМХО) :
связка Total Commander + SciTE = атомная бомба в редактировании/программировании
отредактировал(а) Gun12: 14-05-2010 09:58 GMT3 час. Не стань номинантом премии Дарвина.
karavan
Можно понять, когда "стройка" начинается с нуля. Тогда может и стоит брать "что под рукою" и строить как хочется, хотя тоже необходимо знать и соблюдать 'строительные нормы'.
Но если ты ПЕРЕстраиваешь, то НЕ знать собственно здание, его конструкцию, особенности и пр. - заведомо обречь себя на постоянные головоломки типа "а чой-то у меня не получается" или "а почему не выходит". И заранее обречь перестраиваемое здание на обрушениие.
Ты же придя садясь за стол не хлебаешь из тарелки, а вероятно используешь ложку! А почему? потому что уже знаешь, что она существуе, ей удобнее и чище ...
Так почему ты считаешь, что лезть в коды (и тем более скрипты) можно не озаботившись хотя бы поверхностным ознакомлением собственно что ты собираешься ковырять/надстраивать?!
Если уж читаешь заглянул и _g.script то прочти его ... может найдешь сам ответы по аналогии с уже найденным? (Прим: торговцы разрабами отнесены к монстрам, к сожалению. Поосторожнее с ними, оч.коварны порою ...).
Gun12
Пользуюсь уже более десятка лет UltraEdit'ом и ... никак не получается на SciTE пересесть. Сроднился. :-)
Artos С этим я не спорю. Всё правельно. Просто я взялся учить lua на живых примерах. И это только лишь потому, что достаточного количества времени нету да и профессия другая, ника не связанная с програмированием. Да и еще игра любимая.... :) Вот и приходится то чужие моды разберать, то рабочие примеры клянчить.
Спасибо что помогаешь. Жаль нету у меня учителя, как говорится "учение свет, а за свет надо платить". :ye)
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.