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

Скриптование


Svoboда

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

Для неполных - да, вытаскивать из пакета, и создавать через create_ammo().

Да чтож вы:)

 

local ini = system_ini()
local num_in_box = ini:r_u32(section, "box_size")
while num > num_in_box do
alife():create_ammo(section, position, lvi, gvi, pid, num_in_box)
num = num - num_in_box
end
alife():create_ammo(section, position, lvi, gvi, pid, num)

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

По скорости - а кто-нибудь мерил ?

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

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, num это сколько нужно патронов(вроде очевидно), 239 например... Далее функция бьет число на пачки и спавнит, в целом в ЧН это все лучше выглядит, т.к. там бокс сайзы поболее, удобнее перекидывать/продавать большие объемы патронов. А если еще и переупаковку воткнуть(ту же знаменитую от IG 2007), то вообще офигенно будет.

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, ты чето походу жеско не врубаешься, изначально АндрейСол тележил за то, что креат не годится, а годится только креат_аммо, потом Зандер сказал, что креат аммо нужен для поштучного спавна, а креат спавнит пачками по бокс сайзу, и предложил юзать нет пакеты(как пример), я предложил иной вариант без использования нет пакетов. Я не говорю что он как-то лучше, и я так же не пытаюсь навязать свой код, и как-либо показать что он как-то лучше/правильнее. Это аналогия, не более, которую я бы использовал для обычного спавна, с заранее(!) заданным числом. Например 239 :)

  • Не нравится 1

Поделиться этим сообщением


Ссылка на сообщение

@Старлей, кэп намекает на сталкера, если конкретно, то в данном примере три класса, cse_alife_trader_abstract, cse_alife_object, и, собственно нужный нам - cse_visual.

Поделиться этим сообщением


Ссылка на сообщение

r_h32()

Опечатка, такого нету. По крайней мере судя по документации, сам не проверял.

а у меня в этой штуковине(из acdc) 

unsigned int

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

К чему я это - получается можно читать пакеты, зная только кол-во байт под какую переменную определенно, а уж signed/unsigned нужно только, если работать с этими значениями?

Если я правильно понял вопрос, то да.

Читать, кстати, можно вообще сразу нужную переменную, если знать позицию.

В случае с визуалом сталкера, получение конкретно этого параметра будет весьма кривым кодом. Не уверен что работает, вот набросал:

 

 

function GetVisual(obj)
local packet = net_packet()
local se_obj = alife():object(obj:id())
se_obj.STATE_Write(se_obj, packet)
packet:r_advance(4)
packet:r_stringZ()
packet:r_advance(4)
packet:r_stringZ()
packet:r_advance(12)
packet:r_stringZ()
packet:r_advance(18)
packet:r_stringZ()
packet:r_advance(8)
return packet:r_stringZ()
end

 

Разумеется можно считывать сразу длину строк и устанавливать позицию чтения сразу туда, куда нужно, но это сами сделайте, кому интересно.

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

Поделиться этим сообщением


Ссылка на сообщение

@Wlad777, не уверен, но можно попробовать заспавнить объект на основе physic_object или, если угодно, O_PHYS_S, и указать ему кость фиксации в стейт части (fixed_bones называется, тип - строка). 

Поделиться этим сообщением


Ссылка на сообщение

@demon96, вместо npc db.actor поставь и будет тебе счастье. Для выдачи сообщений за глаза хватит.

Поделиться этим сообщением


Ссылка на сообщение

@demon96http://www.amk-team.ru/forum/index.php?showtopic=7450&p=258470 здесь и http://www.amk-team.ru/forum/index.php?showtopic=7450&p=472142 здесь конкретно получишь ответ на "при загрузке игры", а уж "определенные действия" извини, не угадаем.

 

@Wlad777, еще тебе подкину один метод, в классе physics_element есть метод fix(), намертво фиксирует гейм объект по указанной кости. Получать кость можно например методом get_element_by_bone_id, но для того, чтобы не путатся, лучше использовать get_element_by_bone_name. Замечу, что при перезагрузке фиксация так скажем теряется, так что нужно "перефиксировать" объект каждый раз при перезагрузке... В целом лучше конечно нет-пакет юзать, но я так, может кому надо будет.

 

Вот можешь попробовать:

 

function FixObj(Obj)
    local oObj
    if type(Obj) == 'userdata' then oObj = Obj end
    if type(Obj) == 'number' then oObj = level.object_by_id(Obj) end
    if oObj then
	local GetPhysShell = oObj:get_physics_shell()
        if  GetPhysShell then 
	    local sElement = GetPhysShell:get_element_by_bone_name("link")
            if sElement and (not sElement:is_fixed()) then 
		sElement:fix()
             end
         end
    end
end
Изменено пользователем Карлан

Поделиться этим сообщением


Ссылка на сообщение

