IQDDD 5 Опубликовано 29 Июня 2009 (изменено) Monnoroch, не скажу, что достаточно пачки. Я уже давно, когда учился создавать неписей, писал им только ствол. Патроны спавнились вместе со стволом. После того, как непись выстреливает обойму получаем: "Всё, всё, я без волыны", "Мужик, не стреляй!" Министр, в ЧН можно писать данные в файл. В ТЧ только пакетом. RvP, как вариант, создать источник света (по-моему, через all.spawn это можно сделать) и перемещать его (изменять координаты) при апдейте за неписью или другим клиентским объектом. Вот только не знаю, будет ли работать. Изменено 29 Июня 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 1 Июля 2009 Zen для этого движок ковырял? 1. Чем????????????7 2. КАК???? 3. Его за это оштрафуют..... Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 1 Июля 2009 Я бы составил, если бы знал. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 3 Июля 2009 (изменено) malandrinus Попробовал сделать "Тестирование скриптов ЧН без обрушения" так, как написано у вас в спойлере. Результат: вылет с пустым логом. Вот конец лога: ! Unknown command: err=file_is_already_closed ! Unknown command: Succesfull! stack trace: 001B:0086AB22 d3dx9_37.dll 001B:038A9DC6 luabind.beta7-devel.rc4.dll, luabind::detail::pcall() В main_menu сделал так: if dik == DIK_keys.DIK_S then local res, err = pcall(my_proxy.start_chunk_from_file) get_console():execute(res and "Succesfull!" or string.gsub(err, " ", "_")) end Вроде ошибок нет... Теперь вопросы: 1. Как исправить, чтобы работало? 2. Как получить ближайший к точке, координаты который получены: local a = vector() a = db.actor:position() level_vertex? 3. По по известному level_vertex'у определить его координаты. 4. Как перевести свободного НПС в данжер с опасностью в точке a. 5. Как перевести НПС, который находится в данжере, в свободное состояние так, чтобы он не переходил потом в данжер. ЗЫ: как я понимаю, данжер - это универсальный комбат, так? Добавлено через 19 мин.: Garrett, технологию не пробовал (да и ТЧ у меня нет), но известно, что диалоги при встрече прописываются в character_desc_darkvalley.xml. Ищем диалог, отвечающий за "Гаусс".Ставим туда: <dont_has_info>stalker_once_has_been_killed</dont_has_info> Дальше. Мне кажется, что при выборе ветки, в которой ГГ отдаёт 800 руб. включается инфопоршень. Внутри самой фермы есть спейсрестриктор. Так вот, если мы в него задохидим с инфопоршнем, то сталкеры становятся врагами. Добавляем туда выдачу нашего инфопоршня. +stalker_once_has_been_killed Теперь предложения со стороны сталкеров гупить гаусс за 800 руб. не будет. Если вы поняли, то сделаете, если не поняли, то вам на вики. Изменено 3 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 3 Июля 2009 (изменено) malandrinus, спасибо!!! НО: Пусть будет так: local a = vector () a.x = a.x + 10 a.z = a.z + 15 Как получить ближайший к точке a level_vertex? Перебирание вертексов исключено, так как очень налягает на производительность. зы: нужно для того, чтобы спавнить неписей вокруг ГГ. НО: вдруг НПС стоит в какой-нибудь канаве! Тогда неписи заспавняться подземлёй! Конечно, они рано-или поздно выйдут из-под земли к ближайшему узлу в АИ сетке, но всё равно не есть айс. зы2: можно дать строго определения: класс, метод, свойство, объект? Изменено 3 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 3 Июля 2009 (изменено) Народ, ЧТО я не правильно сделал: if dik == DIK_keys.DIK_S then local mindist,i,obj,npc = 1000000 for i = 1,65500 do obj = level.object_by_id(i) if obj == nil then obj = alife():object(i) end if obj then if news_manager.is_npc_stalker(obj:clsid()) and obj:alive() then if distance_between(db.actor,obj) < mindist then mindist = distance_between(db.actor,obj) npc = obj end end end end if npc then local hit = hit() local b = vector() b = db.actor:direction() b.x = -b.x b.z = -b.z b.y = -b.y hit.direction = b hit.draftsman = npc hit.impulse = 10000 hit.power = 1.5 hit.type = 2 hit:bone("bip01_head") npc:hit(hit) end end Добавлено через 20 мин.: Вот ещё тележка: 1. Как делать свои коллбеки. 2. Как использовать self в своих скриптах? Что это мне даёт? 3. У серверной аномалии класс cse_anomalous_zone. Какой класс у клиентской аномалии? 4. Как проигрывать партикл, если известна точка, в которой должен проигрываться партикл? зы: когда мне разрешено будет ставить плюсы? модерам: снимите предупреждение у меня, уже давно болтается (я перевоспитался ). Изменено 3 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 3 Июля 2009 malandrinus, 1. Ну, например, коллбек на получение игроком кол-ва денег, меньшего 100 руб. 2. Это чё, типа для того, чтобы методы можно было делать свои? 3. Как? Сталкер и аномалия для игры одно и то же? Не видел аномалию с определённым кол-вом жизней. 4. Эхх... качать АМК надо. Короче, спасибо. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 3 Июля 2009 (изменено) Real Wolf, постоянно обновлять координаты этой гранаты. Как только гранату уже не находим, то она взорвалась. Последние перед взрывом координаты - приблизительно или точно координаты взрыва. Дальше, думаю, не сложно. Получить ид кинутой гранаты, скорее всего, можно с помощью коллбэка. Правда, я не знаю какого. зы: в крайнем случае можно с помощью разных коллбэков отслеживать все грананты. Если вдруг граната потеряла рюкзак актора при простом апдейте, то значит, что актор её либо выбросил, либо кинул. Если выбросил, то через большое кол-во времени её всё равно можно будет поймать по id, если кинул, то скоро её уже по id не найдём. сейчас и займусь разработкой сего. Добавлено через 3 мин.: kuzia, если мне не изменяет память, то там в меня АМК есть выключение сего. Изменено 3 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 3 Июля 2009 Monnoroch, может быть, по коллбэку на подыхание. Если подох и был рядышком с аномалией, то значит... это значит, что он, наверное, умер в аномалии. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 4 Июля 2009 Вот такой вопрос: Как я понимаю, любая вещь в рюкзаке актора - серверная. Например,граната. Их шесть в рюкзаке. Но допустим, что актор взял гранату (нажав 4, или что там у него). Теперь в рюкзаке 6 гранат, плюс у актора в руке одна граната, откуда эта граната? Какой у неё id? Короче, как вычислить гранату, которой кинулся актор? Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 4 Июля 2009 (изменено) В общем попытался заставить спавниться на месте взрыва гранаты чувака из свободы. Сделал скрипт из двух выполняющихся при апдейте функций (два таймера, выполняющих набор операторов при каждом апдейте. таймер №2 и таймер №3) и одной добавки к функции. Вот добавка к функции на ловлю клавиш в main_menu: if dik == DIK_keys.DIK_S then local i, obj grenadeArr = {} numGrenade = 0 for i=1,5 do obj = alife():create("grenade_f1",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end for i=1,65534 do obj = alife():object(i) if obj then if obj:section_name() == "grenade_f1" then if obj.parent_id == db.actor:id() then numGrenade = numGrenade + 1 grenadeArr[numGrenade] = obj.id end end end end sTimer_2 = true logs ("Всего гранат "..numGrenade.." "..tostring(sTimer_2)) end В кратце суть: Спавним в рюкзак актору 5 фенек. Теперь перебираем все оффлайновые гранаты и те, которые находятся в ящике у актора запоминаем их иды в таблицу. Запоминаем и число этих гранат. Включаем таймер номер два. Вот его содержимое: function timer_2() if sTimer_2 == true then local i, obj for i=1,numGrenade do obj = alife():object(grenadeArr[i]) if not obj then logs ("Граната с №"..level.object_by_id(grenadeArr[i]):id().." кинута") sTimer_3 = true condID = grenadeArr[i] sTimer_2 = false return end end end end Вкратце, что делаем. Перебираем все гранаты, если какой-то не находим в рюкзаке, то значит, что актор её кинул. (здесь пока не разбирал случай, при котором актор, может быть, продал её, или выбросил) Значит запоминаем ид этой гранаты. Врубаем третий таймер, а второй выключаем. function timer_3() if sTimer_3 == true then if coord == nil then coord = vector() end local obj obj = level.object_by_id(condID) if obj then coord = obj:position() if up == nil then up = 1 else up = up+1 end else --обновление списка гранат, которые имеются у актора local tmp = {} local k = numGrenade numGrenade = 0 for i=1,k do obj = alife():object(grenadeArr[i]) if obj then if obj:section_name() == "grenade_f1" then if obj.parent_id == db.actor:id() then numGrenade = numGrenade + 1 tmp[numGrenade] = obj.id end end end end grenadeArr = {} for i=1,numGrenade do grenadeArr[i] = tmp[i] end logs ("Чувак заспавнен на "..coord.x.." "..coord.y.." "..coord.z) --конец обновления logs ("Граната №"..condID.." взорвана. Всего апов между взрывом и киданием "..up) sTimer_3 = false sTimer_2 = true alife():create("sim_default_freedom_4",coord,db.actor:level_vertex_id(),db.actor:game_vertex_id()) up = 0 end end end Здесь постоянно обновляем координаты гранаты. Делаем так, если граната кинута, то она должна перейти в онлайн. Если вдруг мы её не находим, то значит она взорвалась. Теперь обновляем таблицу с гранатами (ведь мы одну выкинули) и спавним чувака на последнем месте взрыва гранаты. Вроде всё правильно, НО: вы видите, что у меня есть: logs ("Граната №"..condID.." взорвана. Всего апов между взрывом и киданием "..up) В игре пишет: Граната № ... взорвана. Всего апов между взрывом и киданием 1 Чё делать Изменено 4 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 4 Июля 2009 RvP, destroy_time Добавлено через 4 мин.: all, зы: в скрипте выше хорошо работают вложенная функция спавна и второй таймер. Гранаты спавняться, заносятся в таблицу, определяется момент кидания гранаты. Но вот почему-то игра не находит кинутую гранату! Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 4 Июля 2009 Monnoroch, подвинется. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 6 Июля 2009 Monnoroch, а, интересно, почему у item обязательно должен быть sid? Добавлено через 16 мин.: Где есть callback'и на партиклы и что каждый из них в отдельности представляет? Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 7 Июля 2009 (изменено) Партиклы - это визуальные эффекты такие. Что это такое можно почитать здесь. А как их создавать именно в сталкере написано здесь Это уже мне знакомо с прошлого года, что такое партиклы мне известно. А вот есть такой скрипт sr_particle.script. Вроде бы там класс. Надо покопать. Изменено 7 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 7 Июля 2009 (изменено) malandrinus, согласно твоему совету попробовал навесить биндер на гранату, но у меня ничего не получилось. Итак, вот что я делал: В файл w_f1.ltx в самом начале прописал вот это: script_binding = bind_grenade.grenade_init Создал скрипт bind_grenade. Вот его содержимое: function grenade_init (object_binder) obj:bind_object(grenade_binder(obj)) end class "grenade_binder" (obj) function grenade_binder:__init (obj) super (obj) if self.parent_id == db.actor:id() then self.has_actor = true end end function grenade_binder:update(delta) object_binder.update(self,delta) logs (self.section_name) end function grenade_binder:net_destroy() logs (self:position().x) object_binder.net_destroy(self) end Примечание: как я понимаю, метод net_destroy вызывается при уничтожении биндируемого объекта. Вроде и создал забиндирование. Создал инициализацию. Создал апдейт. Создал net_destroy, но ничего. Вот лог: * Detected CPU: AuthenticAMD , F15/M11/S2, 2611.00 mhz, 8-clk 'rdtsc' * CPU Features: RDTSC, MMX, 3DNow!, SSE, SSE2 Initializing File System... using fs-ltx fsgame.ltx FS: 26480 files cached 28 archives, 5008Kb memory used. Init FileSystem 1.589497 sec 'xrCore' build 3557, Oct 30 2008 Initializing Engine... Starting INPUT device... Loading DLL: xrRender_R2.dll Loading DLL: xrRender_R3.dll command line Executing config-script "user.ltx"... [c:\documents and settings\all users\документы\stalker-stcs\user.ltx] successfully loaded. Loading DLL: xrRender_R2.dll Loading DLL: xrGame.dll ! Player name in registry is empty! (InstallUserName) * [win32]: free[1991136 K], reserved[15716 K], committed[90236 K] * [ D3D ]: textures[0 K] * [x-ray]: crt heap[8946 K], process heap[1658 K], game lua[0 K], render[0 K] * [x-ray]: economy: strings[4062 K], smem[0 K] SOUND: OpenAL: enumerate devices... SOUND: OpenAL: EnumerationExtension Present devices Generic Hardware SOUND: OpenAL: system default SndDevice name is Generic Hardware SOUND: OpenAL: default SndDevice name set to Generic Software SOUND: OpenAL: All available devices: 1. Generic Software, Spec Version 1.1 (default) eax[0] efx[no] xram[no] 2. Generic Software, Spec Version 1.1 (default) eax[0] efx[no] xram[no] Executing config-script "user.ltx"... Executing config-script "d:\program files\gsc world publishing\с.т.а.л.к.е.р. - чистое небо\gamedata\configs\rspec_default.ltx"... [d:\program files\gsc world publishing\с.т.а.л.к.е.р. - чистое небо\gamedata\configs\rspec_default.ltx] successfully loaded. [c:\documents and settings\all users\документы\stalker-stcs\user.ltx] successfully loaded. SOUND: Selected device is Generic Software * sound: EAX 2.0 extension: absent * sound: EAX 2.0 deferred: absent * sound : cache: 65537 kb, 4856 lines, 13820 bpl Starting RENDER device... * GPU [vendor:1002]-[device:9598]: ATI Radeon HD 3600 Series * GPU driver: 6.14.10.6903 * CREATE: DeviceREF: 1 * Vertex Processor: PURE HARDWARE * Texture memory: 997 M * DDI-level: 9.0 * GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30) * GPU vertex cache: unrecognized, 16 * NVAPI is missing. * Starting rendering as 2-GPU. * DVB created: 1536K * DIB created: 512K ! Renderer doesn't support blender 'effects\shadow_world' * HWDST/PCF supported and used - r__tf_aniso 4 - r2_tf_mipbias 0. Starting engine... ! Player name in registry is empty! (InstallUserName) Loading DLL: xrGameSpy.dll * DVB created: 1536K * DIB created: 512K - r__tf_aniso 4 - r2_tf_mipbias 0. * GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30) * GPU vertex cache: unrecognized, 16 * NVAPI is missing. * Starting rendering as 2-GPU. *** RESET [491 ms] "d:\program files\gsc world publishing\с.т.а.л.к.е.р. - чистое небо\bin\xrengine.exe" * phase time: 0 ms * phase cmem: 105624 K Кэширование объектов... Loading objects... Loading models... * [prefetch] time: 266 ms * [prefetch] memory: 0Kb ! Player name in registry is empty! (InstallUserName) * phase time: 315 ms * phase cmem: 96373 K Сервер: Старт... * phase time: 1765 ms * phase cmem: 96948 K Сервер: Загрузка симуляции жизни... * phase time: 10 ms * phase cmem: 96948 K Создание новой игры... * Creating new game... * Loading spawn registry... stack trace: 001B:03B73468 xrGame.dll 001B:03B72EBC xrGame.dll 001B:03B72BEC xrGame.dll Изменено 7 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 11 Июля 2009 (изменено) Народ, делайте как раньше (и как проще): в массивах с числовыми индексами. Вот и всё. Вместо for k,v in pairs (asd) do используйте обычный цикл for k,v do. Так надёжнее. Monnoroch, local t = 0 if db.acror:object("a") then t = 1 end if db.acror:object("b") then t = 2 end if db.acror:object("c") then t = 3 end return t Вотъ(таблица ТОЛЬКО с числовыми индексами): function what_for_this_function (tbl) if tbl ~= nil then for k,v in pairs (tbl) do if db.actor:object(tbl[k]) then return tbl[2] end end else return false end end Изменено 11 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 11 Июля 2009 (изменено) Monnoroch, Надо: получить 2е значение из таблицы при наличии у ГГ обьекта с секцией = 1му значению из таблицы. зы: не очень понятно выразились: как секция может быть равна значению? function SearchMax (tbl) if tbl ~= nil then local fMax for k,v in pairs (tbl) do if fMax == nil then fMax = v else if v > fMax then fMax = v end end end return fMax else return false end end Изменено 11 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 11 Июля 2009 (изменено) malandrinus, "k" - это счётчик, а "v" - это значения таблицы по индексу из счётчика. Так? Или наоборот? function what_for_this_function (tbl) if tbl ~= nil then for k,v in pairs (tbl) do if db.actor:object(tbl[k]) then --tbl[k] равно v? Это вопрос такой return tbl[2] end end return false else return false end end А где здесь ошибка? зы: вот так привык делать так: local tbl = { [1] = value1 [2] = value2 } Изменено 11 Июля 2009 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 11 Июля 2009 Monnoroch, k - это ключ, v - это значение. Так? Просто привык работать не с таблицами, а с массивами, потому никак не могу перестроиться. ИМХО: хоть структурирование данных в таблицы прибавляет lua гибкости, но и ещё тем, кто привык к массивами, прибавляет непонятности. и всё же я против того, чтобы значения (в вашем случае string) писать в ключи, а индексы в значения. структурирование кода в целом нарушается. Поделиться этим сообщением Ссылка на сообщение