Новые нативные функции в 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


Просмотров: 11 843



» Лучшие комментарии


Doc #51 - 5 месяцев назад 0
Можно. Для интерфейса все равно нужна возможность рисовать картинки, цветные квадраты и текст. Глюки в дгуи были в основном из-за способа "отрисовки".
Raised #52 - 5 месяцев назад 4
Лучше штормите близзов чтоб поддержку кастом UI ввели. ДГУИ - херь.
DracoL1ch #53 - 5 месяцев назад 0
Поднимать скорость бега выше 522 нельзя по причине устаревшей системы поиска пути, вот если они её переделают.. но это мечты имхо
У эффектов есть причина быть хендлами, у структуры абилок - нет. Костыль какой-то очередной
ScorpioT1000 #54 - 5 месяцев назад (отредактировано ) 0
Нельзя сделать шутер от 1 лица, нельзя) потому что нет функционала установки курсора в центр. Ты доведёшь до края экрана и всё остановится. В идеале ещё сокрытие нужно.
А вот управление персонажем в стиле Diablo и подобных гораздо интереснее. Т.е. в целом поворот и движение в направлении мыши.
uranus #55 - 5 месяцев назад 0
Я не понимаю, почему GetUnitAbilityManaCost не имеет Set вариации, и к чему было отдельно делать GetUnitMaxMana/Life? Что вообще такое AutomationTest?
Alexander12 #56 - 5 месяцев назад 0
uranus:
Я не понимаю, почему GetUnitAbilityManaCost не имеет Set вариации, и к чему было отдельно делать GetUnitMaxMana/Life? Что вообще такое AutomationTest?
Одинаковые скилы ссылаются на одну таблицу данных, при изменении у 1 героя, это отразиться на всех остальных. Я с помощью мемхака создавал новую таблицу и ставил ссылку на нее у скила, чтобы можно было редактировать под конкретного героя.
uranus #57 - 5 месяцев назад 2
Alexander12, очень печально, что более мощных нативок [без переписывания движка] мы не получим. Эх, ну, тогда осталось только JNGP дождаться.
Doc #58 - 5 месяцев назад 0
Так а получение курсора сейчас в каких координатах? World?
Maniac_91 #59 - 5 месяцев назад (отредактировано ) 0
Мышь вверх и вниз - это поворот колёса?
Если да, то круто. Можно шутер с быстрой сменой оружия сделать.
pro100master #60 - 5 месяцев назад 0
Maniac_91, midle это колесиком при нажатие, а up и down это прокрутка колесик... а move при движении мышка
biridius #61 - 5 месяцев назад (отредактировано ) 0
Maniac_91,
события
EVENT_PLAYER_MOUSE_DOWN - нажатие
EVENT_PLAYER_MOUSE_UP - отпускание
EVENT_PLAYER_MOUSE_MOVE - наведение
а тип кнопки этого события проверяется в условиях через GetTriggerPlayerMouseButton()
MOUSE_BUTTON_TYPE_LEFT - левая
MOUSE_BUTTON_TYPE_MIDDLE - колесо
MOUSE_BUTTON_TYPE_RIGHT - правая
ScorpioT1000 #62 - 5 месяцев назад (отредактировано ) 0
Doc, location в world, x/y я так понимаю, viewport. Иначе был бы Z
UPD
а вот хрен, всё в world координатах
(опечатался, там вторая - это Y)
прикреплены файлы
NanO #63 - 5 месяцев назад 0
лол
То есть оно возвращает позицию курсора относительно мира, а не относительно экрана?)
ScorpioT1000 #64 - 5 месяцев назад (отредактировано ) 0
NanO, да, так что DGUI ещё в силе. Будем юзать матрицы проекции. Хотя для этого надо точно знать положение камеры.
abidin #65 - 5 месяцев назад 2
А разве не так и должен работать отлов положения мыши?
Зачем что-то выдумывать?
NanO #66 - 5 месяцев назад 0
ScorpioT1000:
NanO, да, так что DGUI ещё в силе. Будем юзать матрицы проекции. Хотя для этого надо точно знать положение камеры.
Близзы как всегда)
Я уже понадеялся, что относительно экрана, думаю, ну наконец-то, можно интересно использовать.
Адекватных идей для "относительно мира" я пока не вижу. Квесты какие-то разве что.
Ethernet #67 - 5 месяцев назад 1
NanO:
ScorpioT1000:
NanO, да, так что DGUI ещё в силе. Будем юзать матрицы проекции. Хотя для этого надо точно знать положение камеры.
Близзы как всегда)
Я уже понадеялся, что относительно экрана, думаю, ну наконец-то, можно интересно использовать.
Адекватных идей для "относительно мира" я пока не вижу. Квесты какие-то разве что.
Quick Cast как в дота2!
ScorpioT1000 #68 - 5 месяцев назад 7
NanO, управление персонажем как в Diablo или Alien Shooter. Другой тип движения - в стиле космических полётов или warthunder. Кроме того, управление спеллами и чем угодно ещё в мире.
Maniac_91 #69 - 5 месяцев назад 0
biridius, жаль, что не прокрутка, но тоже неплохо.
Doc #70 - 5 месяцев назад 0
Я полагаю что эти ивенты они еще и синкаются так что до нормального ЮИ еще далеко тут. Нужны локальные ивенты на мышь...
А разве не так и должен работать отлов положения мыши?
Нет, не так.
Вот так было бы супер:
GameUI.GetCursorPosition
GameUI.GetScreenWorldPosition
awesomesk1ll #71 - 5 месяцев назад 3
ScorpioT1000:
Если кликать на UI евенты не работают?
NanO:
Я уже понадеялся, что относительно экрана, думаю, ну наконец-то, можно интересно использовать.
Адекватных идей для "относительно мира" я пока не вижу. Квесты какие-то разве что.
Теперь представь как это будет работать для всех возможных игровых разрешений и соотношений сторон экрана :)
ScorpioT1000 #72 - 5 месяцев назад 2
На UI отдаётся всё по нулям
Sergant1000 #73 - 5 месяцев назад 0
GetUnitMovementType - получить тип движения юнита. (летающий ходящий плавающий и т.д.)
SetUnitMovementType- установить тип движения юниту. (летающий ходящий плавающий и т.д.)
GetUnitArmorType- получить тип брони юнита. (легкая тяжелая герой и т.д.)
GetHeroPrimaryStat - получить изначальную хар-ку героя. (сила ловкость интелект)
GetHeroPrimaryStatById - получить изначальную хар-ку по айди героя. (сила ловкость интелект)
GetHeroStat - получить хар-ку героя с бонусом или без. (сила ловкость интелект)
uranus #74 - 5 месяцев назад 0
Я не понял про события начала/конца каста, в чем их отличие от того, что было?
avuremybe #75 - 5 месяцев назад 0
awesomesk1ll, какие могут быть клики на UI, если там world координаты?

