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

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

Artos, upd:grenade_mode читается перед апдейт-пакетом cse_alife_item. Тогда num_items будет ненулевой и все нормально прочитается.
Ссылка на комментарий

KD87

Вау! Оторвать бы кое-что тому, кто так извратился со структурой пакета ...

Спасибо огромадное! Все встало на свои места. Теперь осталось чуток подправить читалку нет-пакетов ...

 

P.S. Для *Shoker*-а: Проверяй с исправленным вариантом (на SHoC проверено):

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Приветствую всех. Можно ли убрать разаттачивание предметов при смерти непися? (убрал очистку инвентаря при смерти) Если можно, то как?

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

вот разбираюсь с респавном, начал тестировать:

[116]

; cse_abstract properties

section_name = respawn

name = esc_dog_test

position = -208,-20,-146

direction = 0,0,0

 

; cse_alife_object properties

game_vertex_id = 61

distance = 10

level_vertex_id = 44615

object_flags = 0xffffff3e

custom_data = <<END

[respawn]

respawn_section = esc_dog_test

max_count = 8

;min_count = 2

max_spawn = 2

idle_spawn = 5,5

conditions = 100

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 1

 

; cse_alife_space_restrictor properties

restrictor_type = 0

 

; se_respawn properties

 

респавнятся собачки в лагере новичков на кордоне (специально, чтоб не бегать).idle_spawn = 5,5 - вроде означает что переодичность 5 мин, сделал так специально, чтоб просто протестить.

[esc_dog_test]:dog_strong

custom_data = scripts\esc_dog_test.ltx

[smart_terrains]

respawn_check = false

none = true

 

 

по моей задумке раз в 5 минут должно спавниться по 2 собачки и свободно гулять по всей зоне, игнорируя гулаги.

начинаю новую игру, бегу в лагерь новичков, вижу собак - всё правильно. потом убиваю их жду 5 минут, но новые не появляются, потом ещё 5 - ничего.

Вопрос: почему они дальше не хотят спавниться? P.S. а перед тем как делать респавн надо самих собачек заспавнить или нет, а то я не спавнил?

FLUDMAN.gif

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

FLUDMAN, по идее 'криминала' у тебя вроде нет, должны респавниться.

1. Убери из секции респавнера строку 'conditions = 100', она излишня.

2. Строка idle_spawn = 5,5 задает периодичность в 5,5 секунд, а не минут. Наверное стОит увеличить.

3. Самому спавнить не нужно, твой респавнер должен каждый запуск игры спавнить по две собаки и далее по тайм-ауту ... по 2 штуке ... пока их 'в живых' не будет 8 штук. Погибнут - опять доспавнит.

Если не так - оригинальный ли у тебя 'se_respawn.script' или со сторонними правками?

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Всем привет! Попытался создать звук при использовании предмета при помощи скриптов, но при использовании предмета получаю не звук, а вылет:

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: ...:\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:30: attempt to index global 'sound_eat' (a nil value)

 

 

stack trace:

 

 

 

----------------------------------------------------------------------------------------------------------------------

function actor_binder:net_destroy()

if(actor_stats.remove_from_ranking~=nil)then

actor_stats.remove_from_ranking(self.object:id())

end

-- game_stats.shutdown ()

db.del_actor(self.object)

 

sr_light.clean_up ()

 

self.object:set_callback(callback.inventory_info, nil)

self.object:set_callback(callback.article_info, nil)

self.object:set_callback(callback.on_item_take, nil)

self.object:set_callback(callback.on_item_drop, nil)

-- self.object:set_callback(callback.use_object, nil)

self.object:set_callback(callback.task_state, nil)

self.object:set_callback(callback.level_border_enter, nil)

self.object:set_callback(callback.level_border_exit, nil)

self.object:set_callback(callback.take_item_from_box, nil)

self.object:set_callback(callback.use_object, nil)

 

if sr_psy_antenna.psy_antenna then

sr_psy_antenna.psy_antenna:destroy()

sr_psy_antenna.psy_antenna = false

end

 

xr_sound.stop_all_sound_object()

 

object_binder.net_destroy(self)

end

----------------------------------------------------------------------------------------------------------------------

function actor_binder:reinit()

object_binder.reinit(self)

 

local npc_id = self.object:id()

 

db.storage[npc_id] = { }

 

self.st = db.storage[npc_id]

self.st.pstor = nil

 

self.next_restrictors_update_time = -10000

 

self.object:set_callback(callback.inventory_info, self.info_callback, self)

