2
29
2

» XGM Конкурсы / Warcraft III Mini-Game Contest-2018

вы явно представляете, как это лучше всего сделать)
Я уже сделал, только незашло((
0
29
0

» WarCraft 3 / Телепортация по областям в соответствии с координатами

придётся прочитать ВЕСЬ код, а не тупо названия методов
А где я говорил, что анонимные функции это панацея? В этом случае это применимо и работает, почему не да.
0
29
0

» XGM Конкурсы / Warcraft III Mini-Game Contest-2018

Хоть кто то призовые вообще получил?)
Пустота
0
29
0

» WarCraft 3 / Телепортация по областям в соответствии с координатами

конфликты имён решаются областями видимости.
В таком простом коде у меня не возникло примера с конфликтом имён.
Clamp:
Названия методов должны нести смысл
В методе уже есть смысл
TriggerAddCondition(t, Condition(function() -> boolean {

Напишите это же, в "хорошем" стиле написания, тогда уж сравним)))
0
29
0

» WarCraft 3 / Телепортация по областям в соответствии с координатами

просто омерзительный стиль всё что можно в анонимные функции пихать.
А чем при компиляции анонимная функция от обычной отличается? А так весь код читается сверху вниз и ненужно выдумывать названия функций.
0
29
0

» WarCraft 3 / Телепортация по областям в соответствии с координатами

Вам всеголишь нужно знать отношение между облатями.
Например:
игровая = 1000x500
измерение = 100х50
dx = ширина_измерения/ширина_игровой = 100/1000 = 0.1
dy = высота_измерения/высота_игровой = 50/500 = 0.1
Ну а дальше просто получаете x,y героя относительно левого верхнего угла игровой и телепортируете в
x1*dx
y1*dx
где x1,y1 левый верхний угол измерения.
Проще кодом объяснить
//! zinc
library Test {
    region R1, R2;
    real X1, Y1, X2, Y2, DX, DY, W1, W2, H1, H2;
    integer AbilityID = 'Aroa';

    function onInit(){
        trigger t = CreateTrigger();
        integer i;
        unit u = gg_unit_edoc_0000;
        
        FogEnable(false);
        FogMaskEnable(false);
        
        SelectUnit(u, true);
        PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0);
        
        X1 = GetRectMinX(gg_rct_R1);
        Y1 = GetRectMinY(gg_rct_R1);
        X2 = GetRectMinX(gg_rct_R2);
        Y2 = GetRectMinY(gg_rct_R2);
        W1 = GetRectMaxX(gg_rct_R1) - X1;
        W2 = GetRectMaxX(gg_rct_R2) - X2;
        H1 = GetRectMaxY(gg_rct_R1) - Y1;
        H2 = GetRectMaxY(gg_rct_R2) - Y2;
        
        R1 = CreateRegion();
        R2 = CreateRegion();
        RegionAddRect(R1, gg_rct_R1);
        RegionAddRect(R2, gg_rct_R2);
        
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        TriggerAddCondition(t, Condition(function() -> boolean {
            unit u = GetTriggerUnit();
            real x, y, dx, dy;
            boolean isMove = false;
            
            if (GetSpellAbilityId() == AbilityID){
                
                if (IsUnitInRegion(R1, u)){
                    dx = GetUnitX(u) - X1;
                    dy = GetUnitY(u) - Y1;
                    x = X2 + dx*W2/W1;
                    y = Y2 + dy*H2/H1;
                    isMove = true;
                }
                if (IsUnitInRegion(R2, u)){
                    dx = GetUnitX(u) - X2;
                    dy = GetUnitY(u) - Y2;
                    x = X1 + dx*W1/W2;
                    y = Y1 + dy*H1/H2;
                    isMove = true;
                }
                
                if (isMove){
                    SetUnitX(u, x);
                    SetUnitY(u, y);
                    PanCameraToTimed(x, y, 0);
                }
                
            }
            u = null;
            return false;
        }));
        
        BJDebugMsg("Используйте Рев для телепортации");
        
        t = null; u = null;
    }
}
//! endzinc
Загруженные файлы
0
29
0

» WarCraft 3 / ZinC: Гнев Деревьев AOE

Импале должен работать по идее.
Я тут проверял, следующий impale прерывает предыдущий, пришлось даммиков плодить.
0
29
0

» WarCraft 3 / Polar

Мне бы библиотеку для работы с векторами.
Я пока ещё с векторами не работал, как разберусь, напишу.
0
29
0

» WarCraft 3 / ZinC: Гнев Деревьев AOE

Хм, а с Chain Lighting это не работает.
Не со всеми заклинаниям это подходит. С impale тоже такие проблемы.
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

По объёму кода видно насколько проще.
Разверните все BJ в вашем примере и тогда сравним)
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

а в один прекрасный момент не заламывать руки
Я делаю проще и не пишу на гуях)
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