А чем отличаются эти и этим подобные функции с "On":
native GetAbilityTooltip takes integer abilCode, integer level returns string
native GetAbilityOnTooltip takes integer abilCode, integer level returns string
Понял, это для авто-кастов? Но тогда где "Off" вариант?
Это не автокасты, а включаемые абилки (вроде жара преисподней). Off-вариант это просто GetAbilityTooltip.
ScorpioT1000 #76 - 5 месяцев назад (отредактировано ) 1
Какая сейчас стратегия разработки? Объявляем native в 1.21b и компилим, дальше чекаем на 1.29?
Bergi_Bear #77 - 5 месяцев назад 1
а как в этом кодить то? на гуи чтоли? или в кастом текст на стандартном джасс? или уже какая-то наработка в процессе?
PT153 #78 - 5 месяцев назад (отредактировано ) 1
к чему было отдельно делать GetUnitMaxMana/Life? Что вообще такое AutomationTest?
Вот тоже интересно.
uranus:
Я не понял про события начала/конца каста, в чем их отличие от того, что было?

было

constant unitevent EVENT_UNIT_SPELL_CHANNEL = ConvertUnitEvent(289)
constant unitevent EVENT_UNIT_SPELL_CAST = ConvertUnitEvent(290)
constant unitevent EVENT_UNIT_SPELL_EFFECT = ConvertUnitEvent(291)
constant unitevent EVENT_UNIT_SPELL_FINISH = ConvertUnitEvent(292)
constant unitevent EVENT_UNIT_SPELL_ENDCAST = ConvertUnitEvent(293)

