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

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

Почему при спавне НПЦ скриптом в его имени к основному добавляются какие-то рандомные цифры?

Вот почему, извините начальство форума за не очень пристойное слово, хочется {игнорировать} всякие призывы о помощи, и не тратить силы на распинания по сути.

CRAZY_STALKER666 ты же поставил "Спасибо" к моему посту http://www.amk-team.ru/forum/topic/6185-skriptovanie/?p=1020661, т.е. ты должно быть его прочитал.

А если это так, то ты не мог не заметить, что я в этом посте рассказывал про "цифры" в имени объекта.

 

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

"Абыдно, да?" ("Кавказская пленница")

 

"Начальство" в специально отведенном месте постоянно рыдает по тому же самому поводу. Не успевает жилетки менять. dc

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

@Nazgool, да, спасибо поставил. И да, разобрался, что это уникальный id. Выше постом расписали...

За динамическое хранилище отдельное спасибо, всё прекрасно работает!

Не соответствует правилам.

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

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

function функция_1()

if инфо_поршень then

функция_2()

else

функция_3()

end

 

function функция_3()

инфо_поршень

print("это пример")

end

 

function функция_2()

print("еще пример действия")

end

 

Или можно переменные выдавать за место инфо поршней?

 

Я пробовал в функции выдавать локальную переменную, но она работала только в этой функции.

 

З.ы. Модераторы, исправьте пожалуйста вид сообщения, если не сложно..

Изменено пользователем Kober(BRUC)
Ссылка на комментарий

@Kober(BRUC), всё очень просто!

 

if db.actor:dont_has_info("bar_anom_spawn") then -- проверка на то, что поршня НЕТ

---

end

 

if db.actor:has_info("pass_true") then -- проверка на то, что ЕСТЬ.

 

Полный код:

 

 

 

if  db.actor:has_info("pass_true") then
функция_2()
else
функция_3()
end

function функция_3()
db.actor:give_info_portion("gar_art_spawn") -- выдача поршня
print("это пример")
end

function функция_2()
print("еще пример действия")
end
  • Спасибо 1

Не соответствует правилам.

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

if db.actor:has_info( "инфо" )...

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

 

А смысл такие посты с телефона набирать ?

 

С какими, простите, переменными ? И зачем ? И что значит - "не только в сталкере" ?

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

Дурацкий вопрос, но спрошу. Добавил в "Radiation mod of foods" для зп соответствующее сообщение при окончательной (сильной) порче еды.Так как со скриптованием у меня плохо первый раз вставил команду не туда и сообщение после первой отправки начинало отправятся игроку бесконечное количество раз. со второй попытки получилось - но беда, при порче, например, 6 единиц - приходит 6 раз и тд. Помогите исправить...

function spw_rad_high_food()



if interval < time_global() then
db.actor:iterate_inventory(function (dummy,item)
if items_rad_high[item:section()] then
this.del_item(item)
this.spawn_item(tostring(item:section().."_high"))
news_manager.send_tip(db.actor, game.translate_string("tag_bad_food_tip")) (!!!вот кусок который добавил)
end
end, nil)
interval = time_global() + 2000
end
end

 

47.gif

LXTwrBW.png
ukgXKMe.png

Ссылка на комментарий
Помогите исправить...

Может так?

function spw_rad_high_food()

    if interval < time_global() then
        local st = true
        db.actor:iterate_inventory(function (dummy,item)
            if items_rad_high[item:section()] then
                this.del_item(item)
                this.spawn_item(tostring(item:section().."_high"))
                if st then
                    news_manager.send_tip(db.actor, game.translate_string("tag_bad_food_tip")) (!!!вот кусок который добавил)
                    st = false
                end
            end
        end, nil)
        interval = time_global() + 2000
    end
 end

 

 

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

@Serge!, не помогло. Оно ведь, судя по всему, работает циклично и заменяет предметы на порченые по одному. В конце функции заменяет одну "conserva_rad_average" на "conserva_rad_high", принимает "st = false", вроде сообщение уже не должно появится, переходит к следующей "conserva_rad_average" и снова - "local st = true" и по новой. По идее надо как то так:

1. Функция "Проверка условий(наличие продуктов и нужной радиации)" запуск 2.

2. Отдельная промежуточная функция на отправку одного сообщения, запуск 3.

3. Функция замены продукт_rad_average на продукт_rad_high.

вот весь файл.

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


-- Script: rad_items.
-- Description: Scripting system of food contamination by radiation.
-- Author: Tris.
-- Version: 0.1.
-- Date: 15.12.2011.
-- Recent changes: 17.12.2011***12:34.
-----------------------------------------------------------------------------------------------------------

