Наверное многие это уже видели, но я все же сообщу, так как есть вопросы по поводу того как отследить какие-то кнопки. Так вот, Quilnez относительно недавно написал систему отлова клавиш 1, 2... - ...9, 0. Мне система жутко понравилась тем, что теперь можно биндить способности в rpg-шках так же, как WoWке. Единственный недостаток, который я заметил, система вроде как юзает дамми. С юнита слетает выбор в момент нажатия клавиши. Если я правильно понял, то там отслеживается бинд даммика, а не сама нажатая клавиша. Тем не менее, это все равно круто.)) скачать Number Key Press Event v1.1
// Configurations globals // Hot key dummy's raw code in OE private constant integer DUMMY_ID = 'h000'
// Location of dummy, better to be an invisible spot // in your map private constant real DUMMY_X = 2521.32 private constant real DUMMY_Y = -2827.15
// Delay after calibration to activate the event private constant real ACTIVE_DELAY = 0.25
endglobals
/******************************************************* * * NumberKeyEvent v1.1 * ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ * * Description * ¯¯¯¯¯¯¯¯¯¯¯ * Allows you to do actions when a player presses * any number key (0-9) * * * Cons * ¯¯¯¯ * - Needs calibration (check demo) * - Disturbs unit selection * * * Requires * ¯¯¯¯¯¯¯¯ * - Table by Bribe | hiveworkshop.com/forums/jass-resources-412/snippet-new-table-188084/ * * * How to import * ¯¯¯¯¯¯¯¯¯¯¯¯¯ * - Copy dummy unit from object editor to your map * - Copy the trigger folder to your map * - Configure the system properly * * * API * ¯¯¯ * function CalibrateKeys takes integer playerId returns nothing * * function RegisterAnyNumberKeyEvent takes boolexpr func returns triggercondition * * function UnregisterAnyNumberKeyEvent takes triggercondition tc returns nothing * * function GetPressedNumberKey takes nothing returns integer * * function GetPressingPlayer takes nothing returns player * * * Notes * ¯¯¯¯¯ * - Better to preserve an invisible area for dummy * units to avoid unwanted camera panning * - You will surely need some work around in adapting * the system to your map * - Player must press CTRL when CalibrateKeys function * is called * - You must allow players to calibrate their keys * anytime whenever they want, in case the calibration * is failed, since there is no "fast" way to validate * the calibration (perhaps not yet) * * ********************************************************/
private function onSelection takes nothing returns boolean
local unit u = GetTriggerUnit() local player p = GetOwningPlayer(u) local integer id = GetPlayerId(p)
if GetLocalPlayer() == p then call ClearSelection() endif if IsCalibrated[id] then set EventPresser = p set EventPressed = Ht.integer[GetHandleId(u)] call TriggerEvaluate(Handler) set EventPressed = 0 set EventPresser = null endif set u = null
return false endfunction
private function activate takes nothing returns nothing set IsCalibrated[Ht.integer[GetHandleId(GetExpiredTimer())]] = true endfunction
function CalibrateKeys takes integer playerId returns nothing
local integer i
if IsRegistered[playerId] then set IsCalibrated[playerId] = false if GetLocalPlayer() == Player(playerId) then set i = 0 loop exitwhen i > 9 call ClearSelection() call SelectUnit(KeyUnit[playerId*0xA+i], true) call ForceUIKey(I2S(i)) set i = i + 1 endloop call ClearSelection() endif call TimerStart(DelayTimer[playerId], ACTIVE_DELAY, false, function activate) endif
endfunction
function GetPressedNumberKey takes nothing returns integer return EventPressed endfunction
function GetPressingPlayer takes nothing returns player return EventPresser endfunction
private function init takes nothing returns nothing
local trigger t = CreateTrigger() local integer i = 0 local integer j local integer k local player p
set Ht = Table.create() call TriggerAddCondition(t, Condition(function onSelection)) loop exitwhen i > 11 set p = Player(i) set IsRegistered[i] = GetPlayerController(p) == MAP_CONTROL_USER and GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING if IsRegistered[i] then set DelayTimer[i] = CreateTimer() set Ht.integer[GetHandleId(DelayTimer[i])] = i set j = 0 loop exitwhen j > 9 set k = i*0xA+j set KeyUnit[k] = CreateUnit(p, DUMMY_ID, DUMMY_X, DUMMY_Y, 0) call TriggerRegisterUnitEvent(t, KeyUnit[k], EVENT_UNIT_SELECTED) set Ht.integer[GetHandleId(KeyUnit[k])] = j call PauseUnit(KeyUnit[k], true) set j = j + 1 endloop endif set i = i + 1 endloop
endfunction
endlibrary
Сообщение отредактировал Samedy_ - Вторник, 11 Августа 2015, 10:11:55
Слёт выбора с юнита во многих ситуациях может быть катастрофой, так что смысла в этой либе мало.
Если говорить о сис-ме скилов, как вовке, то эта "либа" идеальна, в общем-то. После нажатия заветной клавиши герой снова выбирается. Не знаю, по-моему система вполне юзабельна.
Триггерно можно заставить юнита применить способность, но не начать ее применять, то есть - изменить курсор игрока в состояние прицеливания способности. Это уже не вклеивается в каноны ВоВки или способностей в принципе. Эта система может позволить только применять способности и предметы, не требующие наведения на цель.
Сообщение отредактировал Bibo - Вторник, 11 Августа 2015, 17:36:57
Ну, сис-ма скиллов "как ВОВ" подразумевает собой спелы, которые не нужно наводить на цель, в общем-то. Для хила или танка может идельно подойти, в принципе.
в задумке как бы нет ничего сложного, но... ~1к строк в итогом коде... эгхкмс.... из которых 666 строк это однострочные функции (в три строки, итого 222 штучки)