Новые нативные функции в 1.29

Добавлен , опубликован
В вышедшем сегодня патче для Warcraft III помимо огромного количества правок баланса и соревновательных карт была включена целая гора новых нативных JASS-функций (без малого почти сотня). Некоторые из них являются более удобными версиями уже бывшего доступным функционала, но большинство несут совершенно новые возможности, до сих пор бывшие недоступными простому смертному картоделу.
В общем, ознакамливайтесь и радуйтесь! Ну или не радуйтесь. Сами уж как-нибудь разберётесь.
type mousebuttontype extends handle

constant native GetBJMaxPlayers             takes nothing returns integer
constant native GetBJPlayerNeutralVictim    takes nothing returns integer
constant native GetBJPlayerNeutralExtra     takes nothing returns integer
constant native GetBJMaxPlayerSlots         takes nothing returns integer
constant native GetPlayerNeutralPassive     takes nothing returns integer
constant native GetPlayerNeutralAggressive  takes nothing returns integer

constant integer            PLAYER_NEUTRAL_PASSIVE              = GetPlayerNeutralPassive()
constant integer            PLAYER_NEUTRAL_AGGRESSIVE           = GetPlayerNeutralAggressive()

constant mousebuttontype    MOUSE_BUTTON_TYPE_LEFT              = ConvertMouseButtonType(1)
constant mousebuttontype    MOUSE_BUTTON_TYPE_MIDDLE            = ConvertMouseButtonType(2)
constant mousebuttontype    MOUSE_BUTTON_TYPE_RIGHT             = ConvertMouseButtonType(3)

constant playerevent        EVENT_PLAYER_MOUSE_DOWN             = ConvertPlayerEvent(269)
constant playerevent        EVENT_PLAYER_MOUSE_UP               = ConvertPlayerEvent(270)
constant playerevent        EVENT_PLAYER_MOUSE_MOVE             = ConvertPlayerEvent(271)

constant playerunitevent    EVENT_PLAYER_UNIT_SELL              = ConvertPlayerUnitEvent(272)
constant playerunitevent    EVENT_PLAYER_UNIT_CHANGE_OWNER      = ConvertPlayerUnitEvent(273)
constant playerunitevent    EVENT_PLAYER_UNIT_SELL_ITEM         = ConvertPlayerUnitEvent(274)
constant playerunitevent    EVENT_PLAYER_UNIT_SPELL_CHANNEL     = ConvertPlayerUnitEvent(275)
constant playerunitevent    EVENT_PLAYER_UNIT_SPELL_CAST        = ConvertPlayerUnitEvent(276)
constant playerunitevent    EVENT_PLAYER_UNIT_SPELL_EFFECT      = ConvertPlayerUnitEvent(277)
constant playerunitevent    EVENT_PLAYER_UNIT_SPELL_FINISH      = ConvertPlayerUnitEvent(278)
constant playerunitevent    EVENT_PLAYER_UNIT_SPELL_ENDCAST     = ConvertPlayerUnitEvent(279)
constant playerunitevent    EVENT_PLAYER_UNIT_PAWN_ITEM         = ConvertPlayerUnitEvent(280)

constant unitevent          EVENT_UNIT_SELL                     = ConvertUnitEvent(289)
constant unitevent          EVENT_UNIT_CHANGE_OWNER             = ConvertUnitEvent(290)
constant unitevent          EVENT_UNIT_SELL_ITEM                = ConvertUnitEvent(291)
constant unitevent          EVENT_UNIT_SPELL_CHANNEL            = ConvertUnitEvent(292)
constant unitevent          EVENT_UNIT_SPELL_CAST               = ConvertUnitEvent(293)
constant unitevent          EVENT_UNIT_SPELL_EFFECT             = ConvertUnitEvent(294)
constant unitevent          EVENT_UNIT_SPELL_FINISH             = ConvertUnitEvent(295)
constant unitevent          EVENT_UNIT_SPELL_ENDCAST            = ConvertUnitEvent(296)
constant unitevent          EVENT_UNIT_PAWN_ITEM                = ConvertUnitEvent(297)


//===================
// Player input
//===================

native GetTriggerPlayerMouseX               takes nothing returns real
native GetTriggerPlayerMouseY               takes nothing returns real
native GetTriggerPlayerMousePosition        takes nothing returns location
native GetTriggerPlayerMouseButton          takes nothing returns mousebuttontype


//===================
// Items UI
//===================