local items = {
bread = true,
kolbasa = true,
conserva = true,
}

local items_rad_average = {
bread_rad = true,
kolbasa_rad = true,
conserva_rad = true,
}

local items_rad_high = {
bread_rad_average = true,
kolbasa_rad_average = true,
conserva_rad_average = true,
}

function rad_food()
if db.actor.radiation >= 0.2 then
spw_rad_food()
end
end

function rad_average_food()
if db.actor.radiation >= 0.4 then
spw_rad_average_food()
end
end

function rad_high_food()
if db.actor.radiation >= 0.6 then
spw_rad_high_food()
end
end

local interval = 0

function spw_rad_food()
if interval < time_global() then
db.actor:iterate_inventory(function (dummy,item)
if items[item:section()] then
this.del_item(item)
this.spawn_item(tostring(item:section().."_rad"))
end
end, nil)
interval = time_global() + 2000
end
end

local interval = 0

function spw_rad_average_food()
if interval < time_global() then
db.actor:iterate_inventory(function (dummy,item)
if items_rad_average[item:section()] then
this.del_item(item)
this.spawn_item(tostring(item:section().."_average"))
end
end, nil)
interval = time_global() + 2000
end
end

local interval = 0

function spw_rad_high_food()

if interval < time_global() then
db.actor:iterate_inventory(function (dummy,item)
local st = true
if items_rad_high[item:section()] then
this.del_item(item)
this.spawn_item(tostring(item:section().."_high"))
if st then
news_manager.send_tip(db.actor, game.translate_string("tag_bad_food_tip")) -- (!!!вот кусок который добавил)
st = false
end
end
end, nil)
interval = time_global() + 2000
end
end

function spawn_item(item)
alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

function del_item(item)
local obj = alife():object(item:id())
alife():release(obj, true)
end

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

 

47.gif

LXTwrBW.png
ukgXKMe.png

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

@naxac, работает. :) Только не пойму как я строчки перепутал - вроде сразу все копировал... Мистика, однако... :blink: Хотя коментил свою фразу, чтобы не было вылета - может тогда и переставил случайно. Спасибо огромное. :D

47.gif

LXTwrBW.png
ukgXKMe.png

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

Интересует способ определить с глушителем ли оружие в руках или нет? Оружие из которого стреляем, определяется: db.actor:active_item() из колбека на выстрел. Патч 1.0007

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

 

 

определить с глушителем ли оружие в руках или нет?

Движковой ф-ции для этого нет. Единственный вариант - получать нет-пакет, и в нем проверять наличие интересующих обвесов.

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

Забыл, что на зп уже присутствует пространство имен io и всю ночь искал способы вывода инфы в косноль окольными путями. Уже разобрался, спасибо.

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

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

 

В xr_motivator в метод motivator_binder:load(reader) поставил такую ловушку ошибок:

function motivator_binder:load(reader)
    self.loaded = true

    object_binder.load(self, reader)

    if reader:r_eof() then
        zander_log(self.object, reader)
        local sobj = alife():object(self.object:id())
        local pa = m_net_utils.Get_NetPacket(sobj, 2)
        zander_log(pa)
        abort("SAVE FILE IS CORRUPT")
    end
* * *

Т.е. если читается что-то не то - выводим в лог, а что же там такое. И уже потом вылетаем.

А там вот что:

     USERDATA;
;*game_object parameters
   {
   [KEY:  STRING:gv] = VALUE:  NUMBER:65535;
   [KEY:  STRING:story_id] = VALUE:  NUMBER:902;
   [KEY:  STRING:clsid] = VALUE:  NUMBER:34;
   [KEY:  STRING:section] = VALUE:  STRING:stalker_sakharov;
   [KEY:  STRING:id] = VALUE:  NUMBER:4991;
   [KEY:  STRING:lv] = VALUE:  NUMBER:4294967296;
   [KEY:  STRING:position] = VALUE:  STRING:x: 29.601; y: -11.7193; z: -272.26;
   }
 USERDATA;
