ShowUnit() через гетлокалплеер вызывает десинк, но я уж больно хочу как то закостылить скрытие от локальных игроков для определенного юнита. Прозрачность - нет, видна тень и ХПбар. Может не одна прозрачность? Что можно такое лютое залупить, чтобы юнит полностью спрятался от локальных обидчиков?
Если вдаваться, то я хочу сделать способность, при касте которой, все юниты в радиусе от кастера попадают в "иллюзию", где для них Кастер красиво рассыпается на партиклы, в то время как реальный он бегает себе и лупит их всем чем есть за милую душу. При этом все, кто попал под иллюзию - видят только иллюзию, а все кто НЕ попал - видят только действующего кастера, но не видят остального.

Принятый ответ

Короче, поскольку кроме костылей ни вы, ни я ничего придумать не решили, вот моя реализация:
Герою дается двойной инвиз(не выходит из него при атаках и кастах), для всех игроков создается дамми с трусайтом с минимальным радиусом, с привязкой к владельцу кастера(по номеру игрока), и его двигает таймером за юнитом. Дамми НЕ создается для тех игроков, которые попали под иллюзию. Также им отключается шейрвижен, чтобы союзники НЕ попавшие в иллюзию, не палили кастера своей дамми-трусайтом.
Проще говоря, вместо того, чтобы дать инвиз против отдельных игроков, я дал всем игрокам трусайт, и только зацепленным - нет.
`
ОЖИДАНИЕ РЕКЛАМЫ...
11
16
5 лет назад
11
инвиз
0
19
5 лет назад
0
Неужели никто даже статей никаких не может покидать на эту тему? Вопрос вроде не новый, уверен многие ломались над этим...
0
26
5 лет назад
0
Видимость у одного юнита игрока=видимость для всех юнитов игрока. То есть попавший под действие иллюзии юнит будет видеть кастера, если его видят другие юниты игрока, либо союзники с общей видимостью.
То есть инвиз в данном случае не подходит, либо не знаю, как его применять.
1
16
5 лет назад
1
ну если он над союзниками издевается, то тут ничего не придумаешь
если над врагами, в мемхаке можно флаг неуязвимости к тру сайту поставить
0
23
5 лет назад
0
делаеш 2 юнит 1 прозрачный а другой оригинал для игрока оригинал для врагу прозрачный но есть такая проблема если не правильно обрашать десихр!
0
27
5 лет назад
Отредактирован MpW
0
на союзника используйте UnitShareVision
на врага применить иммунитет к детекту
код из хака
Обнаружение невидимых юнитов (все что связано с обзором и видимостью)
Есть близзардские boolean-нативки:
//IsUnitVisible - проверка: юнит видим ли игроком 
//IsUnitInvisible - проверка: невидим ли юнит для игрока
//IsItemVisible - проверка: итем видим
//IsLocationVisibleToPlayer или IsVisibleToPlayer - проверка видима ли точка игроком
//IsUnitDetected - юнит обнаружен игроком
все эти проверки выше "юнит видим ли игроком" и др не значат что юнит попал под обзор камеры игрока, и игрок видит в в данный момент. Нет это совсем другое. а то что игрок их может видеть)
"юнит обнаружен игроком" - это значит что попал под детектор игрока. А не в прямом смысле попал под обзор камеры игрока.

еще несколько близзардских нативок (действия):
UnitShareVision - поделиться/не делиться обзором юнита с другим игроком. Короче другой игрок видит, что делает чужой юнит. 
SetItemVisible - ShowUnit - ShowDestructable = спрятать или показать
далее код из хака
адреса флагов
    //достает адрес обнаружения юнита (это типа флага, что ваш юнит обнаружен)
    //кооперируется с другими offset-ами
    function GetUnitVisibilityClass takes unit u returns integer
        local integer a = ConvertHandle( u )
        local integer res = 0
        if a > 0 then
            set res = RMem( a + 0x130 )
            if res > 0 then
                set res = GetSomeAddressForAbility( res, RMem( a + 0x134 ) )
            endif
        endif
        return res
    endfunction

    //достает адрес обзора юнита (этот флаг показывает, с кем из игроков делит поле зрение)
    //кооперируется с другими offset-ами
    function GetUnitDetectedClass takes unit u returns integer
        local integer a = ConvertHandle( u )
        local integer res = 0
        if a > 0 then
            set res = RMem( a + 0x13C )
            if res > 0 then
                set res = GetSomeAddressForAbility( res, RMem( a + 0x140 ) )
            endif
        endif
        return res
    endfunction
проверка: делит ли юнит общий обзор с игроком
    //обычная проверка на видимость. 
    //помните: волшебный огонь у друида, он смотрит глазами врага, т.е. показывает то, что делает вражеский юнит на карте
    //еще такое можно добиться близардской функцией UnitShareVision
    function IsUnitDetectedByPlayer takes unit u, player p returns boolean
	//shared vision-like effect, used for Faerie fire / Wand of evil eye
	//have no reveal effect by itself, used only as detector?
        local integer a = GetUnitDetectedClass( u )
        if a > 0 then
            return IsFlagBitSet( RMem( a + 0x24 ), Player2Flag( p ) )
        endif
        return false
    endfunction
у игроков за видимость отвечают настройки союза. вот. обычно видит своих
вернуть/удалить детект
Проверял. Эта штука делает иммунным к детекту. Из-за этой херни много раз перепроверял. Короче кривовато работает. Иммунитет исчезает, если сам юнит или детекторы начнут двигаться относительно друг друга. Как только заново в поле зрение детектора попадаешь, то иммун сползает
    //Удалить детект с юнита (обнулить).
    //юнита u перестают обнаруживать вражеские детекторы
    function RemoveAnyDetectionFromUnit takes unit u returns nothing
        local integer a = ConvertHandle( u )
        if a > 0 then
            call WMem( a + 0x148, 0 )
            call WMem( a + 0x14C, 0 )
            set a = GetUnitVisibilityClass( u )
            if a > 0 then
                call WMem( a + 0x24, 0 )
            endif
        endif
    endfunction

   //Вернуть детект юниту
   //вашего юнита u могут обнаружить вражеские детекторы
    function RecountAnyDetectionForUnit takes unit u returns nothing
        local integer a = ConvertHandle( u )
        local integer sum = 0
        local integer i = 0
        if a > 0 then
            set a = GetUnitDetectedClass( u )
            if a > 0 then
                loop
                    if RMem( a + 0x2C + 4 * i ) > 0 then
                        set sum = sum + R2I( Pow( 2, i ) )
                    endif
                    set i = i + 1
                    exitwhen i > 15
                endloop
                call WMem( a + 0x14C, sum )
                call WMem( a + 0x148, sum )
                set sum = 0
                set i = 0
            endif
            set a = GetUnitVisibilityClass( u )
            if a > 0 then
                loop
                    if RMem( a + 0x2C + 4 * i ) > 0 then
                        set sum = sum + R2I( Pow( 2, i ) )
                    endif
                    set i = i + 1
                    exitwhen i > 15
                endloop
                call WMem( a + 0x24, sum )
            endif
        endif
    endfunction
Иммунитет к обнаружению инвизных
еще один похожий набор
//флаги москитов. За основу взят флаг москита. У москитов много флагов
    function GetSomeAddressForLocustFlags takes integer pAddr1 , integer pAddr2 returns integer
        local integer i = GetSomeAddress( pAddr1, pAddr2 )
        return RMem( i + 0x94 )
    endfunction

    function SetLocustFlags takes unit u, integer i returns nothing //These flags can make unit immune to truesight
        local integer pOff1
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            set LastConvertedHandle = LastConvertedHandle + 0x16C
            set pOff1 = GetSomeAddressForLocustFlags( RMem( LastConvertedHandle ), RMem( LastConvertedHandle + 4 ) )
            if pOff1 > 0 then
                call WMem( pOff1 + 0x34, i )
            endif
        endif
    endfunction

    //Включить иммунитет к обнаружению инвизных юнитов
    //Это означает, что детекторы не смогут обнаружить невидимого юнита u
    function EnableTruesightImmunity takes unit u returns nothing
    //I don’t really know what other side effects may be caused by this, at least GroupEnum is not affected
    //Я не знаю, какие другие побочные эффекты могут быть вызваны этим, по крайней мере GroupEnum не влияет
        call SetLocustFlags( u, 0x08000000 )
    endfunction

	//Выключить иммунитет к обнаружению инвиза
    function DisableTruesightImmunity takes unit u returns nothing
        call SetLocustFlags( u, 0 )
    endfunction
0
19
5 лет назад
0
Короче, поскольку кроме костылей ни вы, ни я ничего придумать не решили, вот моя реализация:
Герою дается двойной инвиз(не выходит из него при атаках и кастах), для всех игроков создается дамми с трусайтом с минимальным радиусом, с привязкой к владельцу кастера(по номеру игрока), и его двигает таймером за юнитом. Дамми НЕ создается для тех игроков, которые попали под иллюзию. Также им отключается шейрвижен, чтобы союзники НЕ попавшие в иллюзию, не палили кастера своей дамми-трусайтом.
Проще говоря, вместо того, чтобы дать инвиз против отдельных игроков, я дал всем игрокам трусайт, и только зацепленным - нет.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.