native SetItemName                          takes item whichItem, string name returns nothing
native SetItemDescription                   takes item whichItem, string name returns nothing
native SetItemTooltip                       takes item whichItem, string name returns nothing
native SetItemExtendedTooltip               takes item whichItem, string name returns nothing
native SetItemIconPath                      takes item whichItem, string name returns nothing

native GetItemDescription                   takes item whichItem returns string
native GetItemTooltip                       takes item whichItem returns string
native GetItemExtendedTooltip               takes item whichItem returns string
native GetItemIconPath                      takes item whichItem returns string


//===================
// Abils
//===================

    // Stats

native GetAbilityManaCost                   takes integer abilId, integer level returns integer
native GetAbilityCooldown                   takes integer abilId, integer level returns real

    // Text

native SetAbilityTooltip                    takes integer abilCode, string tooltip, integer level returns nothing
native SetAbilityOnTooltip                  takes integer abilCode, string tooltip, integer level returns nothing
native SetAbilityExtendedTooltip            takes integer abilCode, string ExtendedTooltip, integer level returns nothing
native SetAbilityOnExtendedTooltip          takes integer abilCode, string ExtendedTooltip, integer level returns nothing
native SetAbilityResearchTooltip            takes integer abilCode, string researchTooltip, integer level returns nothing
native SetAbilityResearchExtendedTooltip    takes integer abilCode, string researchExtendedTooltip, integer level returns nothing

native GetAbilityTooltip                    takes integer abilCode, integer level returns string
native GetAbilityOnTooltip                  takes integer abilCode, integer level returns string
native GetAbilityExtendedTooltip            takes integer abilCode, integer level returns string
native GetAbilityOnExtendedTooltip          takes integer abilCode, integer level returns string
native GetAbilityResearchTooltip            takes integer abilCode, integer level returns string
native GetAbilityResearchExtendedTooltip    takes integer abilCode, integer level returns string

    // Button

native SetAbilityIcon                       takes integer abilCode, string iconPath, integer level returns nothing
native SetAbilityOnIcon                     takes integer abilCode, string iconPath returns nothing
native SetAbilityPosX                       takes integer abilCode, integer x returns nothing
native SetAbilityPosY                       takes integer abilCode, integer y returns nothing
native SetAbilityOnPosX                     takes integer abilCode, integer x returns nothing
native SetAbilityOnPosY                     takes integer abilCode, integer y returns nothing

native GetAbilityIcon                       takes integer abilCode, integer level returns string
native GetAbilityOnIcon                     takes integer abilCode returns string
native GetAbilityPosX                       takes integer abilCode returns integer
native GetAbilityPosY                       takes integer abilCode returns integer
native GetAbilityOnPosX                     takes integer abilCode returns integer
native GetAbilityOnPosY                     takes integer abilCode returns integer


//===================
// Unit
//===================

    // Stats

native SetUnitArmor                         takes unit whichUnit, real armorAmount returns nothing
native SetUnitMaxHP                         takes unit whichUnit, integer hp returns nothing
native SetUnitMaxMana                       takes unit whichUnit, integer mana returns nothing
native SetUnitBaseDamage                    takes unit whichUnit, integer baseDamage, integer weaponIndex returns nothing
native SetUnitDiceNumber                    takes unit whichUnit, integer diceNumber, integer weaponIndex returns nothing
native SetUnitDiceSides                     takes unit whichUnit, integer diceSides, integer weaponIndex returns nothing
native SetUnitAttackCooldown                takes unit whichUnit, real cooldown, integer weaponIndex returns nothing

native GetUnitArmor                         takes unit whichUnit returns real
native GetUnitMaxHP                         takes unit whichUnit returns integer
native GetUnitMaxMana                       takes unit whichUnit returns integer
native GetUnitBaseDamage                    takes unit whichUnit, integer weaponIndex returns integer
native GetUnitDiceNumber                    takes unit whichUnit, integer weaponIndex returns integer
native GetUnitDiceSides                     takes unit whichUnit, integer weaponIndex returns integer
native GetUnitAttackCooldown                takes unit whichUnit, integer weaponIndex returns real

native GetUnitCollisionSize                 takes unit whichUnit returns real
native GetLocalUnitZ                        takes unit whichUnit returns real

native SetUnitName                          takes unit whichUnit, string name returns nothing
native SetUnitNameAll                       takes unit whichUnit, string name returns nothing
native SetHeroProperName                    takes unit whichUnit, string name returns nothing

    // Abils