self.object:set_callback(callback.article_info, self.article_callback, self)

self.object:set_callback(callback.on_item_take, self.on_item_take, self)

self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)

self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats

--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)

self.object:set_callback(callback.task_state, self.task_callback, self)

--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)

self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)

self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)

self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

self.object:set_callback(callback.use_object, self.use_obj, self)

self.object:set_callback(callback.use_object, self.use_object, self)

end

----------------------------------------------------------------------------------------------------------------------

 

 

А вот сам файл sound_eat

function use_snd(obj)

 

local obj_sect = obj:section()

 

local snd

 

if obj_sect == 'medkit' then snd = interface\inv_medkit

 

elseif obj_sect == 'kolbasa' then snd = interface\inv_food

 

elseif obj_sect == 'bandage' then snd = interface\inv_bandage

 

elseif obj_sect == 'vodka' then snd = interface\inv_vodka

 

elseif obj_sect == 'antirad' then snd = interface\inv_pills

 

elseif obj_sect == 'energy_drink' then snd = interface\inv_softdrink

 

 

 

end

 

if snd then

 

local snd_obj = xr_sound.get_safe_sound_object(snd)

 

snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)

 

end

 

end

 

 

З.Ы. Всё делал по уроку на сталкер инсайд.

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

Leshik,

if obj_sect == 'medkit' then snd = interface\inv_medkit
elseif obj_sect == 'kolbasa' then snd = interface\inv_food
elseif obj_sect == 'bandage' then snd = interface\inv_bandage
elseif obj_sect == 'vodka' then snd = interface\inv_vodka
elseif obj_sect == 'antirad' then snd = interface\inv_pills
elseif obj_sect == 'energy_drink' then snd = interface\inv_softdrink

 

 

в правой части должно везде быть по примеру

 

if obj_sect == 'medkit' then snd = [[interface\inv_medkit]]

Vita sine libertate, nihil

Vita sine litteris - mors est

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

Artos, KD87

Огромное спасибо за помощь :good2:

С последней версией всё прекрасно работает. Никаких сдвигов (ЧН) я не заметил, все параметры отображаются корректно.

Теперь попробую переделать колбек на выстрел, чтобы без кейлогера работал.

 

RvP

А твоя lua-библиотека с невырезанными функциями работает только в ТЧ?

 

> в правой части должно везде быть по примеру

Ещё можно так:

if obj_sect == 'medkit' then snd = "interface\\inv_medkit"

 

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

И вообще, функцию use_object лучше так переделать, использовать таблицу:

 

local snd_tbl = {
    --\\ Медикаменты
    medkit            =     "interface\\inv_medkit",
    medkit_army        =     "interface\\inv_medkit",    
    medkit_scientic        =     "interface\\inv_medkit",    
    bandage            =     "interface\\inv_bandage",
    antirad            =     "interface\\inv_pills",
    
    --\\ Еда
        bread                        =     "interface\\inv_food",
    kolbasa            =     "interface\\inv_food",
    conserva            =     "interface\\inv_food",

    --\\ Напитки
    vodka            =     "interface\\inv_vodka",
    energy_drink        =     "interface\\inv_softdrink",    
                }
                
function use_snd(obj)
    local obj_sect = obj:section()
    
    if snd_tbl[obj_sect] then
        local snd_obj = xr_sound.get_safe_sound_object(snd_tbl[obj_sect])
        snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
    end
end

 

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Всем привет! Как сделать проверку на взятие предмета ГГ и выдачу инфопоршня?(Нужно несколько разных предметов, на разных этапах)

function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_take_item (obj, self.object)
end

if obj and obj:section() == "af_medusa" then
    db.actor:give_info_portion("find_art1")
end
if obj and obj:section() == "af_gravi" then
    db.actor:give_info_portion("find_art2")
end

Если делаю так, то выполняется проверка только для медузы, а проверка на грави(и на последующие предметы) не выполняется. Заранее спасибо...

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

KoRan

Вообще то "if obj and obj:section() == "af_medusa" then ..." и то что ниже, должно быть внутри функции actor_binder:on_item_take (obj), тоесть

до end стоять.

 

function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_take_item (obj, self.object)

  if obj and obj:section() == "af_medusa" then
    db.actor:give_info_portion("find_art1")  
  end

  if obj and obj:section() == "af_gravi" then
    db.actor:give_info_portion("find_art2")
  end

end

 

Но тебе проще будет сделать так:

 

