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

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

Вот модифицированный xr_attendant (схема follower), для использования в скриптовых сценках, а также для организации примитивных отрядов, возглавляемых игроком. Инструкция внутри.

 

Я не знаком с этой схемой, но, в принципе, в любую схему можно добавить кучу самых разнообразных органичений, и настроить её соответственно :)...

 

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

Внимание! В выложенном мной скрипте обнаружена ошибка, которая может приводить к "вылету" без лога при безусловном переключении на другую схему логики. В функцию action_follow:free () в самом начале нужно добавить строку:

local section = self.object:section()

Приношу извинения за причинённые неудобства :)...

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

Такой вопрос. Добавил тайники на все новые локации от Kostya V. При попытке обыска трупа, когда, по идее, выдаётся наводка на тайник - вылет вида:

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: ...t.a.l.k.e.r\gamedata\scripts\treasure_manager.script:402: attempt to compare number with nil

Строка 402 у меня выглядит так:

if tonumber(treasure_prob) >= 0 and

Используется скрипт рандомных тайников из АМК. Я дополнил его по образцу новыми локациями и так понимаю, что или где-то с этим в скрипте накосячил, или глючит какой-то один тайник, или его описание. Как можно отследить причину вылета?

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

=VENOM=

Извените за наглость но нельзя-ли что то подобное провернуть с схемой компаньоны (от Kamikadze).

В обьщем можно нанять не любого сталкера а только того у кого в логике есть соответствуюшая возможность.

Ну чтоб работало как основные схемы .

 

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

При переборе неписей по ид получил вот такой вылет

 Expression    : m_available_count
Function      : CID_Generator<unsigned int,unsigned char,unsigned short,unsigned char,unsigned short,0,65534,256,65535,0>::tfGetID
File          : e:\stalker\patch_1_0004\xr_3da\xrgame\id_generator.h
Line          : 92
Description   : Not enough IDs

Что он может означать?

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

Ты посмотри что у тебя получается:

Ты сначала берешь объект по айди. Айди у тебя i. Но i у тебя в тот момент = нил. Поэтому сделай лучше сделать так:

local npc

for i = 1, 65534 do

npc = level.object_by_id(i)

if npc and IsStalker(npc) then

Freedom

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

Не понял. Смотри, если написать так:

local npc = level.object_by_id(i)

for i = 1, 65534 do

То двигатель дойдет до первой строки и т.к. у тебя i в тот момент = 0, то последует вылет

 

А если написать так:

local npc

for i = 1, 65534 do

npc = level.object_by_id(i)

 

То у тебя i будет уже равна числу от 1 до 65534

Freedom

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

Пустая трата времени. Есть же таблица db.creatures, её и перебирайте:

for id, npc in pairs(db.creatures) do
if  IsStalker(npc) then
...
end
end

Правда есть одно но! Данная таблица есть в АМК, но ее нет в чистом 1.004. Куфзук

Изменено пользователем Куфзук
Ссылка на комментарий
Есть же таблица db.creatures, её и перебирайте:

А я всё мозги ломаю - как составить такую :) А оказывается такая есть :) А она только сталкеров содержит?

_Призрак_ понял спасибо!

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

Полтергейст, не заблуждайся на счет панацеи в виде 'db.creatures' (как в прочем и 'родная' db.storage).

 

Во-первых, эта таблица создается не мгновенно при старте игры, а динамически пополняется/чистится по мере появления объектов в он-лайне.

Иначе, если тебе потребуется проверить наличие какого-либо непися в самом начале игры (до начала апдейтов актора), ты можешь получить пустой массив (или далеко не полный/недозаполненный).

 

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

 

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

 

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

TRAMP14, таблицы 'db.creatures' (как и db.storage) содержит почти(!) все объекты, которые обрабатываются биндерами, т.е. не только сталкеров, но и всех монстров, ящики, прожекторы, и пр. ... Но(!) только на текущей локации и только те, что уже в онлайне. Так что экономия по кол-ву перебираемых объектов (их идентификаторов) на пару порядков меньше, чем при полной итерации.

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

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

