32

» WarCraft 3 / Отловить продажу предмета покупателю-продавцу

По приказу и событию Ресурсы игрока изменились, мне почему то это очень напомнило одну наработку найма героев на подобии мода RD в DOTA, там было реализовано на основе способности поставка ресурсов + событие, юнит отдал приказ кастануть поставку ресурсов то
Создать триггер и добавить в него событие Золота игрока стало меньше чем было для каждого играющего игрока, у кого было стало меньше золота, тот игрок и выбрал героя.
Думаю тут можно отследить покупку точно таким же образом.
32

» WarCraft 3 / О оптимизации

nvc123:
зависит от многих параметров
во первых нужно муи или нет
если муи то несколько с кучей могут привести к тому что кастанётся лишь 1 из спелов (ибо дамик может выполнить лишь 1 приказ одновременно)
во вторых
как часто применяются спеллы
если часто то выгоднее создать вначале даммика и держать вечно
иначе выгоднее создавать/удалять дамиков при необходимости
и ещё много всего
но как правило Много дамми юнитов с 1 спеллом выгоднее
Не совсем, некоторые приказы таки выполняются мгновенно, но большинство требует времени.
'Aslo' Slow (замедление) можно кастовать одним даммиком на всю группу юнитов сразу, а вот с молотком бурь такое не прокатит.
Дамми юнитам можно добавлять и удалять способности когда вздумается, не понимаю зачем тебе 100500 дамми и у каждого 1 или 10 скиллов?.
Для некоторых целей можно использовать 1 даммика , с заранее заготовленным скиллом - к примеру для проверки можно ли атаковать юнита в данный момент?
32

» WarCraft 3 / Вспоминая битву червей

Периодический таймер на 0.50 секунды, заставляет всех юнитов в массиве идти друг за другом.
32

» WarCraft 3 / Обнуление переменной типа группа

Clamp:
quq_CCCP, вот тебе кейс: урон наносится через 3 секунды после каста всем, кто был в радиусе. С общей глобальной группой это значит, что спелл non-mui, что есть плохо.
Ну причем тут отсроченные действия в группе? Я про мгновенные энумы, для всего остального есть ресайкл груп GroupUttils - ссылочка ( xgm.guru/p/wc3/venomanser )
32

» WarCraft 3 / Оставляют ли руны после себя мусор