@Призрачный, может с такими вопросами лучше на ап-про? Там ребят твоего уровня побольше, ну и людей, которые на такие вопросы любят отвечать тоже. Конкретно у тебя вопрос, если так можно сказать, "туториальный", зайди в Справочник по функциям и классам, там ну очень подробно расписан класс effector, с помощью него реализовать тобою задуманное весьма не сложно. :)

 

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

 

for i=1, #clsIDMobs do
if not has_alife_info(aRankData.monster_data[clsIDMobs[i]][#aRankData.monster_data[clsIDMobs[i]]].sInfo) then 
packet:w_u8(aRankData.monster_data[clsIDMobs[i]].index or 0)
packet:w_u32(aRankData.monster_data[clsIDMobs[i]].count or 0)
end 
end
Тебе нужно сделать что-то подобное, только проще раз в 10. Тебе достаточно использовать w_u8. Изменено пользователем Карлан

Поделиться этим сообщением


Ссылка на сообщение

@Vadyanchikus, в сталкере есть непонятная лично мне особенность, сначала нужно забирать итем у актора, а потом дальше че-нить фигарить, иначе у актора нифига забираться не будет, несмотря на появленное сообщение. Так что переставь порядок функций и отпишись заработало или нет.

Замечательно забирается. dc

 

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, ну вот на тч артос такое написал, а вообще советовал бы диалогс.скрипт из симбиона глянуть, там в целом удобно все сделано:


function fGet_Actor(oSpeaker1, oSpeaker2)
if oSpeaker1:id() == (idActor or db.actor:id()) then
return oSpeaker1 --/>
end
return oSpeaker2 --/>
end
function fGet_NPC(oSpeaker1, oSpeaker2)
if oSpeaker2:id() == (idActor or db.actor:id()) then
return oSpeaker1 --/>
end
return oSpeaker2 --/>
end
function fGet_Actor_NPC(oSpeaker1, oSpeaker2)
if oSpeaker1:id() == (idActor or db.actor:id()) then
return oSpeaker1,oSpeaker2
end
return oSpeaker2,oSpeaker1 --/>
end

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

Просто я хотел показать @Хемуль36рус, как можно сделать, чтобы не забивать голову выбором объекта.

Kirgudu

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

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, за луа_хелпер могу сказать, что некоторые функции там не дописаны, и некоторые приводят к вылетам, их тоже следует дополнить и/или поправить. Artos сам говорил, что это далеко не окончательный вариант, и каждый в праве править под себя все функции. Кое-что мне у него не нравится и я пишу по своему, т.е... ну неофициальной доработкой этого заниматься как-то глупо. Кто их использует - тот доделает, а кто не использует - тому и не нужно. Так же можно функционал таймеров расширить и т.п. Ошибок таких как у тебя не ловил, за исправления спасибо, заберу.

 

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, оно и не работает (как нужно), функцию нужно заново писать. Хотя выглядит красиво и заманчиво. и каждый незадачливый солянщик считает должным себе это взять, хотя на деле это выглядит/работает весьма... не корректно.

Поделиться этим сообщением


Ссылка на сообщение

@Serge!, тебе все по делу написали. А это извращение было открыто в 2010. Все об это знают я думаю. io в ТЧ нет и не было. К чему ты тут развел это все я не понимаю. Даже сам Artos такое не использовал, а написал se_stor. Подобное нужно лишь в редких случаях (и то - не уверен), например вот как Денис описал.


Обновленная система ивентов: m_events (031214) [~2.5Kb]

P.S.: не трактую свою систему как хорошую и безупречно работающую, но может кому и сгодится ;)

Изменено пользователем Карлан
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

@Barmolini, во-первых да, избавляемся от косяков с секциями, и в некоторых модулях не городим ненужные таблицы напрасно тратя время. А во-вторых проверка t[clsid] работает в ~6-7 раз быстрее чем string.find. На всякий (миллион итераций):

strfind 0.022
table 0.003

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

, единственный корректный подход это сохранять в пакет актору, либо чему-то с ним связанному (фонарик, пда, ...) (в ассоциативном массиве разумеется). Если нужно обязательно в броники или стволы, то тут лучше всего записывать в кастом дату. Можно использовать se_stor или xrvars; это бездонные хранилища, в них можно засовывать что угодно в каких угодно размерах, в xrvars нету явного ограничения на 4кб. Удачи :).

Поделиться этим сообщением


Ссылка на сообщение

Вот поглядите, накостылил кой-чего ;)

Фотошопил я пару минут, так что сильно не пинайте))) 

 

http://youtu.be/9G-LjHxesOE


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

  • Нравится 3

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, ну да, только в трехмерном пространстве. Ничего сложного по сути. Прошлое видео удалил. Сделал два типа меток, различие меток по цветам в зависимости от отношения сталкера/монстра к ГГ. Улучшил алгоритмы вычисления позиции на экране для проецирования метки, так же написал алгоритм увеличения/уменьшения метки в зависимости от дальности. Все работает вполне нормально. Смотрите в 1080.

 

 

  • Нравится 2

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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