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

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


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

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

 

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

Что-то кончается, что-то начинается...

Ссылка на комментарий

Забей-забей,я тут понял,что не в этом причина.

Перепиши код,как я посоветовал - тогда и разговор можно продолжить.А так его читать и в уме оптимизировать и думать еще - мне сложно.

 

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

Я тут подумал - это вообще все ацтой.

Секунду...

 

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

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

 

Вот и все.Я использую только create_anomalies из твоего.

А работать удаление будет в 700-800 раз быстрее твоего.

 

попробуй мой код ;)

А зачем усложнять?

Изменено пользователем Monnoroch
Ссылка на комментарий

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

 

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" они будут заноситься в таблицу? И удаляться оттуда?

Что-то кончается, что-то начинается...

Ссылка на комментарий

Vano_Santuri,

local sect = "zone_mine_electric_dinamic"
function zaton_anom_many(sect)
  for i=1,10 do
    zaton_anom1(sect..i)
  end
end

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

Изменено пользователем Monnoroch
Ссылка на комментарий

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

 

1)

 

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

 

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

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

 

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

Что-то кончается, что-то начинается...

Ссылка на комментарий

Vano_Santuri, нет.при выходе\загрузке игры таблица чистится.

как восстанавливать - пиши на актора.как это делать - ууу,по пакетам читай,тут как раз обсуждение идет по ним...

 

ну ошибся,что тут такого...я же не тестировал и писал то так,бегло.

Вместить...ну....тысяч 100-200 наверное - цифер то..

 

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

_Призрак_, спавнит нормального обычного НПС?

Изменено пользователем Monnoroch
Ссылка на комментарий

_Призрак_

 

Насчет трупа - obj:kill(obj) сработает только если сделать паузу между креате и килл - я так делал - таймер на 1 секунду. И готово - труп есть.

Но это слишком громоздко. Все проще. Есть специальный метод для этого - в общем дарю способ:

local sobj = alife():create("stalker", position, level_vertex_id, game_vertex_id)

sobj:on_death()

 

Vano_Santuri

для твоей таблицы - вот пример сохранения одномерной таблицы из моих скриптов - сохраняется таблица такого же вида как у тебя.

--сохранение данных
function morg_save(p)
local i = 0
--подсчитаем кол-во ключей
for k,v in pairs(morg) do
i = i + 1
end
--запишем кол-во 
p:w_u8(i)  --сохраняет целые числа до 256 
for k, v in pairs(morg) do
p:w_u16(k)  --сохраняет числа до 65536  --вообще сохранять здесь ключи необязательно так как они идут в математическом порядке
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

 

обе функции нужно вписать в бинд сталкер в функции function actor_binder:save(packet) и function actor_binder:load(reader) - каждую вписывать в одно и тоже место - чтобы они располагались в одинаковых местах каждой функции.

 

для спавна разных аномалий добавляешь в функцию - в тело оператора for do - эту строчку

local section = #anom[math.random(#anom)]

- а к ней пишешь табличку anom с именами секций аномалий

типа так local anom ={'zone_gravi_zone','zone_mincer',

'zone_witches_galantine','zone_mosquito_bald',

'zone_monolith','zone_zhar','zone_radioactive',

'zone_emi','zone_no_gravity','zone_zharka_static'}

 

в креате соотвественно вместо имени пишешь section - и получаешь рандомный набор аномалий на любой вкус.

Изменено пользователем Garry_Galler
Ссылка на комментарий

Garry_Galler,

это как бы не специальный метод для убиения, а коллбек серверного объекта на смерть. Т.е. он автоматом вызывается при смерти непися. Весьма неожиданно, что он сам по себе вызывает смерть неписей.

Я не пробовал, но может быть можно использовать метод kill_entity класса alife_simulator.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Monnoroch,

нет конечно. И вообще смысл колбека - не вызывать что-то, а напротив быть вызванным чем-то, чтобы дать в этот момент что-то сделать дополнительное. Поэтому меня и удивило немного, что on_death вызывает смерть. Однако работает, а kill_entity не работает, я только что проверил.

Кстати, в ЗП для серверного класса добавили метод kill, видимо как раз для решения этой проблемы.

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

malandrinus, Да я чисто по аналогии)

И правда,аномально...мб ПЫС и сами не знают? ;)

 

Вопрос: что может это означать:

 

local a ={}

function a:func_1()
end 

function a:func_2()
end

 

Это что,такой самопальный класс на основе таблицы? :huh:

Изменено пользователем Monnoroch
Ссылка на комментарий

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

 

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

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

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

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

 

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

Что-то кончается, что-то начинается...

Ссылка на комментарий

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

 

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

Vano_Santuri, Проще по-другому делать.Ничего никуда не сохранять,просто в нет_спавне актора запускать спавн анамалий а в нет_дестрое их удаление.

Изменено пользователем Monnoroch
Ссылка на комментарий

Monnoroch,

Конструкция вида:

function <имя_класса/таблицы>:<имя_функции/метода>(<список_аргументов>)
    <тело функции>
end

это на самом деле комбинация из двух синтаксических украшений. Приведённый код эквивалентен следующей конструкции:

<имя_класса/таблицы>.<имя_функции/метода> = function(self, <список_аргументов>)<тело функции>end

Или иными словами в таблицу просто добавляется ещё одна пара с ключом <имя_функции/метода> и значением типа "function". Сама функция при вызове подразумевает наличие первого скрытого аргумента self. В случае использования при вызове нотации с двоеточием:

t:fun(<список_аргументов>)

это в свою очередь эквивалентно записи

t.fun(t, <список_аргументов>)

Т.е. при вызове таблица/объект подставляется в качестве первого неявного аргумента, который соответственно станет неявным аргументов self в объявлении выше.

Короче да, самопальный класс =)

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

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

 

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 = {}

 

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

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

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

Что-то кончается, что-то начинается...

Ссылка на комментарий

Vano_Santuri

первая функция запишет айди аномалий в таблицу по принципу ключ=значение

так как таблица у тебя индексируется по умолчанию - то будет так

[1] = айди

[2] = айди

[3] = айди

и т.д.

вторая функция сохранит все данные из таблицы (при нажатии квиксейва, записи сохранения или перезагрузке) в объект "actor" средствами нет пакета.

 

третья функция загрузит данные таблицы из объекта "actor" и заполнит таблицу заново.

четвертая функция проитерировав табличку удалит аномалии по их айди из таблицы.

если в конце функции удаления (перед последним end) написать

local имя таблицы ={} -- то таблица будет объявлена как пустая - то есть очищена от всех данных.

И теперь при новой генерации аномалии она будет заполнена новыми айди.

 

объявление переменных без идентификатора local означает их автоматическое объявление как глобальных - то есть с областью видимости за пределами файла\функции где они объявлены. Чревато ошибками если имена глобальных переменных пересекутся.

Ссылка на комментарий
это тоже luabind?
Нет. То, что я сейчас описал - это голый Lua. Будет работать где угодно. Luabind естественно опирается на эти синтаксические возможности. Добавляет к этому предопределённые конструкторы/деструкторы, глобальную функция создания, наследование. Ну в принципе это и средствами Lua тоже можно сделать, но там это просто готовое есть. Кроме того, если здесь строится на базе таблицы, то в Luabind - на базе пользовательского объекта.

 

Естественно, в основном он нужен для экспорта сишных классов. "Просто классы" Luabind как бы приводит к своему стандарту оформления.

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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