native SetUnitAbilityCooldown               takes unit whichUnit, integer abilId, integer level, real cooldown returns nothing
native GetUnitAbilityCooldown               takes unit whichUnit, integer abilId, integer level returns real
native GetUnitAbilityCooldownRemaining      takes unit whichUnit, integer abilId returns real
native EndUnitAbilityCooldown               takes unit whichUnit, integer abilCode returns nothing

native GetUnitAbilityManaCost               takes unit whichUnit, integer abilId, integer level returns integer

native UnitHideAbility                      takes unit whichUnit, integer abilId, boolean flag returns nothing
native UnitDisableAbility                   takes unit whichUnit, integer abilId, boolean flag, boolean hideUI returns nothing
native DeleteHeroAbility                    takes unit whichUnit, integer abilCode returns nothing

    // Misc.

native UnitInterruptAttack                  takes unit whichUnit returns nothing
native UnitCancelTimedLife                  takes unit whichUnit returns nothing

native IsUnitSelectable                     takes unit whichUnit returns boolean
native IsUnitInvulnerable                   takes unit whichUnit returns boolean


//===================
// Special effect
//===================

    // Appearance

native SetSpecialEffectColorByPlayer        takes effect whichEffect, player whichPlayer returns nothing
native SetSpecialEffectColor                takes effect whichEffect, integer r, integer g, integer b returns nothing
native SetSpecialEffectAlpha                takes effect whichEffect, integer alpha returns nothing
native SetSpecialEffectScale                takes effect whichEffect, real scale returns nothing
native SetSpecialEffectHeight               takes effect whichEffect, real height returns nothing
native SetSpecialEffectTimeScale            takes effect whichEffect, real timeScale returns nothing
native SetSpecialEffectTime                 takes effect whichEffect, real time returns nothing

    // Position

native SetSpecialEffectX                    takes effect whichEffect, real x returns nothing
native SetSpecialEffectY                    takes effect whichEffect, real y returns nothing
native SetSpecialEffectZ                    takes effect whichEffect, real z returns nothing
native SetSpecialEffectPosition             takes effect whichEffect, real x, real y, real z returns nothing
native SetSpecialEffectPositionLoc          takes effect whichEffect, location loc returns nothing

native GetLocalSpecialEffectX               takes effect whichEffect returns real
native GetLocalSpecialEffectY               takes effect whichEffect returns real
native GetLocalSpecialEffectZ               takes effect whichEffect returns real

native SetSpecialEffectOrientation          takes effect whichEffect, real yaw, real pitch, real roll returns nothing
native SetSpecialEffectYaw                  takes effect whichEffect, real yaw returns nothing
native SetSpecialEffectPitch                takes effect whichEffect, real pitch returns nothing
native SetSpecialEffectRoll                 takes effect whichEffect, real roll returns nothing

    // Playback

native PlaySpecialEffect                    takes effect whichEffect, integer anim returns nothing
native PlaySpecialEffectWithTimeScale       takes effect whichEffect, integer anim, real timeScale returns nothing


//===================
// Misc.
//===================

native SetEventDamage                       takes real damage returns nothing

native AutomationTestStart                  takes string testName returns nothing
native AutomationTestEnd                    takes string testName returns nothing

constant native IncPlayerTechResearched     takes player whichPlayer, integer techid, integer levels returns nothing
constant native DecPlayerTechResearched     takes player whichPlayer, integer techid, integer levels returns nothing


//===================
// Not yet impl.
//===================

