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

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

@Pir@t@s 

В начале uni_random_spawn объявить переменную:

local cse_obj -- она будет хранить спец. объект класса для создаваемых предметов

Затем изменить строки создания предметов:

cse_obj = alife():create(item, pos, lv_id, gv_id, id) 

Далее, в конце ф-ции uni_random_spawn добавить установку метки, к примеру ставим метку на серверный объект:

level.map_add_object_spot_ser(cse_obj.id, type, text)
Описание аргументов ф-ции уст. метки смотрим в Справочнике по ф-циям и классам.

  • Спасибо 1
  • Согласен 1
  • Полезно 1
Ссылка на комментарий

@Pir@t@s 

Скрытый текст

function uni_random_spawn(items, tbl, kol)

local lv_id, gv_id, obj, item, ms, kol2

local kol1 = 1

local id = 65535

local pos = vector()

if type(tbl) == 'table' then

ms = math.random(#tbl)

end

if type(tbl) == 'table' and type(tbl[ms]) == 'table' then

pos.x = tbl[ms][1]

pos.y = tbl[ms][2]

pos.z = tbl[ms][3]

lv_id = tbl[ms][4]

gv_id = tbl[ms][5]

else

if type(tbl) == 'table' and type(tbl[ms]) == 'number' then

ms = tbl[ms]

obj = level_object_by_sid (ms)

elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then

obj = db.actor

elseif type(tbl) == 'number' then

obj = level_object_by_sid (tbl)

end

pos = obj:position()

lv_id = obj:level_vertex_id()

gv_id = obj:game_vertex_id()

id = obj:id()

end

if kol == nil then

kol = 1

end

for s=1, kol do

if type(items) == 'table' then

item = math.random(#items)

if type(items[item]) == 'number' then

item = item - 1

end

if type(items[item+1]) == 'number' then

kol1 = items[item+1]

end

item = items[item]

else

item = items

end

for i=1, kol1 do

if type(item) == 'table' then

for k, v in ipairs(item) do

if type(item[k+1]) == 'number' then

kol2 = item[k+1]

else

kol2 = 1

end

if type(item[k]) ~= 'number' then

for j=1, kol2 do

local obj = alife():create(v, pos, lv_id, gv_id, id)

add_spot_on_map(obj.id, "red_location", "Твой текст")

end

end

end

else

local obj = alife():create(item, pos, lv_id, gv_id, id)

add_spot_on_map(obj.id, "red_location", "Твой текст")

end

end

end

end

 

function add_spot_on_map(obj_id,type,text) --+
  --возможные типы type смотри в ui\map_spots.xml 
  if obj_id then
    if text==nil then text=" " end
    -- Ставим метку на серверный объект чтобы её не пришлось обновлять
    level.map_add_object_spot_ser(obj_id, type, text)
  end
end

 

 

  • Спасибо 1
Ссылка на комментарий

Может кто подсказать, почему сообщение приходит из секции патронов а не так как в text(имя) ?

Скрытый текст

function on_weapon_ammo(wpn)
    local active_item = db.actor:item_in_slot(db.actor:active_slot())

 

    if active_item then
    local ammo_type = ca_get_weapon_ammo_type( alife():object(wpn:id()))
    local section_ammo = ca_ammo_by_num(wpn:section(),ammo_type)

 

    if section_ammo~=nil and string.find(section_ammo,"ammo") then
    get_hud():AddCustomStatic("text2", true):wnd():SetText("%c[cyan]"..gts("st_ammo_string_0_1").."\\n".."%c[default]"..gts(section_ammo))
end
end
end

 

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

@Colder , потому что имя - это параметр inv_name в секции.

Т.е. должно быть

gts(system_ini():r_string(section_ammo, "inv_name"))

  • Спасибо 1
  • Согласен 1
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

И еще вопрос. Можно как-то исправить длинющий вывод condition оружия https://yadi.sk/i/2KXBYb8CstNu4Q

Скрытый текст

function weapon_info()
    local time = time_global()
    if time_add == nil then
    time_add = time_global() + time_update
end
    local active_slot = act:active_item()
    if active_slot and act:active_slot()==2 then
    if time > time_add then
    time_add = time_global() + time_update
    local sect = act:item_in_slot(2):section()
    local name = tostring(system_ini():r_string(sect,"inv_name_short"))
    condition = act:item_in_slot(2):condition()
    local text = "\\n%c[white]Текущее оружие: \\n%c[d_green]"..gts(tostring(name)).."\\n%c[d_cyan]состояние : "..gts(tostring(condition))
    act:give_game_news(text,"ui\\cop\\ui_cop_iconstotal",Frect():set(664,329,83,47),150,5000)
end
    time_add = nil
end
end

 

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

@Colder Как я понимаю, речь о большом кол-ве цифр?

Запиши в глобал спейс ф-ию округления до указанной точности:

Скрытый текст

function math.round(v, exp)
    if v then
        if not exp then
            exp = 0
        end
        return tonumber(string.format("%."..exp.."f", v))
    end
end

 

v - число, которое округляем

exp - как округляем, кол-во знаков после запятой

И используй её: 

Скрытый текст

local cond = math.round(condition, 2)

 

  • Спасибо 1

Здесь могла быть ваша реклама.

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

@mole venomous 

А зачем этот вот math.round? А просто в самой ф-ции format указать округление, что уже не работает?

string.format("pX = %.4f, pY = %.4f, pZ = %.4f....

  • Спасибо 1
  • Согласен 1
  • Смешно 1
Ссылка на комментарий
4 минуты назад, AndreySol сказал:

А зачем этот вот math.round

Использовать в дальнейшем, как любой другой math., string. и т.д. Вполне удобно.

  • Спасибо 1

Здесь могла быть ваша реклама.

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

Я прошу прощения заранее, если это обсуждалось где, пожалуйста не бейте  я честно пользовался поисковиком в данной теме по контрольным словам Борода; Артефакты на Заказ; b29
 

Скрытый текст

 

Здравствуйте. Давеча заинтересовался вопросом касательно квеста "Артефакты на заказ" от Бороды, что на Затоне.
До сегодняшнего дня единственным верным для меня этот квест существовал только если у меня есть в карманах подходящий арт. Но, т.к. решил перепройти сталкер и мб даже открыть для себя что новое. И решил я таки попытать счастье с этим квестом, хоть и не нравился он мне (не получалось найти нужный арт). 
Обнаружил некую закономерность, что должно пройти некоторое время после взятия квеста. Отметил, что выброс может в этом плане помочь, "обновляя" содержимое аномалии (это знаю лишь из собственных наблюдений + википедии, в файлах пока не находил).
Плюс, пару раз удавалось поймать сигнал группы, что либо ищет/либо уже нашла нужный арт.

Начал рыться по файлам.
В файле dialogs_zaton.script обнаружил много интересного - какие арты нужны для поиска (прямо не указано, но банальная сверка с википедией это подтвердила):

 

]]--
    [16] = "af_gravi",
    [17] = "af_eye",
    [18] = "af_baloon",
    [19] = "af_dummy_dummy",
    [20] = "af_gold_fish",
    [21] = "af_fire",
    [22] = "af_glass",
    [23] = "af_ice",
}


