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

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


Halford

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

andrewrap,

самым простым является в фале

gamedata/scripts/ui_main_menu.script в конце дописываем это:

 

function main_menu:OnButton_credits_clicked() 
local text 
local vid 
local gvid 
local a = vector()  
local text 
a = db.actor:position()  
vid = db.actor:level_vertex_id()  
gvid = db.actor:game_vertex_id()  
text = "Позиция:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid 
news_manager.send_tip(db.actor, text, nil, nil, 30000) 
end

 

во время игры выходишь в меню и жмешь на титры.

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


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

Prapor11,

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

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


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

strelokk,

Ты хоть понял где лежит? и что писать.

больше 10 - время быстрее, меньше 10 - медленнее.

 

1 - это наше родное время.

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


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

Gonarh,

чо за чушь???

значение > 1 время ускоряется, потому параметр и называется тайм_фактор, то бишь коэффициент умножения. поставиш 2 - в два раза быстрее течь будет, 3 - в три раза, и т.д.

ЗЫ. Не знаешь сам - не давай ложную информацию

 

В оригинале тайм фактор равен в 10, так что пляшем от 10тки а не от 1, научись понимать что пишут, а не попусту выводы делать....

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


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

Ну вот пожалуй пришли к самому главному для меня вопросу, мучаюсь я с ним 4 месяца, как не смешно.Итак:

 

1)Заспавнил 10 аномалий :

 

function create_anomalies(section,rad_anom,x,y,z,lv,gv,mode)
      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end
      local p_obj = alife():create(section,vector():set(x,y,z),lv,gv)
      local packet = net_packet()
      packet:w_begin(0)
      p_obj:STATE_Write(packet)
      packet:r_seek(2)
    local game_vertex_id = packet:r_u16()
    local cse_alife_object__unk1_f32 = packet:r_float()
    local cse_alife_object__unk2_u32 = packet:r_s32()
    local level_vertex_id = packet:r_s32()
    local object_flags = packet:r_s32()
    local custom_data = packet:r_stringZ()
    local story_id = packet:r_s32()
    local cse_alife_object__unk3_u32 = packet:r_s32()
    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
            local box = packet:r_matrix()
        end
    end
    local restrictor_type = packet:r_u8()
    local cse_alife_custom_zone__unk1_f32 = packet:r_float()
    local cse_alife_custom_zone__unk2_u32 = packet:r_s32()
    local on_off_mode_enabled_time = packet:r_s32()
    local on_off_mode_disabled_time = packet:r_s32()
    local on_off_mode_shift_time = packet:r_s32()
    local offline_interactive_radius = packet:r_float()
    local artefact_spawn_places_count = packet:r_u16()
    local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32()
    local last_spawn_time_present = packet:r_u8()
    packet:w_u16(game_vertex_id)
    packet:w_float(cse_alife_object__unk1_f32)
    packet:w_s32(cse_alife_object__unk2_u32)
    packet:w_s32(level_vertex_id)
    packet:w_s32(object_flags)
    if mode~=nil then custom_data = mode end
    packet:w_stringZ(custom_data)
    packet:w_s32(story_id)
    packet:w_s32(cse_alife_object__unk3_u32)
    packet:w_u8(1)
    packet:w_u8(0)
    local sphere_center = vector()
    sphere_center:set(0, 0, 0)
    packet:w_vec3(sphere_center)
    radius = rad_anom
    packet:w_float(radius)
    packet:w_u8(restrictor_type)
    packet:w_float(cse_alife_custom_zone__unk1_f32)
    cse_alife_custom_zone__unk2_u32 = bit_not(0)
    packet:w_s32(cse_alife_custom_zone__unk2_u32)
    packet:w_s32(on_off_mode_enabled_time)
    packet:w_s32(on_off_mode_disabled_time)
    packet:w_s32(on_off_mode_shift_time)
    packet:w_float(offline_interactive_radius)
    packet:w_u16(artefact_spawn_places_count)
    packet:w_s32(cse_alife_anomalous_zone__unk1_u32)
if mode == nil then
    packet:w_u8(last_spawn_time_present)
end
    p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())
    return p_obj
end

function zaton_anom()
lv_new = math.random(1700000)       
pos_new = level.vertex_position(lv_new)
create_anomalies("zone_mine_electric_dinamic",3,pos_new.x,pos_new.y,pos_new.z,lv_new,0)
end

.... вобщем случайные аномалии и таких 10 штук, это не важно.... спавнится все гуд.

 

 

2)Поиск аномалии на удаление (для электры)

 

function destroi_anomalies()
for k=1, 65535 do
    obj = level.object_by_id(k)
    if obj ~= nil then
    if IsAnom(obj)==true  then 
      remove(obj)     
end
end
end
end
function IsAnom (obj)
local s = obj:section() 
    if string.find(s, "zone_mine_electric_dinamic")  then
       return true
       else
       return false
    end
end


function remove(obj)
if obj then
alife():release(alife():object(obj:id()), true)
end
return obj~=nil
end

 

 