// native GetUnitMovementType               takes unit whichUnit returns integer
// native SetUnitMovementType               takes unit whichUnit, integer movementType returns nothing
// native GetUnitArmorType                  takes unit whichUnit returns integer
// native SetHeroStatEx                     takes unit whichHero, integer whichStat, integer statValue, boolean permanent returns nothing
// native GetHeroPrimaryStat                takes unit whichHero returns integer
// native GetHeroPrimaryStatById            takes unit whichHero returns integer
// native GetHeroStat                       takes unit whichHero, integer whichStat, boolean includeBonuses returns integer

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
18
6 лет назад
0
Если выбрать юнита, то это будет считаться кликом мышью?
Если да, то запрос координат мыши вернёт координаты юнита?
8
20
6 лет назад
8
Можно отслеживать координаты экрана создавая дамми в центре и беря его координаты в карте и координаты мыши в карте.
Возможен новый тип кликалок. Теперь мы не кликаем на юнита, а рисуем ему препятствия, разрезаем мышкой пополам и тп, отталкиваем курсором. Это сколько можно придумать для жанра миниигр. Прелесть!
Я даже подумал, что сборный интерфейс так можно реализовать. Расталкиваем мышью по углам плоские юниты-картинки и сохраняем их положение относительно центра экрана.
А ещё нонтаргет абилки! Вашу Машу. С помощью банальной линейной функции.
А ещё можно устанавливать имя юнитов. Это ж новый жанр. Все накликиваемые вражеские юниты получают имя Игорь. Если игрок кликнул на своего Игоря, то он становится Васей. Каждые 15 секунд все Игори умирают. Победил тот, у кого остался хоть один юнит.
Или генерация рандомных итемов. Если у итема такая-то иконка сделать то-то.
Взять описание итема сумка, разбить строки по спецсимволам, вычислить какой предмет там описан и учесть его цену при продаже. Теперь не нужно создавать 10 предметов для торговли, хватит БД цен и описания предмета.
Упрощается генерация предмета с помощью невидимого спелбука. Ведь можно генерировать описания и иконки! Мощно.
0
21
6 лет назад
Отредактирован awesomesk1ll
0
avuremybe:
awesomesk1ll, какие могут быть клики на UI, если там world координаты?
Я спросил отрабатывается евент или нет. И что, что координаты world ? :D
DemonoiD:
Можно отслеживать координаты экрана создавая дамми в центре и беря его координаты в карте и координаты мыши в карте.
Возможен новый тип кликалок. Теперь мы не кликаем на юнита, а рисуем ему препятствия, разрезаем мышкой пополам и тп, отталкиваем курсором. Это сколько можно придумать для жанра миниигр. Прелесть!
Я даже подумал, что сборный интерфейс так можно реализовать. Расталкиваем мышью по углам плоские юниты-картинки и сохраняем их положение относительно центра экрана.
А ещё нонтаргет абилки! Вашу Машу. С помощью банальной линейной функции.
А ещё можно устанавливать имя юнитов. Это ж новый жанр. Все накликиваемые вражеские юниты получают имя Игорь. Если игрок кликнул на своего Игоря, то он становится Васей. Каждые 15 секунд все Игори умирают. Победил тот, у кого остался хоть один юнит.
Или генерация рандомных итемов. Если у итема такая-то иконка сделать то-то.
Взять описание итема сумка, разбить строки по спецсимволам, вычислить какой предмет там описан и учесть его цену при продаже. Теперь не нужно создавать 10 предметов для торговли, хватит БД цен и описания предмета.
Упрощается генерация предмета с помощью невидимого спелбука. Ведь можно генерировать описания и иконки! Мощно.
Про координаты не понял, раньше же и так можно ловить координаты приказа Move или Spell, так что про кликалки новые не понятно. Не, учитывая возможность использования левой и правой кнопки мыши конечно сулит новые возможности, но это мизер вообще. Нонтаргет абилки тоже были же.
В остальном да, классные введения, хотя хотелось бы бОльшего. В частности Custom UI, возможность нанесения на миникарту своих иконок например.. (динамических, статические очевидно и сейчас нарисовать можно).
Maniac_91:
Если выбрать юнита, то это будет считаться кликом мышью?
Если да, то запрос координат мыши вернёт координаты юнита?
Очевидно что да, этот евент тоже должен сработать.
Логично предположить, что нет, должны возвращаться координаты удара raycast в землю в точке клика с viewport (т.е точка не должна совпадать с координатами юнита)
0
20
6 лет назад
0
awesomesk1ll, смотри, делаем даммик в центре области экрана игрока. Берём его координату.
Берём координату курсора. Вычитаем одно из другого, получаем отклонение курсора от центра экрана, т.е экранную координату. Следственно, если есть экранная координата - можно запилить шутан.
Проверяем юнитов в области от курсора - можно их от туда оттолкнуть, повесить баф/дебаф.
Можно замерять таймером координаты перемещения мыши каждые 0.01 секунд. Тем самым получая скорость её перемещения. И в зависимости от этого увеличивать силу отброса-дебафа юнитов.
Можно создать бензопилы, которые стремятся лететь к курсору.
Создание союзных юнитов при клике мышью, которые воюют с врагами.
Можно устроить выбор спела от поворота колесика мыши.
Вот тебе и миниигра с 5 различными механиками победы. Не говоря уже о комбинациях этих подходов:
ведем курсором рядом с юнитом, чтобы его поджечь, горящий юнит при клике на него взрывается.
При клике правой кнопкой мыши юнит подмерзает, при клике левой - раскалывается на куски.
3
30
6 лет назад
Отредактирован Clamp
3
Строго говоря, возможность отслеживать world-координаты клика мышкой уже давно существует, причём что правой кнопкой, что левой, но при этом приходилось отказываться от использования практически всего интерфейса. Реализовывалось через ForceUIKey(string key), по сути юнит всё время пытался начать кастовать абилку, и отлавливались координаты каста. Использовалось, например, в TCX.