Ссылка на комментарий
Во-первых, эта таблица создается не мгновенно при старте игры, а динамически пополняется/чистится по мере появления объектов в он-лайне.

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

 

Во-вторых, в более сложных случаях можно нарваться и на момент, когда серверный объект уже удален из игры, а в таблице 'db.creatures' он еще не удален

В se_stalker и se_monster в функцию on_unregister добавить

db.creatures[self.id] = nil

должно помочь.

 

На чистой игре, где нет этой таблицы (только сейчас об этом узнал O_o) нужно добавить в db вот это:

creatures = {} --' Это в самом начале, перед всеми функциями

function add_obj(obj)
    if obj then
        creatures[obj:id()] = obj
    end
end

function del_obj( obj )
    if obj then
        storage [obj:id()] = nil
        creatures[obj:id()] = nil
    end
end

И в bind_monster и xr_motivator в функции net_spawn после вот этого

    if not object_binder.net_spawn(self, sobject) then
        return false
    end

добавить такую строку:

    db.add_obj(self.object)

В net_destroy в самом начале добавить

    db.del_obj(self.object)

После этого перебор таблицы должен заработать.

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

Полтергейст, мой мост спровоцирован не текущим вопросом/ответом, а тем, что не первый раз вижу твое "восторженое" отношение к отказу от перебора массива игровых идентификаторов объектов в сторону именно db'шных таблиц.

Дабы и другие не вводились в заблужление - и дал пояснение. Естественно истина - в использовании обоих вариантов.

 

Повторю основное: Не стОит безоговорочно отказываться от одного варианта в пользу другого. Какой таблицей пользоваться зависит от ситуации/момента. Порой необходимо перебирать весь массив идентификаторов, а порой и стОит свою табличку заранее сделать, дабы с'экономить немало времени/ресурсов в дальнейшем.

 

Да и собственно корячиться с 'db.creatures', как ты предлагаешь по прежнему, не имеет особого смысла. Уже в самом АМК (v1.4x) эта таблица по сути стала почти рудиментом, т.к. почти полностью повторяет таблицу 'db.storage'. А на 'сегодня' - подобное уже подустарело ...

Лучше бы обратил внимание на то, как аналогичное сделано в Zenobian-Mod'е, в котором в отдельную таблицу селектируются только гуманоиды и монстры с установкой соотв.флага, дабы проще/быстрее было их различать. :-)

 

P.S. Предлагаемый автором вопроса скрипт/кусок искал онлайновых неписей, но(!) ни намека в какое время это делает скрипт/автор скрипта. Поиск онлайновых объектов может потребоваться и на старте игры, когда 'твоя' таблица еще (полу)пуста.

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

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

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

Кто-нибудь знает, почему в se_stalker при таком составлении функций значение self.wounded всегда считывается как true?

 

function se_stalker:STATE_Write (packet)

cse_alife_human_stalker.STATE_Write (self, packet)

if self.script_version >= 6 then

local ddw=0

if self.death_droped then ddw=ddw+1 end

if self.wounded then ddw=ddw+2 end

packet:w_u8(ddw)

end

end

 

function se_stalker:STATE_Read (packet, size)

cse_alife_human_stalker.STATE_Read (self, packet, size)

if self.script_version >= 6 then

local ddw=packet:r_u8()

self.death_droped=bit_and(ddw,1)==1

self.wounded=bit_and(ddw,2)==2

end

end

 

 

 

Даже если привести их к такому виду

 

function se_stalker:STATE_Write (packet)

cse_alife_human_stalker.STATE_Write (self, packet)

packet:w_bool(self.death_droped)

packet:w_bool(self.wounded)

end

 

function se_stalker:STATE_Read (packet, size)

cse_alife_human_stalker.STATE_Read (self, packet, size)

self.death_droped = packet:r_bool()

self.wounded = packet:r_bool()

end

 

 

то всё равно получается то же самое. Что делать?

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

Полтергейст

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

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

 

