9.4.10

Мячта сбывается..

Делаю я, значит, дежурный утренний обход интернетов.. Захожу на почту, и что я вижу? Приглашение на бета-тестирование игры StarCraft® II: Wings of Liberty™. Попребывав в ступоре с полминуты, решил сначала всё проверить, прежде чем радоваться. Зашёл на баттл.нет, трясущимися руками залогинился и только тогда успокоился. :)
Везение - клёвая штука.

Олсо, сделал себе пирсинг языка. Случайно. Рыбной косточкой, навылет. Вышла с той же стороны, с какой вошла) Не больно, но засела она крепко. Всё равно что гвоздь из покрышки вытаскивать. о_О
Кажется, вероятность учудить такое не выше, чем вероятность попасть под бульдозер на высоте 10000 м над уровнем моря.
Везение - странная сцука штука.

И до кучи проапгрейдил до очередной версии свой гмодовский тул - листатель скинов. Научил его обращению с prop_effect. Не без гемора, как водится.
Проп_эффект, сцуко, кривой. Это маленький осязаемый кубик с приперенченным неосязаемым prop_dynamic. Вот у этого динамика и надо менять скин. На сервере у энтити-эффекта есть замечательное поле AttachedEntity, но клиенту о нём ничего не известно. А следовыло бы, ибо у тулгана предиктинг, да и облачко-подсказка с информацией о скинах.
Напроломное решение здесь - слегка вмешаться в код prop_effect, отослав приаттаченный динамик на клиент после спавна, а на клиенте - поймать его и положить в AttachedEntity. И все счастливы. Да вот бяда: распространять инструмент - сущность модульную - вместе с изменённым оригинальным файлом это как минимум непрофессианализм) Не говоря о том, что стим при запуске игры затирает этот файл копией из gcf.
Правильное решение - инкапсулировать весь код в одном файле. Как, спрашивается, это можно сделать? Первой мыслью было посмотреть, а нет ли хука на создание энтити. Посмотрел, есть такой. Пейшу, значится, кот..
hook.Add( "OnEntityCreated", "PropEffectAttachmentReplication", function( e )
if ValidEntity(e) && e:GetClass() == "prop_effect" then
MsgN( e )
e:SetNWEntity( "AttachedEntity", e.AttachedEntity )
end
end )
Проверяю. На выходе какая-то лажа, а именно - кромешная тишина. Начал разбираться и выяснил омерзительные подробности: callback вызывается до переназначения имени класса скриптованой энтити! То есть GetClass выдаёт здесь тупо "sent_anim". >_< Стоит ли говорить, что искать поле AttachedEntity на этом этапе бессмысленно? Забрасываю идею на йуг, в конце концов, нормальные герои всегда идут в обход!
И пошёл я в код спавна проп_эффекта и заприметил я там относительно редко вызываемый метод PhysicsInitBox. Ну а дальше.. а дальше HAAAAAX!!1
local Entity = FindMetaTable( "Entity" )
if Entity && !Entity.__PhysicsInitBox then
Entity.__PhysicsInitBox = Entity.PhysicsInitBox
function Entity:PhysicsInitBox( mins, maxs )
if self:IsValid() && self:GetClass() == "prop_effect" then
self:SetNWEntity( "AttachedEntity", self.AttachedEntity )
end
return self:__PhysicsInitBox( mins, maxs )
end
end
Это грязно, это непристойно, но это, матьйиво, работает! Нет, я немножко вру, это почти работет. Чтобы работало взаправду, вместо SetNWEntity делаем вот что: self:SetNWInt( "AttachedEntity", self.AttachedEntity:EntIndex() ).
Ну и остаётся на клиенте делать ents.GetByIndex( e:GetNWInt( "AttachedEntity" ) ). Фуф.
Зарелизить чтоле? Пора бы, учитывая 3+ года разработки. :)

Такие дела.

УПД: Нет, с этим шаблоном точно надо что-то делать. -_-

Комментариев нет:

Отправить комментарий