Какие "стволы" группы соперников примут в обмен на искомый арт:

 

function is_good_gun(npc, item)
    local section = item:section()
    local wpn_table = {
                        [1] = "wpn_sig550",
                        [2] = "wpn_g36",
                        [3] = "wpn_val",
                        [4] = "wpn_groza",
                        [5] = "wpn_vintorez",
                        [6] = "wpn_fn2000",
                        }

 

Стало понятно, что квест заставляет искомый арт появиться именно на Затоне:

local anomalies_names_tbl = {
                                ["gravi"] = {
                                            [1] = "zat_b14_anomal_zone",
                                            [2] = "zat_b55_anomal_zone",
                                            [3] = "zat_b44_anomal_zone_gravi",
                                            },
                                ["thermal"] = {
                                            [1] = "zat_b20_anomal_zone",
                                            [2] = "zat_b53_anomal_zone",
                                            [3] = "zaton_b56_anomal_zone",
                                            },
                                ["acid"] = {
                                            [1] = "zat_b39_anomal_zone",
                                            [2] = "zat_b101_anomal_zone",
                                            [3] = "zat_b44_anomal_zone_acid",
                                            },
                                ["electra"] = {
                                            [1] = "zat_b54_anomal_zone",
                                            [2] = "zat_b100_anomal_zone",
                                            },
                                }

 

Ну и название квеста:
-- Zaton B29, при поиске использовал:
zat_b29

 

Поиск по этому ключевому слову толком ничего в понимании не дал. Нашлась куча файлов, но ничерта не понял, кроме того, что групп - две, что есть некие таймеры поиска артефактов/простоя у этих групп, что группы - вроде как неубиваемы (другими неписями), не реагируют на стрельбу в них (со стороны других НПС).
Вопросы:
1)Есть ли закономерность в поиске артов? Т.е. взял квест, и сколько нужно ждать времени/выбросом для 100% нахождения нужного арта/как влияет количество часов/выбросов? Есть ли рандом в этих значениях (исходя из личного наблюдения, видимо, есть)?
1.1)Влияет ли выброс на этот квест и является ли он ключевым для него - то есть - стоит искать арт только после выброса, т.к. обновятся аномалии? (честно сказать, всё ещё в поиске файла, который опишет обновление аномалий на наличие артов);
2)Если есть, то какая закономерность появления групп на поиск? Я пробовал тупо спать чуть ли не каждый час в попытке выловить сигнал и направиться к ним, из многих таких попыток лишь дважды я не проспал.

 

 

  • Нравится 1