Все предметы оставляют, если их не уничтожать.
С рунами\книгами и всеми PowerUp предметами нужно проделывать::
	call RemoveItem( ItemBeginMani[ulated() )
Сразу после тока как их подобрал герой.
32

» WarCraft 3 / Обнуление переменной типа группа

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

» WarCraft 3 / Исправьте ошибки

Что за копипаст? Фигня какая то, напиши здесь что тебе нужно!
У тебя там ничего правильного нет, какой то копипаст примитивного диалога выбора, тебе нужно выбрать героев с помощью диалога - опиши очень подробно про то как ты видишь эту систему пика, мы поможем с реализацией.
Вопросы по функциям есть в статьях.
32

» WarCraft 3 / Удалить предмет и дать игроку его цену в золоте

Странно, я же где то видел карту с кастом коммон ж, мб там getunitcost юзали и для итемов.
32

» WarCraft 3 / ИИ не кастует автоматом

Конечно не кастуют, ии получает приоритет исходя из того кто большее всех дерется, кто напал или убивает союзника тот и есть наиболее подходящая цель.
Триггерно проверять нет ли в пределах досигаймости юнита без баффа, если есть то пытатся кастануть в него некоторый скилл - к примеру проклятие банши.
32

» WarCraft 3 / Удалить предмет и дать игроку его цену в золоте

Есть вариант попроще, импортный common.j с аи нативками, была как то тема - суть в ии скриптах есть функции позволяющие узнать что по чем, хаков не требуется.
32

» WarCraft 3 / Апгрейд способности отдельного здания

Ну а что мешает сделать все триггерно без Апгрейдов, просто сувать башне нужную способность, или изменять уровень способности - у способностей то уровень уменьшается на ура.
32

» WarCraft 3 / Улучшение требует места в инвентаре

Какие улучшения? Ты про продажу предметов? Нужно делать на основе рун, руны пропадают при покупке и не требуют места в инвентаре.
32

» WarCraft 3 / Отследить Fatal Error

Ну есть же логи, через прелоад сохраняют.
Смотрите что происходило в момент фатала, какие юзались скиллы, кто что делал, следите за дамми юнитами.
Вот наработка xgm.guru/p/wc3/ifdebug-2
Так же было бы не лишним внести карту в студию, мб все очень банально?
32

» WarCraft 3 / Как сменить анимацию юнита?

Ну тока пассивками, которые срабатывают при атаке, но те обычно проигрывают slam анимацию.
Так же может быть 100500 разных моделей.
32

» WarCraft 3 / Есть ли предел/потеря производительности от дофига ивентов

События не удаляются, пока есть объект на котором они весят, но это просто целые числа, ничего они не забивают, яркий пример дота ( там еще и утечек по части триггеров куча) но катки по 70-80 мин. И все норм, на 100+ минут катках спектра и войд багается, и то из за кривого ресайкла групп.
Это в кривой доте Фрога, делаешь по человечески и все работает, а не как криворукий - создал триггер и оставил выключенным висеть.
Вот пример ссылочка по триггерам и их удалении на примере фрога, а так же проблемы связанные с триггерами.
Вроде же все разжевано на эту тему?
Или нужно что то еще?
32

» WarCraft 3 / Система отлова нанесённого урона

WakVellios:
Какая команда получает боевую еденицу получившую урон?
GetTriggerUnit()
JASS API в помощь.
32

» WarCraft 3 / Запомнить любую нужную точку на карте

Ну можно координаты камеры игрока. Но там нужен синк в кеше, чтобы небыло десинха, а это уже ни ГУИ.
Вот примитивный пример получение и сохранения координат камеры игрока:
scope PlayerRelated initializer InitPlayers

    globals
        force AllPlayers = null
        trigger gg_trg_PlayerLeft = null
        playerevent bj_enumPlayerEventId = null
        player array PL
        gamecache data
    endglobals

    function TriggerRegisterPlayerEventEnum takes nothing returns nothing
        call TriggerRegisterPlayerEvent( bj_destInRegionDiesTrig, GetEnumPlayer( ), bj_enumPlayerEventId )
    endfunction
    
    function TriggerRegisterForceEvent takes trigger trig, force forforce, playerevent id returns nothing
        set bj_destInRegionDiesTrig = trig
        set bj_enumPlayerEventId = id
        call ForForce( forforce, function TriggerRegisterPlayerEventEnum )
    endfunction
 
    function Trig_Player_Left_Actions takes nothing returns nothing
        call ForceRemovePlayer( AllPlayers, GetTriggerPlayer( ) )
    endfunction
    
    function IsSlotPlayer takes player pl returns boolean
        return GetPlayerSlotState( pl ) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController( pl ) == MAP_CONTROL_USER
    endfunction
    

    function InitPlayers takes nothing returns nothing
        set AllPlayers = CreateForce( )
        set gg_trg_PlayerLeft = CreateTrigger( )
        set data = InitGameCache( "Data.w3v" )
        
        set bj_forLoopAIndex = 0
        
        loop
        
            exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
        
            set PL[bj_forLoopAIndex] = Player( bj_forLoopAIndex )
            if IsSlotPlayer( PL[bj_forLoopAIndex] ) then
                call ForceAddPlayer( AllPlayers, PL[bj_forLoopAIndex] )
                call TriggerRegisterPlayerEvent( gg_trg_PlayerLeft, PL[bj_forLoopAIndex] , EVENT_PLAYER_LEAVE )
            endif
        
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
    
        call TriggerAddAction( gg_trg_PlayerLeft, function Trig_Player_Left_Actions )
    
    endfunction
endscope

function Trig_Get_Player_Screen_Cord_Conditions takes nothing returns boolean
    return true
endfunction

function Trig_Get_Player_Screen_Cord_Actions takes nothing returns nothing
    local player pl = GetTriggerPlayer( )
    local real dx = 0.00
    local real dy = 0.00

    
    if GetLocalPlayer( ) == pl then
        set dx = GetCameraEyePositionX( )
        set dy = GetCameraEyePositionY( )
    else
        set dx = 0.00
        set dy = 0.00
    endif

    call StoreReal( data, "Cord", "X", dx )
    call StoreReal( data, "Cord", "Y", dy )
    
    call TriggerSyncStart( )
    
    if GetLocalPlayer( ) == pl then
        call SyncStoredReal( data, "Cord", "X" )
        call SyncStoredReal( data, "Cord", "Y" )
    endif
    
    call TriggerSleepAction( 2.00 )

    call TriggerSyncReady( )
    
    set dx = GetStoredReal( data, "Cord", "X" )
    set dy = GetStoredReal( data, "Cord", "Y" )
    
    // далее делаем с коорданатами камеры что хочется!
    call PingMinimapEx( dx, dy, 3.00, 255, 255, 255, true )

endfunction

//===========================================================================
function InitTrig_Get_Player_Screen_Cord takes nothing returns nothing
    set gg_trg_Get_Player_Screen_Cord = CreateTrigger( )
    
    set bj_forLoopAIndex = 0
    
    loop
        exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
    
        if IsPlayerInForce( PL[bj_forLoopAIndex], AllPlayers ) then
            call TriggerRegisterPlayerChatEvent( gg_trg_Get_Player_Screen_Cord, PL[bj_forLoopAIndex], "-GetCord", true )
        endif
    
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    
    call TriggerAddCondition( gg_trg_Get_Player_Screen_Cord, Condition( function Trig_Get_Player_Screen_Cord_Conditions ) )
    call TriggerAddAction( gg_trg_Get_Player_Screen_Cord, function Trig_Get_Player_Screen_Cord_Actions )
endfunction
32

» WarCraft 3 / Передача параметров в Таймер

JaBeN_Симфер:
Нафиг это гомно, сразу хештаблицу и все, темболее этот эксплоит не работает с переодическими твймерами, а не малое количество паразиьных действий намекает на низкую скорость этого алгоритма.
32

» WarCraft 3 / Вопрос по поводу лагов

FarFacer:
quq_CCCP:
Не лагает, а загружается дольше - это да, лаги в мультиплеере связаны не с картой а с говвеным пингом до хоста, из за задержек и постоянных дисконектов.
А если лагает, то это скорее от хуёвого кода, моделей и т.д.?
Ну если начинает лагать через какое то время даже в сингле = код гомно.
Модели надо подгружать, ну неужели вы не слышали об этом?
32

» WarCraft 3 / Вопрос по поводу лагов

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