local my_info_table = {
  af_medusa = "find_art1",
  af_gravi     = "find_art2",
}
function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_take_item (obj, self.object)

     if my_info_table[obj:section()] then
       db.actor:give_info_portion( my_info_table[obj:section()])  
     end
end

 

Тогда тебе достаточно будет лишь заполнять таблицу my_info_table, секция предмета = имя инфы

 

 

 

Artos

Кажется нашёл в новой версии нет-пакетов ошибки. Я ещё не до конца досмотрел, буду писать по мере нахождения:

1) В функциях работы с нет-пакетами аномалий появилась проверка на аномалию, функция isAnomaly(), но она есть только в твоём моде (в _G скрипте),

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

 

2) В Fill_Packet_cse_ph_skeleton у тебя идёт запись updskeleton_flags, но в Parse_Packet_cse_ph_skeleton (и вообще во всём скрипте) ты её не считываешь.

Причём в старой версии скрипта это считывание присутствует.

 

3) Не уверен что ошибка. но в Parse_Packet_se_zone_anom, у тебя идёт чтение last_spawn_time_present, читается 8 бит и если они есть, то вызывается функция utils.w_CTime(oPs, tT.ctime), проблема в том, что в чистой игре, эта функция вылетает с таким логом:

[error]Arguments     : LUA error: ...es\stalker - clear sky\gamedata\scripts\utils.script:595: attempt to index local 't' (a number value)

В старой версии чтение и запись CTime я просто убрал, вылетов и глюков не было, хотя не могу стопроцентно ручаться.

 

Всё это проверялось на ЧН.

Больше вроде бы пока ничего не нашёл.

 

ЗЫ: Некоторые вещи мог сказать не правильно, но ты суть поймёшь, если глянешь на скрипт.

 

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Кто знает что это означает

 

Expression : no_assert

Function : CALifeStoryRegistry::add

File : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_story_registry.cpp

Line : 30

Description : Specified story object is already in the Story registry!

по моему насколько я понял проблема в story_id

но я уже все раз по сто проверил.

Лёха_тц.gif
Ссылка на комментарий

Лёха_тц

И новую игру не забывай начинать, если спавн меняешь.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Есть доступ к "инвентарному весу" инвентарных объектов через нет-пакеты?

 

Вопрос хоть и не в тему, но всё-равно - уточни его, пожалуйста. Что значит "инвентарный вес"?

ColR_iT

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

всё легко

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

RvP, спасибо.

Как узнать скриптово расстояние до цели, которое под прицелом выводится?

Пробовал level.get_target_dist(), но с ним вылетает и пишет attempt to call field 'get_target_dist' (a nil value)

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

"Инвентарный вес" - имеется в виду "вес предмета в инвентаре ГГ" в "кг" - например: "медуза 5кг".

Есть "mass"-а у "cse_alife_object_physic"-а, но это, скорее всего, не то.

Задача такая: Скриптом изменять "инвентарный вес" объекта(предмета). Потом, если получиться, физическую массу то-же надо попробовать.

 

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

Darkscape, тебе нужно заменить xrGame.dll на r15 и выше.

http://www.amk-team.ru/forum/index.php?showtopic=10538

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

всё легко

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

*Shoker*

Модуль нет-пакетов все же пишется не как универсальный для 'всего и вся', а в привязке и к конкретному моду и учитывая его применение с головою, а не методом тыка ...

1. Все пакеты для объектов можно получать конкртеным вызовом именно той функциии, которая предназначена для данного класса. То, что начал вводить в модуль обобщенные вызовы, которые сами по классу объекта выбирают соответствующие методы чтения/записи - это пока и а 'разработке' и предназначено в первую очередь для 'only Simbion'. Если модмейкеру не хочется каждый раз самому в кодах предварительно определять класс объекта, а хочет воспользоваться 'общим' вызовом - то и должен озаботиться портированием к 'себе' соответствующих доп.функций.

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

Так что, считаю более правильным - дана основа и некоторые бонусы. Хочешь воспользоваться бонусами - потрудись под них подстроиться.

 

2. Параметр 'updskeleton_flags' остался с давних времен и он рудиментарен. Спасибо за подсказку - вычистил.

 

3. Действительно с utils.w_CTime для ЧН/ЗП упустил сей нюанс, что может возвоащать не юзердату а нолик иль ничего. Ранее просто считывал как 'остаток' (кстати этот вариант остался и достточно раскомментировать).

Подправил сей момент под ЧН/ЗП, но пока не протестировал ... Если есть желание/полтребность - могу выложить подправленный вариант.

 

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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