делаем даммик в центре области экрана игрока
Как?
0
21
6 лет назад
0
DemonoiD:
awesomesk1ll, смотри, делаем даммик в центре области экрана игрока. Берём его координату.
Берём координату курсора. Вычитаем одно из другого, получаем отклонение курсора от центра экрана, т.е экранную координату. Следственно, если есть экранная координата - можно запилить шутан.
Получить координату от центра экрана и раньше можно было, там только нужно синкать коорды таргета камеры. Ещё встает вопрос отрисовки игровой камеры на разных соотношениях экрана, как я понимаю в 1.29 можно видеть больше/меньше в зависимости от скринсайза.
0
30
6 лет назад
Отредактирован Clamp
0

Вычитаем одно из другого, получаем отклонение курсора от центра экрана, т.е экранную координату.
А, понял идею управления. Есть очевидное слабое место, но я не вполне понимаю, что ты имеешь в виду под "шутаном" (без возможности вращать мышкой камеру при зафиксированном пивоте), может статься, что это слабое место и вовсе не влияет.

А, да, забыл описать. Проблема в том, что указывая на небо, ты будешь получать (0.0, 0.0).

И вторая проблема в том, что разрешение у всех разное.

вычислить какой предмет там описан и учесть его цену при продаже
Вот это жёсткий оверинжинеринг, конечно. :D

Можно замерять таймером координаты перемещения мыши каждые 0.01 секунд.
Нельзя, для этого надо синхронизировать игроков каждые 0.01 секунды.
Хотя хз, это моё предположение (т.к. мышь локальна, её координаты тоже локальны и синкаются N раз в секунду), но проверить не могу.
0
20
6 лет назад
0
Clamp, EVENT_PLAYER_MOUSE_MOVE. Можно без клика отследить. Главное чтоб движение было.
awesomesk1ll, тебе пофиг какая ширина. Тебе нужно смещать центр камеры к курсору, а не отдаляться от центра. Условие "пока координата центра не равна координате мыши, перемещаем камеру к курсору по х, у , z
0
30
6 лет назад
0
Ну хз. Почему-то это представляется мне сомнительным, но не могу сказать точно почему.

Тем не менее, почти наверняка уверен, что достаточно аккуратно для использования с динамичной камерой отслеживать экранные координаты таким образом будет сложно и будут рывки.

Ну и да, что делать со "взглядом" выше горизонта, который вернёт (0.0, 0.0) неясно.
0
20
6 лет назад
0
А ещё можно удалять игроков, если его мышь не двигалась минуту. Или наоборот, двинул курсором - проиграл. Можно хороры так делать, типа рядом маньяк, который тебя ищет с 50% вероятности. Двинешь мышкой - точно найдёт. Не двинешь - не сможешь убежать.
Можно встраивать в первую доту десинх от движения мыши.
0
21
6 лет назад
Отредактирован awesomesk1ll
0
DemonoiD:
А ещё можно удалять игроков, если его мышь не двигалась минуту. Или наоборот, двинул курсором - проиграл. Можно хороры так делать, типа рядом маньяк, который тебя ищет с 50% вероятности. Двинешь мышкой - точно найдёт. Не двинешь - не сможешь убежать.
Можно встраивать в первую доту десинх от движения мыши.
Пока что на ум приходит только ANTI-AFK система, не писал/не двигал мышку минуту/не юзал скиллы с юнитов - выбываешь из раунда. Было бы неплохо.
Clamp:
Ну и да, что делать со "взглядом" выше горизонта, который вернёт (0.0, 0.0) неясно.
Тут ещё приходит на ум то что придётся блокировать камеру от игрока (уровень наклона/зум, кнопки PageDown PageUp.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.