Перейти к контенту

[SoC] Ковыряемся в файлах


Halford

Рекомендуемые сообщения

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

"Всё, всё, я без волыны", "Мужик, не стреляй!"

 

Министр, в ЧН можно писать данные в файл. В ТЧ только пакетом.

 

RvP, как вариант, создать источник света (по-моему, через all.spawn это можно сделать) и перемещать его (изменять координаты) при апдейте за неписью или другим клиентским объектом. Вот только не знаю, будет ли работать. :(

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
Zen для этого движок ковырял?

 

1. Чем????????????7

2. КАК????

3. Его за это оштрафуют.....

Поделиться этим сообщением


Ссылка на сообщение

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 руб. не будет.

 

Если вы поняли, то сделаете, если не поняли, то вам на вики.

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

malandrinus, спасибо!!! НО:

Пусть будет так:

local a = vector ()
a.x = a.x + 10
a.z = a.z + 15

 

Как получить ближайший к точке a level_vertex? Перебирание вертексов исключено, так как очень налягает на производительность.

 

зы: нужно для того, чтобы спавнить неписей вокруг ГГ. НО: вдруг НПС стоит в какой-нибудь канаве! Тогда неписи заспавняться подземлёй! Конечно, они рано-или поздно выйдут из-под земли к ближайшему узлу в АИ сетке, но всё равно не есть айс.

 

зы2: можно дать строго определения: класс, метод, свойство, объект?

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

Народ, ЧТО я не правильно сделал:

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. Как проигрывать партикл, если известна точка, в которой должен проигрываться партикл?

 

зы: когда мне разрешено будет ставить плюсы? модерам: снимите предупреждение у меня, уже давно болтается (я перевоспитался :D).

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

malandrinus,

1. Ну, например, коллбек на получение игроком кол-ва денег, меньшего 100 руб.

2. Это чё, типа для того, чтобы методы можно было делать свои?

3. Как? Сталкер и аномалия для игры одно и то же? Не видел аномалию с определённым кол-вом жизней.

4. Эхх... качать АМК надо. :)

 

Короче, спасибо.

Поделиться этим сообщением


Ссылка на сообщение

Real Wolf, постоянно обновлять координаты этой гранаты. Как только гранату уже не находим, то она взорвалась. Последние перед взрывом координаты - приблизительно или точно координаты взрыва. Дальше, думаю, не сложно. Получить ид кинутой гранаты, скорее всего, можно с помощью коллбэка. Правда, я не знаю какого. :(

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

сейчас и займусь разработкой сего.

 

Добавлено через 3 мин.:

kuzia, если мне не изменяет память, то там в меня АМК есть выключение сего.

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
Monnoroch, может быть, по коллбэку на подыхание. Если подох и был рядышком с аномалией, то значит... это значит, что он, наверное, умер в аномалии.

Поделиться этим сообщением


Ссылка на сообщение

Вот такой вопрос:

Как я понимаю, любая вещь в рюкзаке актора - серверная. Например,граната. Их шесть в рюкзаке. Но допустим, что актор взял гранату (нажав 4, или что там у него). Теперь в рюкзаке 6 гранат, плюс у актора в руке одна граната, откуда эта граната? Какой у неё id?

 

Короче, как вычислить гранату, которой кинулся актор?

Поделиться этим сообщением


Ссылка на сообщение

В общем попытался заставить спавниться на месте взрыва гранаты чувака из свободы. Сделал скрипт из двух выполняющихся при апдейте функций (два таймера, выполняющих набор операторов при каждом апдейте. таймер №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 :( Чё делать

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

RvP,

destroy_time

 

Добавлено через 4 мин.:

all,

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

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch, а, интересно, почему у item обязательно должен быть sid?

 

Добавлено через 16 мин.:

Где есть callback'и на партиклы и что каждый из них в отдельности представляет?

Поделиться этим сообщением


Ссылка на сообщение
Партиклы - это визуальные эффекты такие. Что это такое можно почитать здесь. А как их создавать именно в сталкере написано здесь

 

Это уже мне знакомо с прошлого года, что такое партиклы мне известно. А вот есть такой скрипт sr_particle.script. Вроде бы там класс. Надо покопать. :)

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

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

 

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

Народ, делайте как раньше (и как проще): в массивах с числовыми индексами. Вот и всё. Вместо 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

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

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

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение

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

}

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
Monnoroch, k - это ключ, v - это значение. Так? Просто привык работать не с таблицами, а с массивами, потому никак не могу перестроиться. ИМХО: хоть структурирование данных в таблицы прибавляет lua гибкости, но и ещё тем, кто привык к массивами, прибавляет непонятности. и всё же я против того, чтобы значения (в вашем случае string) писать в ключи, а индексы в значения. структурирование кода в целом нарушается.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   1 пользователь

×
×
  • Создать...