стало

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)
pro100master #79 - 5 месяцев назад 1
PT153, ну все по прежнему просто конвертор евент немного увеличили и все двинули вперед =)
PT153, ведь каждый нативка имеет свой конвертор евент так что и они и увеличивает сдвиг учитивая некоторых новедении
DracoL1ch #80 - 5 месяцев назад 4
Ну, поплывут карты, которые использовали целое-хендл от таких событий вместо алиаса самого события. Их, конечно, по пальцам пресчитать, но всё же. Зачем близы ломают легаси в очередной раз - нипоняяятно. Слабые разработчики, видимо
Tovio #81 - 5 месяцев назад 0
DracoL1ch, там реально дилетанты какие-то сидят, ало.
Maniac_91 #82 - 5 месяцев назад 0
Если выбрать юнита, то это будет считаться кликом мышью?
Если да, то запрос координат мыши вернёт координаты юнита?
DemonoiD #83 - 5 месяцев назад 8
Можно отслеживать координаты экрана создавая дамми в центре и беря его координаты в карте и координаты мыши в карте.
Возможен новый тип кликалок. Теперь мы не кликаем на юнита, а рисуем ему препятствия, разрезаем мышкой пополам и тп, отталкиваем курсором. Это сколько можно придумать для жанра миниигр. Прелесть!
Я даже подумал, что сборный интерфейс так можно реализовать. Расталкиваем мышью по углам плоские юниты-картинки и сохраняем их положение относительно центра экрана.
А ещё нонтаргет абилки! Вашу Машу. С помощью банальной линейной функции.
А ещё можно устанавливать имя юнитов. Это ж новый жанр. Все накликиваемые вражеские юниты получают имя Игорь. Если игрок кликнул на своего Игоря, то он становится Васей. Каждые 15 секунд все Игори умирают. Победил тот, у кого остался хоть один юнит.
Или генерация рандомных итемов. Если у итема такая-то иконка сделать то-то.
Взять описание итема сумка, разбить строки по спецсимволам, вычислить какой предмет там описан и учесть его цену при продаже. Теперь не нужно создавать 10 предметов для торговли, хватит БД цен и описания предмета.
Упрощается генерация предмета с помощью невидимого спелбука. Ведь можно генерировать описания и иконки! Мощно.
awesomesk1ll #84 - 5 месяцев назад (отредактировано ) 0
avuremybe:
awesomesk1ll, какие могут быть клики на UI, если там world координаты?
Я спросил отрабатывается евент или нет. И что, что координаты world ? :D
DemonoiD:
Можно отслеживать координаты экрана создавая дамми в центре и беря его координаты в карте и координаты мыши в карте.
Возможен новый тип кликалок. Теперь мы не кликаем на юнита, а рисуем ему препятствия, разрезаем мышкой пополам и тп, отталкиваем курсором. Это сколько можно придумать для жанра миниигр. Прелесть!
Я даже подумал, что сборный интерфейс так можно реализовать. Расталкиваем мышью по углам плоские юниты-картинки и сохраняем их положение относительно центра экрана.
А ещё нонтаргет абилки! Вашу Машу. С помощью банальной линейной функции.
А ещё можно устанавливать имя юнитов. Это ж новый жанр. Все накликиваемые вражеские юниты получают имя Игорь. Если игрок кликнул на своего Игоря, то он становится Васей. Каждые 15 секунд все Игори умирают. Победил тот, у кого остался хоть один юнит.
Или генерация рандомных итемов. Если у итема такая-то иконка сделать то-то.
Взять описание итема сумка, разбить строки по спецсимволам, вычислить какой предмет там описан и учесть его цену при продаже. Теперь не нужно создавать 10 предметов для торговли, хватит БД цен и описания предмета.
Упрощается генерация предмета с помощью невидимого спелбука. Ведь можно генерировать описания и иконки! Мощно.
Про координаты не понял, раньше же и так можно ловить координаты приказа Move или Spell, так что про кликалки новые не понятно. Не, учитывая возможность использования левой и правой кнопки мыши конечно сулит новые возможности, но это мизер вообще. Нонтаргет абилки тоже были же.
В остальном да, классные введения, хотя хотелось бы бОльшего. В частности Custom UI, возможность нанесения на миникарту своих иконок например.. (динамических, статические очевидно и сейчас нарисовать можно).
Maniac_91:
Если выбрать юнита, то это будет считаться кликом мышью?
Если да, то запрос координат мыши вернёт координаты юнита?
Очевидно что да, этот евент тоже должен сработать.
Логично предположить, что нет, должны возвращаться координаты удара raycast в землю в точке клика с viewport (т.е точка не должна совпадать с координатами юнита)
DemonoiD #85 - 5 месяцев назад 0
awesomesk1ll, смотри, делаем даммик в центре области экрана игрока. Берём его координату.
Берём координату курсора. Вычитаем одно из другого, получаем отклонение курсора от центра экрана, т.е экранную координату. Следственно, если есть экранная координата - можно запилить шутан.
Проверяем юнитов в области от курсора - можно их от туда оттолкнуть, повесить баф/дебаф.
Можно замерять таймером координаты перемещения мыши каждые 0.01 секунд. Тем самым получая скорость её перемещения. И в зависимости от этого увеличивать силу отброса-дебафа юнитов.
Можно создать бензопилы, которые стремятся лететь к курсору.
Создание союзных юнитов при клике мышью, которые воюют с врагами.
Можно устроить выбор спела от поворота колесика мыши.
Вот тебе и миниигра с 5 различными механиками победы. Не говоря уже о комбинациях этих подходов:
ведем курсором рядом с юнитом, чтобы его поджечь, горящий юнит при клике на него взрывается.
При клике правой кнопкой мыши юнит подмерзает, при клике левой - раскалывается на куски.
Clamp #86 - 5 месяцев назад (отредактировано ) 3
Строго говоря, возможность отслеживать world-координаты клика мышкой уже давно существует, причём что правой кнопкой, что левой, но при этом приходилось отказываться от использования практически всего интерфейса. Реализовывалось через ForceUIKey(string key), по сути юнит всё время пытался начать кастовать абилку, и отлавливались координаты каста. Использовалось, например, в TCX.

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

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

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

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

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

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

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

