28

» WarCraft 3 / Как уменьшить кол-во даваемой exp за юнита

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

То есть крип первого уровня даст 25 * 0.8 = 20 ед. опыта, а вражеская боевая единица - 25 ед.
28

» WarCraft 3 / Что быстрее, искать индекс структуры через loop или хештаблицей?

у хештаблицы не (1)
В WCIII может и не O(1), но у нормальных хештаблиц есть регулирующее число, которое и определяет этот "почти O(1)".

Всё равно хеш в Jass быстрее цикла, в котором помимо обращения к ячейкам ещё и постоянный инкремент.
28

» WarCraft 3 / Что быстрее, искать индекс структуры через loop или хештаблицей?

Ну так у тебя сложность цикла O(n), а хештаблицы O(1). Очевидно, что хеш тут будет быстрее.
Если же юнит или предмет будет привязан к структуре, то тогда номер структуры можно сохранять в UserData.
28

» WarCraft 3 / Вопрос по Jass

Принятый ответ
nvc123:
ответ - в структурах не должно быть глобальных переменных
Ответ неверен. Внутри структуры не может быть блока globals, потому что это бессмысленно: все поля в структуре уже являются глобальными переменными.
struct MyStruct
    unit u // На самом деле будет создан глобальный массив юнитов.
    static unit u2 // Будет создана 1 глобальная переменная типа юнит.
endstruct

Skolz:
тема ещё не закрыта. Мне нужен ответ. А не статьи
Читай статьи и тестируй сам. Так получишь ответы на многие вопросы.
28

» WarCraft 3 / Триггерный автокаст?

Обращение в массив быстрее обращения в хеш, но юзай то, что больше нравится.
8gabriel8:
А вот для союзников восстановление маны может по каким-то причинам не произойти?
Если союзник имеет иммун к заклинаниям, то возможно.
28

» WarCraft 3 / Вопрос по Jass