unknown userdata
 TABLE:;
   {
   [KEY:  STRING:upd] = VALUE:  TABLE:;
   Table value:
      {
      [KEY:  STRING:s32u1] = VALUE:  NUMBER:833817;
      [KEY:  STRING:distance_to_point] = VALUE:  NUMBER:1100498313;
      [KEY:  STRING:group] = VALUE:  NUMBER:1;
      [KEY:  STRING:torso] = VALUE:  USERDATA;
      [KEY:  STRING:next_game_vertex_id] = VALUE:  NUMBER:1480;
      [KEY:  STRING:distance_from_point] = VALUE:  NUMBER:1100498313;
      [KEY:  STRING:prev_game_vertex_id] = VALUE:  NUMBER:1480;
      [KEY:  STRING:u8u2] = VALUE:  NUMBER:0;
      [KEY:  STRING:health] = VALUE:  NUMBER:1;
      [KEY:  STRING:model] = VALUE:  NUMBER:-1.5781494379044;
      [KEY:  STRING:squad] = VALUE:  NUMBER:8;
      [KEY:  STRING:start_dialog] = VALUE:  STRING:hacker_dialog;
      [KEY:  STRING:position] = VALUE:  USERDATA;
      [KEY:  STRING:team] = VALUE:  NUMBER:9;
      }
   [KEY:  STRING:class] = VALUE:  STRING:yan_general_ecolog;
   [KEY:  STRING:smtrid] = VALUE:  NUMBER:65535;
   [KEY:  STRING:object_flags] = VALUE:  NUMBER:-1;
   [KEY:  STRING:team] = VALUE:  NUMBER:9;
   [KEY:  STRING:killerid] = VALUE:  NUMBER:65535;
   [KEY:  STRING:visual_flags] = VALUE:  NUMBER:0;
   [KEY:  STRING:spawn_story_id] = VALUE:  NUMBER:-1;
   [KEY:  STRING:charname] = VALUE:  STRING:Сахаров;
   [KEY:  STRING:money] = VALUE:  NUMBER:104537;
   [KEY:  STRING:smtrtaskactive] = VALUE:  NUMBER:0;
   [KEY:  STRING:lvid] = VALUE:  NUMBER:53540;
   [KEY:  STRING:gvid] = VALUE:  NUMBER:1480;
   [KEY:  STRING:group] = VALUE:  NUMBER:1;
   [KEY:  STRING:game_death_time] = VALUE:  TABLE:;
   Table value:
      {
      [KEY:  NUMBER:1] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:2] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:3] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:4] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:5] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:6] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:7] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:8] = VALUE:  NUMBER:0;
      }
   [KEY:  STRING:source_id] = VALUE:  NUMBER:65535;
   [KEY:  STRING:left_chunk] = VALUE:  TABLE:;
   Table value:
      {
      [KEY:  NUMBER:1] = VALUE:  NUMBER:255;
      [KEY:  NUMBER:2] = VALUE:  NUMBER:255;
      [KEY:  NUMBER:3] = VALUE:  NUMBER:255;
      [KEY:  NUMBER:4] = VALUE:  NUMBER:255;
      [KEY:  NUMBER:5] = VALUE:  NUMBER:255;
      [KEY:  NUMBER:6] = VALUE:  NUMBER:31;
      [KEY:  NUMBER:7] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:8] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:9] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:10] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:11] = VALUE:  NUMBER:187;
      [KEY:  NUMBER:12] = VALUE:  NUMBER:202;
      [KEY:  NUMBER:13] = VALUE:  NUMBER:236;
      [KEY:  NUMBER:14] = VALUE:  NUMBER:65;
      [KEY:  NUMBER:15] = VALUE:  NUMBER:130;
      [KEY:  NUMBER:16] = VALUE:  NUMBER:138;
      [KEY:  NUMBER:17] = VALUE:  NUMBER:59;
      [KEY:  NUMBER:18] = VALUE:  NUMBER:193;
      [KEY:  NUMBER:19] = VALUE:  NUMBER:145;
      [KEY:  NUMBER:20] = VALUE:  NUMBER:33;
      [KEY:  NUMBER:21] = VALUE:  NUMBER:136;
      [KEY:  NUMBER:22] = VALUE:  NUMBER:195;
      [KEY:  NUMBER:23] = VALUE:  NUMBER:237;
      [KEY:  NUMBER:24] = VALUE:  NUMBER:210;
      [KEY:  NUMBER:25] = VALUE:  NUMBER:236;
      [KEY:  NUMBER:26] = VALUE:  NUMBER:65;
      [KEY:  NUMBER:27] = VALUE:  NUMBER:32;
      [KEY:  NUMBER:28] = VALUE:  NUMBER:122;
      [KEY:  NUMBER:29] = VALUE:  NUMBER:59;
      [KEY:  NUMBER:30] = VALUE:  NUMBER:193;
      [KEY:  NUMBER:31] = VALUE:  NUMBER:13;
      [KEY:  NUMBER:32] = VALUE:  NUMBER:33;
      [KEY:  NUMBER:33] = VALUE:  NUMBER:136;
      [KEY:  NUMBER:34] = VALUE:  NUMBER:195;
      [KEY:  NUMBER:35] = VALUE:  NUMBER:1;
      [KEY:  NUMBER:36] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:37] = VALUE:  NUMBER:128;
      [KEY:  NUMBER:38] = VALUE:  NUMBER:128;
      [KEY:  NUMBER:39] = VALUE:  NUMBER:128;
      [KEY:  NUMBER:40] = VALUE:  NUMBER:128;
      [KEY:  NUMBER:41] = VALUE:  NUMBER:128;
      [KEY:  NUMBER:42] = VALUE:  NUMBER:128;
      [KEY:  NUMBER:43] = VALUE:  NUMBER:255;
      [KEY:  NUMBER:44] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:45] = VALUE:  NUMBER:2;
      [KEY:  NUMBER:46] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:47] = VALUE:  NUMBER:0;
      }
   [KEY:  STRING:squad] = VALUE:  NUMBER:8;
   [KEY:  STRING:skeleton_flags] = VALUE:  NUMBER:4;
   [KEY:  STRING:skeleton_name] = VALUE:  STRING:$editor;
   [KEY:  STRING:spec_character] = VALUE:  STRING:yan_general_ecolog;
   [KEY:  STRING:baseinr] = VALUE:  STRING:;
   [KEY:  STRING:predicate1] = VALUE:  TABLE:;
   Table value:
      {
      [KEY:  NUMBER:1] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:2] = VALUE:  NUMBER:1;
      [KEY:  NUMBER:3] = VALUE:  NUMBER:1;
      [KEY:  NUMBER:4] = VALUE:  NUMBER:1;
      [KEY:  NUMBER:5] = VALUE:  NUMBER:0;
      }
   [KEY:  STRING:dyn_in_restr] = VALUE:  TABLE:;
   Table value:
      {
      }
   [KEY:  STRING:story_id] = VALUE:  NUMBER:902;
   [KEY:  STRING:reputation] = VALUE:  NUMBER:50;
   [KEY:  STRING:distance] = VALUE:  NUMBER:29.39999961853;
   [KEY:  STRING:dyn_out_restr] = VALUE:  TABLE:;
   Table value:
      {
      }
   [KEY:  STRING:custom_data] = VALUE:  STRING:[smart_terrains]