Ссылка на комментарий
4 часа назад, Firestarter сказал:

Какие "стволы" группы соперников примут в обмен на искомый арт:

А ты уверен, что у тебя "чистый" ЗП? 

  • Согласен 1
Ссылка на комментарий
12 минут назад, Space.Marine сказал:

А ты уверен, что у тебя "чистый" ЗП? 

Не понял, к чему вопрос? Да, чистый. 
В чистом ЗП можно успеть выловить группу сталкеров, что уже нашли арт и несут на базу, и предложить им обменяться на хороший ствол. Стволы перечислены в вашем цитировании.

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

Всем привет. Возможно ли вернуть совокупность иммунитетов к конкретному воздействию (броня + арты, но без того, что в actor.ltx)? OGSR. Или нужно всё "надетое" перебирать?

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

Здесь могла быть ваша реклама.

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

@mole venomous как можно вернуть то, чего никогда не было? Никогда в сталкере не было броня + арты. Сначала хит проходит через артефакты. Потом то, что осталось от хита, проходит через броню. Надеюсь понятно выразился.

  • Полезно 3
Ссылка на комментарий

@dsh мне не нужен хит. Нужны цифры. В целом, понятно, что остаётся перебирать и читать из конфига. 

Здесь могла быть ваша реклама.

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

@mole venomous какие цифры? Что за цифры? А то, как в анекдоте: "Приборы? 200. Что 200? А что приборы?". Хочешь получить нужный ответ, описывай ситуацию точно и подробно.

Ссылка на комментарий
3 минуты назад, dsh сказал:

какие цифры?

Надет костюм, у него текущий п-тр

telepatic_protection = a

Повешены арты, сумма их протекции

telepatic_protection = b

Итого у ГГ, благодаря этим вещам, протекция

a + b

Вопрос был в том, возможно ли вернуть число a + b на движке ОГСР. Если с костюмом всё прозрачно, то с артами на поясе остаётся только перебор?

Нужны цифры, указывающие ВСЮ защиту от конкретного воздействия от всех защитных итемов.

Здесь могла быть ваша реклама.

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

@mole venomous теперь кажется понятно. По костюму. У клиентского объекта есть метод get_outfit()

local outfit = db.actor:get_current_outfit():get_outfit()

То, что будет возвращено - это экспорти класса CCustomOutfit https://github.com/dsh2dsh/OGSR-Engine/blob/f34eae64c24957639a2e61ae5d2050bf2c04840e/ogsr_engine/xrGame/derived_client_classes.cpp#L313

у которого доступны на чтение/запись некоторые свойства. По ссылке можно увидеть их список. Вот для примера функция, обнуляющая всю защиту брони:

function zero_outfit_protection( obj )
  local outfit = obj:get_outfit()
  for _, k in ipairs({   
    "burn_protection",
    "chemical_burn_protection",
    "fire_wound_protection",
    "explosion_protection",
    "radiation_protection",
    "shock_protection",
    "strike_protection",
    "telepatic_protection",
    "wound_protection",
  }) do
    outfit[ k ] = 0
  end
end

 

По поводу защиты от артефактов, не могу припомнить, что бы было что, возвращающее суммарную защиту по требуемым типам. Я для этого вот такой скрипт использую https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/inventory.script

который ведет реестр объектов на поясе и можно быстро получить информацию типа

local burn_immunity = inventory.on_belt_hit_immunity( "burn_immunity" )
local health_restore_speed = inventory.on_belt_restore_speed( "health_restore_speed" )

и т.п.

 

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

 

Изменено пользователем dsh
  • Спасибо 1
  • Согласен 1
  • Полезно 1
Ссылка на комментарий
07.11.2021 в 16:01, Firestarter сказал:

сколько нужно ждать времени/выбросом

периодичность выбросов и начало первого выброса с начала новой игры регулируется в surge_manager.script. От взятого квеста на поиск артов периодичность выбросов, как и появление после них новых артов в аномалиях никак не зависит. Также появление артов в аномалиях после выбросов - рандомно. В скрипте (запамятовал уже в каком) можно указать процент вероятности появления в аномалиях артов после выбросов. 
Про обмен у групп сталкеров оружия на арты, если честно, слышу впервые, но, судя по скрипту, имеет место быть. Хотя, ИМХО, это совершенно бесполезная штука. Выгоднее просто продавать найденные арты Бороде. Также, с начала игры на Скадовске, мы ограничены детектором Медведь, который поможет нам найти малое кол-во артов из запрашиваемых Бородой. А с момента получения нами детектора помощнее (на Юпитере) пропадает смысл в торговле артами, так как ГГ уже почти миллионэр. Как-то так )

Изменено пользователем Space.Marine
  • Нравится 1
  • Согласен 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

AMK-Team.ru

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