Сделал все правильно(или нет)

 

НО! При удалении аномалий приведенной функцией есть огрехи, удаляю хоть одну аномалиюю, сохраняюсь, при загрузке этого сейва вылет с логом :

 

* Game zaton_2_vibros111111 is successfully loaded from file 'c:\docume~1\alluse~1\af40~1\stalke~1.-\savedgames\zaton_2_vibros111111.scop' (3.206s)
* phase time: 3205 ms
* phase cmem: 415389 K
* phase time: 19 ms
* phase cmem: 415389 K
* phase time: 18 ms
* phase cmem: 415389 K
* [win32]: free[918488 K], reserved[70672 K], committed[1107928 K]
* [ D3D ]: textures[272313 K]
* [x-ray]: crt heap[415373 K], process heap[430188 K], game lua[40767 K], render[466 K]
* [x-ray]: economy: strings[25448 K], smem[10027 K]
stack trace:

 

Т.е причины нет....

 

Объясните , пожалуйста , что я сделал неверно? Просто уже надоело, не получается и все.

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


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

А про апдейт можно по подробнее? скорей всего аномалии в оффлайне, и при их удалении оттуда не так удаляются, или как вы сказали не прошел апдейт, как его этот апдейт насильно провести?

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


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

Нет в разных, сначала стартует удаление и старт таймера на 5минут, после того, как сработает таймер идет спавн аномалий.

 

Сейчас еще раз попробую.

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


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

Вот переписал как и сказали ?

 

function destroi_anomalies()
for k=1, 65535 do
local obj = level.object_by_id(k)
if obj then
if IsAnom(obj) then 
remove(obj)     
end
end
end
end
function IsAnom (obj) 
local s = obj:section() 
return string.find(s, "zone_mine_electric_dinamic") 
end

function remove(obj)
if obj then
alife():release(alife():object(obj:id()), true)
end
return obj~=nil
end

 

Или может еще убрать что-нибудь?

 

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

Monnoroch, И так все просто?

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


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

Monnoroch, Сработало, и вправду быстрее намного работает, даже не виснет ничего.

А если взять несколько таких

 

function zaton_anom1()
  lv_new = math.random(1700000)       
  pos_new = level.vertex_position(lv_new)
  local obj = create_anomalies("zone_mine_electric_dinamic",3,pos_new.x,pos_new.y,pos_new.z,lv_new,0),
  table.insert(tbl,obj:id())
end

 

Но с разными аномалиями "zone_mine_electric_dinamic" они будут заноситься в таблицу? И удаляться оттуда?

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


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

Monnoroch, извини, но у тебя кое-где ошибки, возможно и не ошибки, но с ними у меня не работало

 

1)

 

........ew.z,lv_new,0), --- эта запятая не нужна, иначе вылет на глобальную obj , ведь с запятой функция неверная.

 

.....table.insert(tbl,obj:id()) , неверный метод(ошибка ссылалась на metod id) нужно ставить так

table.insert(tbl,obj.id) тогда все отлично работает.

 

И еще вопрос, эта таблица постоянная или нет? т.е спавню аномалии, данные сохраняются, могу побегать по локам, и когда вернусь на эту и запущу функциию удаления, аномалии удалятся? Если запущу с другой локи, тоже удалятся?(будут ли ошибки)? И каков предел таблицы? сколько она может в себя вместить?

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


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

Garry_Galler, Спасибо, а как можно очищать эту таблицу? Допустим.

 

1)Спавним аномалии, данные о них записываются в таблицу.

2)Во время удаления эти данные извлекаются и аномалии удаляются.

3)Но, эти же данные остаются сохраненные в таблице, как их очистить?

4)В очищенную таблицу опять заносятся данные .....

 

Можно ли чистить её вообще?

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


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

Что-то не допру :

 

1) Спавнили аномалию, её данные занеслись в таблицу?

 

local tbl = {}

function zaton_anom()
  lv_new = math.random(1700000)       
  pos_new = level.vertex_position(lv_new)
  local obj = create_anomalies("zone_mine_electric_dinamic",3,pos_new.x,pos_new.y,pos_new.z,lv_new,0)
  table.insert(tbl,obj.id)
end

2)В этом же скрипте (поставили на биндер актора) т.е данные из таблицы сохранились? Но куда они сохранились?

function morg_save(p)
local i = 0
for k,v in pairs(morg) do
i = i + 1
end
p:w_u8(i) 
for k, v in pairs(morg) do
p:w_u16(k)
p:w_u16(v)
end
end

3)Так же загружаем игру, в биндере выводятся данные этой таблицы

function morg_load(r)
local i = r:r_u8()
for k = 1, i do
local id = r:r_u16() 
morg[id] = r:r_u16()
end
end

 

4)Запускаем функцию удаления, и она выводит данные о таблице и удаляет анормалии по этим данным? которые загрузились из нетпакета?

 

function destroi_anomalies()
  for i = 1,#tbl do
    alife():release(alife():object(tbl[i]), true)
  end
end

 

Так получается? Просто я не могу понять ход работы этой всей системы.

 