Потому что в GroupAddGroup() тоже есть эта проверка, а действие на выбор юнитов всех игроков использует эту функцию.
А какое дейтвие из гуи использует GroupAddGroup() внутри ForGroupBJ()?
2
29
2

» WarCraft 3 / Атака всех видимых врагов заклинанием

обработает лишь юнитов красного игрока
С чего бы это?
function ForGroupBJ takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call ForGroup(whichGroup, callback)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction
Загруженные файлы
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

И что тут сложного
//! zinc
library SpellDamageAllVisible {

    /* Настройки заклинания */
    
    constant integer SpellHero          = 'A000';   // Способность для героя.
    constant string SpellEffect         = "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl";
    constant string SpellEffectAttach   = "origin";
    
    constant attacktype DamageAttackType = ATTACK_TYPE_MAGIC;   /* Тип урона:
                                                                    ATTACK_TYPE_CHAOS
                                                                    ATTACK_TYPE_HERO
                                                                    ATTACK_TYPE_MAGIC
                                                                    ATTACK_TYPE_MELEE
                                                                    ATTACK_TYPE_NORMAL
                                                                    ATTACK_TYPE_PIERCE
                                                                    ATTACK_TYPE_SIEGE
                                                                */
    
    // Указываем количество нанесённого урона
    function getDamage(integer level) -> integer {
        return level * 100;
    }
  
    /* ВСЁ, ЧТО НИЖЕ, ПРАВИТЬ НА СВОЙ СТРАХ И РИСК!!! */
    function onInit(){
        trigger t = CreateTrigger();
        integer i;
        
        for (0 <= i < bj_MAX_PLAYER_SLOTS) {
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        TriggerAddCondition(t, Condition( function() -> boolean { return SpellHero == GetSpellAbilityId(); }));
        TriggerAddAction(t, function(){
            group g = CreateGroup();
            unit target, caster = GetTriggerUnit();
            integer level = GetUnitAbilityLevel(caster, SpellHero);
            
            GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, Condition(function() -> boolean {
                return GetWidgetLife(GetFilterUnit()) >= 0.405;
            }));
           
            while (true) {
                target = FirstOfGroup(g);
                if (target == null) { break; }
                if (
                    IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target))
                    &&
                    IsUnitVisible(target, GetOwningPlayer(caster))
                ) {
                    DestroyEffect(AddSpecialEffectTarget(SpellEffect, target, SpellEffectAttach));
                    UnitDamageTarget(caster, target, getDamage(level), true, false, DamageAttackType, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS);                
                }
    
                GroupRemoveUnit(g, target);
            }
            
            DestroyGroup(g);
            g = null; caster = null;
        });

        t = null;
    }
}
//! endzinc
8gabriel8:
Странно вы группы удаляете, обычно перед перебором
set bj_wantDestroyGroup = true
Загруженные файлы
0
29
0

» WarCraft 3 / Иконки на заказ

Кто не поленится сделать из этого изображения иконку?
Button Manager и можете клепать иконки из изображений хоть целый день)
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

Но проверь и ты, вдруг я где-то накосячил.
Я вот точно помню, что есть n+ подводных камней с видимотью на баффах. К сожалению сейчас просто нет времени, но самому интересно, потещу)
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

Да нет, с невидимость проверяет.
Если руки дойдут, потещу.
0
29
0

» Администрация XGM / Реклама на сайте

PT153:
Было пару раз, особенно с телефона.
Это я у дружище с инкогнито последнего хрома.
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

у меня работало и с невидимостью вроде как
Буду за компом, сделаю тесты. Самому интересно.
0
29
0

» WarCraft 3 / Атака всех видимых врагов заклинанием

Вкратце, необходима проверка Unit is Visible for .
Проверяет только Fog of War, нужно проверять все баффы невидимости, которых, к счастью, не так уж и много.
0
29
0

» The movement of the stars / Давайте поговори подробнее о...

Что вообще готово?
Присоединяюсь. Как бы проэкт не превратился в очередной долгострой((
2
29
2

» The movement of the stars / Нужна помощь проекту

Или смиритесь с моделью обычного варкрафтовского крестьянина
Только текстуру измените)
0
29
0

» The movement of the stars / Давайте поговори подробнее о...

Silverwing:
Можно будет ему подложить отравленную еду
Тогда остался самый главный вопрос, когда дэмку можно пощупать будет?)
0
29
0

» WarCraft 3 / Заказы на ландшафт

Здравствуйте, уважаемые ландшафтеры.
Нужен ландшафт/декор к проэкту.
  • Размер карты: 128x128
  • Тип ландшафта: любой не вырвиглазный
  • Климат/Природа: неважно
  • Стиль: свободный
  • Импорт: ~4мб
Единственное требование это симметричность проходимых участков карты и сохранение концепции трёх корридоров.
В качестве вознаграждения могу покодить вам заклинаний.
0
29
0

» The movement of the stars / Давайте поговори подробнее о...

Убивать НПС можно будет в поздних версиях
А можно будет подбросить НПС в карман динамиту, как в Arcanum было?