none = true
 
[logic]
cfg = scripts\yan\yan_scientist.ltx;
   [KEY:  STRING:direct_control] = VALUE:  NUMBER:1;
   [KEY:  STRING:visual_name] = VALUE:  STRING:actors\ucheniy\ucheniy_2;
   [KEY:  STRING:trader_flags] = VALUE:  NUMBER:1;
   [KEY:  STRING:predicate2] = VALUE:  TABLE:;
   Table value:
      {
      [KEY:  NUMBER:1] = VALUE:  NUMBER:2;
      [KEY:  NUMBER:2] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:3] = VALUE:  NUMBER:0;
      [KEY:  NUMBER:4] = VALUE:  NUMBER:2;
      }
   [KEY:  STRING:baseoutr] = VALUE:  STRING:yantar_bunker_space_restrictor;
   [KEY:  STRING:communityid] = VALUE:  NUMBER:7;
   [KEY:  STRING:health] = VALUE:  NUMBER:1;
   [KEY:  STRING:rank] = VALUE:  NUMBER:93;
   }
ВНИМАНИЕ! Ошибка! Информация по ошибке в строках ниже!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ERROR! Reason: SAVE FILE IS CORRUPT
stack traceback:
    ...g\s.t.a.l.k.e.r\gamedata\scripts\xr_motivator.script:547: in function <...g\s.t.a.l.k.e.r\gamedata\scripts\xr_motivator.script:535>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
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: ...ishing\s.t.a.l.k.e.r\gamedata\scripts\lua_fix.script:133: ВНИМАНИЕ! Игра прервана! Информация в строках выше.
 

stack trace:

И вот смотрю я, нетпакет принадлежит Сахарову, и вроде бы - криминала как будто нет. Или я его не вижу.

А игра считает что криминал есть, r_eof() возвращает true и получем вылет.

Собственно, вопросы.

1. Что не так с Сахаровым в данном случае? почему это происходит?

2. Что надлежит сделать чтобы подобного не происходило, и есть ли вариант в оффлайне поколдовать с его нетпакетом, чтобы без НИ, вот этот самый сейв, успешно загрузился.

 

 

 

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
@Zander_driver, в метод load биндера передается не нет-пакет нпс, а отдельный поток на чтение. Это только с Сахаровым так? Изменено пользователем naxac

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

naxac.gif

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

Только с Сахаровым и только в одном случае у одного юзера. Но вот такого рода "мины" в моде очень хочется устранять в первую очередь.

Таки где поискать причины переполнения...

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

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

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

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

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

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

Войти

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

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

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