function GetDistancePoints takes real x1, real y1, real x2, real y2 returns real
    return SquareRoot((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
endfunction

function GetDistanceUnitPoint takes unit u, real x, real y returns real
    local real dx = GetUnitX(u) - x
    local real dy = GetUnitY(u) - y
    return SquareRoot(dx * dx + dy * dy)
endfunction

function GetDistanceUnits takes unit u1, unit u2 returns real
    local real dx = GetUnitX(u1) - GetUnitX(u2)
    local real dy = GetUnitY(u1) - GetUnitY(u2)
    return SquareRoot(dx * dx + dy * dy)
endfunction
28

» WarCraft 3 / Как узнать на джассе есть ли у героя предмет или нет?

Кидаешь одну из версий UnitHasItemOfType в шапку, когда нужно будет использовать пишешь
if UnitHasItemOfType(caster,'Item') then
    // Нужные действия.
endif
28

» WarCraft 3 / Триггерный автокаст?

По второму пункту.
globals
    real Mana = 0.
    unit BadUnit = null
    real Range = 700.
    group CastGroup = CreateGroup()
endglobals

function Conditions takes nothing returns boolean
    local real mana = GetUnitState(GetFilterUnit(), UNIT_STATE_MANA)
    if inRange and mana > Mana then // Чтобы отсеять с наибольшей маной.
    // Чтобы отсеять с наименьшей, нужно написать mana < Mana и начальное значение Mana должно быть 999999.
    // Это значение также должно восстанавливаться после каста.
    // Аналогично и с расстоянием до феи.
        set Mana = mana
        set BadUnit = GetFilterUnit()
    endif
    return true
endfunction

function Trig_Cast_Actions takes nothing returns nothing
    local unit caster = GetSpellAbilityUnit()
    local real x = GetUnitX(caster)
    local real y = GetUnitY(caster)
    call GroupEnumUnitsInRange(CastGroup, x, y, Range, function Conditions)
    call GroupRemoveUnit(CastGroup, BadUnit)
    // Другие действия.
    call GroupClear(CastGroup)
    set caster = null
endfunction

// Функция для расстояния:
function GetDistancePoints takes real x1, real y1, real x2, real y2 returns real
    return SquareRoot((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
endfunction

function GetDistanceUnitPoint takes unit u, real x, real y returns real
    local real dx = GetUnitX(u) - x
    local real dy = GetUnitY(u) - y
    return SquareRoot(dx * dx + dy * dy)
endfunction

function GetDistanceUnits takes unit u1, unit u2 returns real
    local real dx = GetUnitX(u1) - GetUnitX(u2)
    local real dy = GetUnitY(u1) - GetUnitY(u2)
    return SquareRoot(dx * dx + dy * dy)
endfunction
28

» WarCraft 3 / Как узнать на джассе есть ли у героя предмет или нет?

Принятый ответ
native UnitHasItem takes unit whichUnit, item whichItem returns boolean
function UnitHasItemOfTypeBJ takes unit whichUnit, integer itemId returns boolean
    return GetInventoryIndexOfItemTypeBJ(whichUnit, itemId) > 0
endfunction

// Данная функция утечна, так как indexItem не обнуляется
function GetInventoryIndexOfItemTypeBJ takes unit whichUnit, integer itemId returns integer
    local integer index
    local item    indexItem

    set index = 0
    loop
        set indexItem = UnitItemInSlot(whichUnit, index)
        if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then
            return index + 1
        endif

        set index = index + 1
        exitwhen index >= bj_MAX_INVENTORY
    endloop
    return 0
endfunction
function UnitHasItemOfType takes unit whichUnit, integer itemId returns boolean
    local integer index = 0
    loop
        if GetItemTypeId(UnitItemInSlot(whichUnit, index)) == itemId then
            return true
        endif
        set index = index + 1
        exitwhen index == bj_MAX_INVENTORY
    endloop
    return false
endfunction

// Можно ещё так написать
function UnitHasItemOfType takes unit whichUnit, integer itemId returns boolean
    local integer index = 0
    loop
        exitwhen GetItemTypeId(UnitItemInSlot(whichUnit, index)) == itemId
        set index = index + 1
        exitwhen index == bj_MAX_INVENTORY
    endloop
    return index < bj_MAX_INVENTORY
endfunction
28

» WarCraft 3 / Преобразовать подстроку в реальное

Какое сообщение должно бы введено? Если "t 6", то тогда должно быть Подстрока(Строка чата, 3, 3) или Подстрока(Строка чата, 3, ДлинаСтроки(Строка чата)).
Символы в нашей строке: 't', ' ', '6'.
't' находится между 0 и 1, ' ' между 1 и 2, '6' находится между 2 и 3. Нам нужно вытащить '6', то есть нужно передать 2 и 3 как начало и конец подстроки соответственно, но из-за SubStringBJ, нужно передать 3 как начало подстроки.
function SubStringBJ takes string source, integer start, integer end returns string
    return SubString(source, start-1, end)
endfunction
28

» WarCraft 3 / Нахождение атаки героя

Сделать БД.
Был занят, не дописал. Можно определить, если сделать свою систему бонусов к урону и БД со стандартными значениями крона. Либо как сказал quq_CCCP.
28

» WarCraft 3 / Добавление способности в спеллбук тригером

8gabriel8:
PT153, а нельзя в спеллбуке поменять способность с помощью способности Техника?
Вот чего не знаю, того не знаю. Туториал, что я кинул, содержит далеко на все хитрости, потому многое нужно найти самому.
28

» WarCraft 3 / Добавление способности в спеллбук тригером

Естественно, я сначала прочел все что смог и только потом задал вопрос, так как мне ничего не подошло)
Создать 40 спелбуков - не проблема, на самом деле. Более того, так ты можешь отсеять ненужные заклинания, которые нельзя копировать. Минус в том, что лимит на копирование будет 11 способностей, если не удалять старые.
28

» WarCraft 3 / Добавление способности в спеллбук тригером

Нельзя добавить триггерно способность прямо в спелбук.
Читайте тут в пункте 1.24 как добавить в спелбук способность.
28

» WarCraft 3 / Исходный код MdlVis

bpl файлами
Что это за файлы такие? Я знаю только .blp. MdlVis работает только с моделями, да и то только с теми, которые имеют точки.
28

» WarCraft 3 / Лава

мне вот интересно, почему аж два дизлайка поймал в том посте о тупости BJ функций? Я же сказал как есть и это чистая правда.
Просто есть способность "Влияние", а почему кто-то поставил диз, не знаю, так-то написал ты всё верно. Поставил лайк)~Fakov:
гуй обеспечил низкий порог вхождения в мапмейкинг, а джасс придал этому мапмейкингу качества. Имхо.
Полностью согласен.
28

» WarCraft 3 / Лава

ты сейчас это просто из воздуха придумал чтобы "защитить GUI"?
И всё же это так. С этого всё началось, а потом...
28

» WarCraft 3 / Насчет ландшафта

Принятый ответ
Прикреплю торренты для нормального WC3. Также скачай JNPG:R с XGM, обнови pjass.exe и TESH.

Решение твое проблемы:
Ты делаешь кратер в точке X шириной Y и глубиной Z. Чтобы после его убрать, нужно сделать кратер в точке Х шириной Y и глубиной -Z.