Ну и да, что делать со "взглядом" выше горизонта, который вернёт (0.0, 0.0) неясно.
DemonoiD #91 - 5 месяцев назад 0
А ещё можно удалять игроков, если его мышь не двигалась минуту. Или наоборот, двинул курсором - проиграл. Можно хороры так делать, типа рядом маньяк, который тебя ищет с 50% вероятности. Двинешь мышкой - точно найдёт. Не двинешь - не сможешь убежать.
Можно встраивать в первую доту десинх от движения мыши.
awesomesk1ll #92 - 5 месяцев назад (отредактировано ) 0
DemonoiD:
А ещё можно удалять игроков, если его мышь не двигалась минуту. Или наоборот, двинул курсором - проиграл. Можно хороры так делать, типа рядом маньяк, который тебя ищет с 50% вероятности. Двинешь мышкой - точно найдёт. Не двинешь - не сможешь убежать.
Можно встраивать в первую доту десинх от движения мыши.
Пока что на ум приходит только ANTI-AFK система, не писал/не двигал мышку минуту/не юзал скиллы с юнитов - выбываешь из раунда. Было бы неплохо.
Clamp:
Ну и да, что делать со "взглядом" выше горизонта, который вернёт (0.0, 0.0) неясно.
Тут ещё приходит на ум то что придётся блокировать камеру от игрока (уровень наклона/зум, кнопки PageDown PageUp.
DemonoiD #93 - 5 месяцев назад (отредактировано ) 1
А ещё, если знать немного геодезию, можно определять с позиции стрелка куда ты попал по вражескому юниту. Голова, тело, руки, ноги. Правда по линейной траектории, а не баллистической.
О. Я про эффекты забыл. От уровня навыка скаляция в масштабе создаваемых способностью эффектов. Типа герой стал сильнее и бросает более большие фаерболы.
А ещё можно рисовать гениталии изменением тайлов под курсором на базе врага. Это ж то, о чем мы мечтали 10 лет!
Clamp #94 - 5 месяцев назад 0
если знать немного геодезию
Скорее, линейную алгебру (векторное представление движения).

Функция-то точно не на остановку мыши после движения реагирует, а на сам его факт?

придётся блокировать камеру от игрока
Да тут скорее будет проще свою написать, как в DGUI.

Пока что на ум приходит только ANTI-AFK система
Мне кажется, у него просто брейншторм идёт на предмет что можно сделать с новыми игрушками нативками. =)
DemonoiD #95 - 5 месяцев назад (отредактировано ) 3
Clamp, такая же была в с#. Как тут действует, я не знаю. Но скорее всего действительно на мув. У меня нет лицухи, так бы я место идей уже мапу релизнул.
GetUnitDiceNumber - итемы прибавляющие не +1, а от 0 до 2. Welcome dnd!
Можно изменять позицию абилок в интерфейсе после каста или снижать или повышать их стоимость динамически, демонстрируя игроку хаос бытия. Или эффекты алкогольного опьянения и манашторма "неделя волшебника. все заклинания стали стоить на 20% меньше маны"
А ещё с помощью пкм можно выдавать список действий пользователя с обьектом, с помощью левитирующего текста. Колесико - выбор из списка, лкм - подтверждение выбора.
uranus #96 - 5 месяцев назад 0
снижать или повышать их стоимость динамически
Этого сделать нельзя, если мне тут правильно объяснили про таблицу, где эти значения хранятся.
DemonoiD #97 - 5 месяцев назад 0
uranus, можно, даже если нельзя, выдавать голду тригерно.
Doc #98 - 5 месяцев назад 5
awesomesk1ll, смотри, делаем даммик в центре области экрана игрока. Берём его координату.
Берём координату курсора. Вычитаем одно из другого, получаем отклонение курсора от центра экрана, т.е экранную координату. Следственно, если есть экранная координата - можно запилить шутан.
Гениально, жаль, что полный бред
biridius #99 - 5 месяцев назад 0
DemonoiD, это будет работать только если камера смотрит сверху под прямым углом.
При нормальной камере придется учитывать угол атаки камеры и высоту рельефа в этой точке, куча лишней возни. Все-таки лучше бы возможность сразу получать экранные координаты.
Doc #100 - 5 месяцев назад 3
Каким образом это будет работать даже при камере смотрящей сверху вы можете мне объяснить? Хелло?
Начинаем с первого шага
делаем даммик в центре области экрана игрока
А теперь думаем каким же образом это мы так сделаем без кастомной камеры и зачем здесь вообще что-либо создавать. А с кастомной камерой в дгуи это уже и 8 лет назад было. Может я конечно упустил функцию с названием типа CreateUnitInTheCenterOfPlayerScreen?