Строка: cse_alife_human_stalker.STATE_Write (self, packet) - считывает из пакета сталкера основные базовые байты, но(!) вслед за ними идет байт 'job_online' (u8) с флагом онлайновой работы , после которого могут присутствовать стринговые байты собственно 'job_online_condlist' (stringZ). Далее имеем байт 'was_in_smart_terrain' (bool). И уже за всем этим следует байт 'death_droped' (bool/u8), с которым ты намереваешься поэкспериментировать с целью сохранения бита 'раненый'.

Как видно из выше изложенного (или можешь взглянуть на структуру нет-пакета сталкера в том де бардаковском ACDC) ты вместо заключительного байта 'death_droped' пытаешься перепрописывать 'job_online' ...

К хорошему такие эксперименты не приведут.

 

Т.о. ответ на вопрос: "Что делать?":

- вариант а) Правильно использовать нет-пакеты с их структурой;

- вариант б) Не изобретать велосипед и использовать из того же АМК все то (уже давно сделанное), что ты пытаешься с битом ранения (причем ... с теми же названиями переменных ;-) ).

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

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

Ссылка на комментарий
Как видно из выше изложенного (или можешь взглянуть на структуру нет-пакета сталкера в том де бардаковском ACDC) ты вместо заключительного байта 'death_droped' пытаешься перепрописывать 'job_online'

Вот это я не совсем понял. Я ведь удалил все эти поля (job_online*, was_in_smart_terrain), они не записываются (см. функцию STATE_write). Естественно, я начинаю новую игру, а не гружу сохранения. Переменные те же, потому что АМК мод.

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

Полтергейст, вот когда ты сам себе ответишь на вопросы:

а) "Чем отличается класс 'se_stalker' от 'cse_alife_human_stalker'?" (с точки зрения нет-пакетов)

и

б) "А могу ли я изменять структуру нет-пакетов для уже имеющегося в игре класса?" - и если 'да' то 'что и как' конкретно?

 

- тогда приступай к экспериментам.

 

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

 

Или создавай свой класс объекта со своей структурой пакета или ... используй

уже имеющиеся, но саму структуру ты можешь только пополнять своими байтами (движок их игнорирует, а ты сам скриптами читать/писать будешь), но не кастрируя структуру.

Не путай, менять значения байтов и менять структуру этих байтов - далеко не одно и то же. Если первое приводит к удачам/ошибкам, то второе (про добавление к структуре не говорим) - просто невозможно (без вмешательства в движок).

 

 

P.S. Твоя попытка усечь пакеты в классе 'se_stalker' бессмысленна, если ты конечно не делаешь что-то совершенно свое и на другом движке.

Без байтов 'job_online' (и далее) сталкеры/монстры превращаются в предметы, т.к. основное их отличие - способность выполнять работу в гулагах, которой ты их лишаешь.

 

P.P.S. Перепрочитал и понял в чем твое основное заблуждение:

При старте новой игры объект(ы) создаются сервером в соответствии со своими классами и с применением параметров из all.spawn'а. И только после этого ты их их можешь читать с клиентской стороны и соответственно перезаписывать. Т.о. любая попытка удалить из уже заданной структуры нет-пакета объекта соответствующего класса или даже изменить разрядность базовых для класса байт - бессмысленна изначально. Сервер конечно примет с твоей стороны измененный нет-пакет, но вот применить его к объекту ...?

Удачи в экспериментах! :-)

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

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

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

Кстати, руки чешутся оторвать сохранение/загрузку текущих работ. По тому что в большинстве случаев работа всегда только одна, либо меняется в зависимости от времени суток / событий.

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

 

Чем может быть чревато ?

 

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

Всем привет. Может пишу не в тему. Сделал скрипт, чтобы при выстреле кочался икран. Так вот. Как можно сделать, что-бы при выстреле икран был в крови? Или для этого нужно делать новый скрипт? Или просто подправить конфиг?

 

А скрипт где? Кузфук

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

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

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

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

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

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

Войти

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

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

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