Потом вопрос такой.

 

Вот удалились аномалии. Данные все равно в таблице остались? Если да, то

Monnoroch, как это понять?

 

удалять: tbl = {}

 

Т.е вообще из скрипта удалить, не использовать её ?

И встречный вопрос , что делают функции записанные в таком виде?

ххххх ={} это как глобальные? или как?

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


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

Garry_Galler, ясно! У меня осталось исключительно два простых вопроса:

1) Допустим в одном скрипте несколько функций , и у каждой своя таблица(имема таблиц разные) , они(таблицы) будут корректно заполнятся?Независимо друг от друга? И есть ли ограничение на количество табличек на один скрипт? Да и при сохранении\загрузки твоими функциями каждая таблица будет отдельно сохраняться/загружаться? Без ошибок и багов? Или функции способны обработать исключительно 1 таблицу в одном скрипте?

2) Если у меня несколько функций, но каждой присвоена одна и та же таблица, то данные будут сохраняться в эту таблицу? Загружаться из нее, и корректно ли это будет?

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


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

Garry_Galler, Хотел еще спросить каким образом связаны между собой

 

function morg_save(p)
local i = 0
for k,v in pairs(morg) do
i = i + 1
end
p:w_u8(i)
for k, v in pairs(morg) do
p:w_u16(k)
p:w_u16(v)
end
end
function morg_load(r)
local i = r:r_u8()
for k = 1, i do
local id = r:r_u16() 
morg[id] = r:r_u16() 
end
end

фнкции сохранения \загрузки таблицы с этой функцией.

 

local tbl = {}
function zaton_anom()
  lv_new = math.random(1700000)       
  pos_new = level.vertex_position(lv_new)
  local obj = create_anomalies("zone_mine_electric_dinamic",3,pos_new.x,pos_new.y,pos_new.z,lv_new,0)
  table.insert(tbl,obj.id)
end
function destroi_anomalies()
  for i = 1,#tbl do
    alife():release(alife():object(tbl[i]), true)
  end
end

 

Непонятно, как они локализуют именно эту таблицу? Тем что они в одном скрипте?Или как обычно они должны иметь общую переменную, но эту переменную i я вижу только в загрузке таблицы и удалении аномалий, как функция сохранения локализует(находит, определяет ) функцию спавна, заполнения таблицы?Если сохранение таблицы локализуется функцией сохранения только тем, что они находятся в одном скрипте, тогда если будет несколько функций , то не выйдет.

И не мог бы ты рассказать как привязывать таблицу к функции сохранения\загрузки? Если нетрудно конечно?

 

И вот сразу неудачный эксперимент, добавил обе функции в биндер актора вот в таком виде:

anom.morg_save(p) И morg_load®

ВЫЛЕт такого вида(ничего не спавнил, исключительно новая игра , даже не загрузилась)

 

FATAL ERROR

[error]Expression : !m_error_code

[error]Function : raii_guard::~raii_guard

[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

[error]Line : 748

[error]Description : ....l.k.e.r.call_of_pripit\gamedata\scripts\anom.script:37: attempt to index local 'r' (a nil value)

 

потом немного подумал и сделал так

anom.morg_save() и anom.morg_load()

 

игра даже загрузилась, но через некоторое количество секунд

 

[quote]stack trace:
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....l.k.e.r.call_of_pripit\gamedata\scripts\anom.script:26: bad argument #1 to 'pairs' (table expected, got nil)[/quote]

 

О ччем это говорит? Я безнадежен?

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

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


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

Garry_Galler, malandrinus, Monnoroch, Ребят, я понимаю что оффтоплю, но хочу вас поблагодарить, спасибо вам огромное. У меня получилось, все спавнится, сохраняется, удаляется , сохраняется и НИЧЕГО не Вылетает, игра вообще не висит, удаление очень быстрое, таблица обновляется. Вобщем спасибо вам, что раскрыли глаза такому как мне, сейчас учу синтаксис, и многие вопросы сами отпали.

Еще раз спасибо! :good:

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


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

Не подскажите, где можно посмотреть схему логики телевизора? вернее схему отобрадения картинок на экране?

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


Ссылка на сообщение
8push5, Ясно. Так значит телик на Скадовске не объект, а элемент уровня, и снести его никак, а жаль.

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


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

gruber, Разве?

А может лучше заспавнить обычного, а потом убить?

 

function deth_npc()
local sobj = alife():create("npc",vector():set(x,y,z),lv,gv)
sobj:on_death()
end

 

автор Garry_Galler

 

ЗЫ и писали этот вопрос 4 страницы назад.

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


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

Несколько вопросов, может, кто и ответит...

 

1)Можно ли через алл.спавн заспавнить объект, НО при наличии определенного инф.поршня ? ,т.е делаем секцию объекта (например вертолет) и чего-то ему дописываем на условие наличия инф.поршня ?

 

2)Можно ли в секции смартерейнов спавнить не сталкеров, а объекты (бтр, вертолеты, машины, трахторы) ?

 

 

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


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

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...