SHIFT DETECT Версия 1.0
Описание
Система позволяющая отслеживать зажатие Shift при использовании правой кнопки мыши на рельефе.
Отлавливает приказы smart,smartshift,setrally.
Отлавливает приказы smart,smartshift,setrally.
● Подходит как дамми интерфейс для управления движущимся юнитом. (требуется перенаправление приказов)
● Скрывает RallyPoint флаги
● Задержка приказов 0.01 с
● На двойной райтклик в точку срабатывают оба приказа (исправлено за счет camerafix)
● Скрывает RallyPoint флаги
● Задержка приказов 0.01 с
● На двойной райтклик в точку срабатывают оба приказа (исправлено за счет camerafix)
Импорт
Скопировать триггер HashLib
Скопировать триггер ShiftDetect
Скопировать триггер ShiftDetect
Тип юнита должен быть указан в условии ShiftDetectCond
Юнит должен иметь приказ Cбор ('ARal')
Юнит должен иметь приказ Cбор ('ARal')
Файлы импорта
-
//Заменить описание и рассположения приказов
Units\CommandFunc.txt
Units\CommandStrings.txt
-
//Заменить стандартные флаги
UI\Feedback\RallyPoint\NightElfRallyFlag.mdx
UI\Feedback\WaypointFlags\NightElfWaypointFlag1.mdx
UI\Feedback\RallyPoint\OrcRallyFlag.mdx
UI\Feedback\WaypointFlags\OrcWaypointFlag1.mdx
UI\Feedback\RallyPoint\RallyPoint.mdx
UI\Feedback\RallyPoint\UndeadRallyFlag.mdx
UI\Feedback\WaypointFlags\UndeadWaypointFlag1.mdx
UI\Feedback\WaypointFlags\WaypointFlag1.mdx
-
Устройство
Варкрафт предусматривает возможность задать последовательность действий для юнита через Shift.
Т.е любой тарет приказ с зажатым Shift перезаписывает UnitRallyPoint.
Таким образом, если сравнить UnitRallyPoint до и после приказа, то можно определить был ли использован Shift.
Т.е любой тарет приказ с зажатым Shift перезаписывает UnitRallyPoint.
Таким образом, если сравнить UnitRallyPoint до и после приказа, то можно определить был ли использован Shift.
Код наработки
ShiftDetectLib
library ShiftDetectLib uses HashLib
globals
integer ShiftDetectUnitId = 'hfoo' //Дамми юнит который будет спрятан
//Модели эффектов
string OrderEffectA = "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl"
string OrderEffectB = "Abilities\\Spells\\Undead\\DarkRitual\\DarkRitualTarget.mdl"
string OrderEffectC = "Abilities\\Weapons\\ProcMissile\\ProcMissile.mdl"
string OrderEffectD = "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl"
//Переменные
location ShiftDetectLoc
real ShiftDetectX
real ShiftDetectY
integer ShiftDetectOT
real array ShiftDetectPaX
real array ShiftDetectPaY
real array ShiftDetectPtX
real array ShiftDetectPtY
unit array ShiftDetectU
boolean array ShiftDetectB
integer array ShiftDetectO
endglobals
//Эффект приказа
nothing OrderEffectXY(real x,real y, string s){
DestroyEffect(AddSpecialEffect(s,x,y))
}
boolean StopCond (){return GetIssuedOrderId() == OrderId("setrally") or GetIssuedOrderId() == OrderId("smart") }
nothing DelayOrderEnd(){
GetTimer
integer i = LdInt("i")
if ShiftDetectO[i] == 1 {
ShiftDetectLoc = GetUnitRallyPoint(ShiftDetectU[i])
}elseif ShiftDetectO[i] == 2 or ShiftDetectO[i] == 4 {
ShiftDetectLoc = GetUnitLoc(GetUnitRallyUnit(ShiftDetectU[i]))
}elseif ShiftDetectO[i] == 3 {
ShiftDetectLoc = GetDestructableLoc(GetUnitRallyDestructable(ShiftDetectU[i]))
}
ShiftDetectX = ShiftDetectPaX[i] - GetLocationX(ShiftDetectLoc)
ShiftDetectY = ShiftDetectPaY[i] - GetLocationY(ShiftDetectLoc)
if SquareRoot(ShiftDetectX * ShiftDetectX +ShiftDetectY * ShiftDetectY) > 0.01 or ShiftDetectO[i] != 1 {
OrderEffectXY(ShiftDetectPtX[i],ShiftDetectPtY[i],OrderEffectA)
}else{
OrderEffectXY(ShiftDetectPtX[i],ShiftDetectPtY[i],OrderEffectB)
}
ShiftDetectB[i] = true
EndTimer
}
nothing DelayOrder(integer i, unit u,real ptX,real ptY, real paX, real paY,integer ordertype){
timer t
integer h
if ShiftDetectB[i] {
t = CreateTimer()
h = GetHandleId(t)
SvInt ("i",i)
ShiftDetectU [i] = u
ShiftDetectPtX[i] = ptX
ShiftDetectPtY[i] = ptY
ShiftDetectPaX[i] = paX
ShiftDetectPaY[i] = paY
ShiftDetectO [i] = ordertype
ShiftDetectB [i] = false
RunTimer(0.01,false,DelayOrderEnd)
}
}
nothing ShiftDetect (){
unit u = GetTriggerUnit()
integer i = GetPlayerId(GetTriggerPlayer())
ShiftDetectLoc = GetUnitRallyPoint(u)
//Определения точки и типа приказа
if GetOrderPointLoc() != null {
ShiftDetectX = GetLocationX(GetOrderPointLoc())
ShiftDetectY = GetLocationY(GetOrderPointLoc())
ShiftDetectOT = 1
}elseif GetOrderTargetUnit() != null {
ShiftDetectX = GetUnitX(GetOrderTargetUnit())
ShiftDetectY = GetUnitY(GetOrderTargetUnit())
ShiftDetectOT = 2
}elseif GetOrderTargetDestructable() != null {
ShiftDetectX = GetDestructableX(GetOrderTargetDestructable())
ShiftDetectY = GetDestructableY(GetOrderTargetDestructable())
ShiftDetectOT = 3
}elseif GetOrderTargetItem() != null {
ShiftDetectX = GetItemX(GetOrderTargetItem())
ShiftDetectY = GetItemY(GetOrderTargetItem())
ShiftDetectOT = 4
}
//CameraFix
PanCameraToTimed(GetCameraTargetPositionX()+0.1, GetCameraTargetPositionY()+0.1, 0)
//CameraFixEnd
IssueImmediateOrder(u, "stop" )
if GetIssuedOrderId() == OrderId("setrally") {
//Приказ SetRally
OrderEffectXY(ShiftDetectX,ShiftDetectY,OrderEffectC)
}else{
//Задержка выполнения
DelayOrder(i,u,ShiftDetectX,ShiftDetectY,GetLocationX(ShiftDetectLoc),GetLocationY(ShiftDetectLoc),ShiftDetectOT)
}
u = null
}
endlibrary
//===========================================================================
nothing InitTrig_ShiftDetect (){
integer i = 0
trigger t = CreateTrigger( )
loop
ShiftDetectB[i] = true
SetPlayerTechMaxAllowed(Player(i), ShiftDetectUnitId, 0)
TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_ORDER, null)
TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
i++
exitwhen i == bj_MAX_PLAYER_SLOTS
endloop
TriggerAddCondition( t, Condition( function StopCond ) )
TriggerAddAction ( t, function ShiftDetect )
}
HashLib
library HashLib
globals
hashtable hash = InitHashtable()
endglobals
define EndTimer( ) = {PauseTimer(t); DestroyHash (h); DestroyTimer (t)}
define GetTimer( ) = { timer t = GetExpiredTimer(); integer h = GetHandleId(t); }
define SetTimer( ) = { timer t = CreateTimer(); integer h = GetHandleId(t); }
define RunTimer(d,b,c)= {TimerStart(t,d,b,function c)}
define SvBool (s,v) = SaveBoolean (hash,h,StringHash(s),v)
define SvInteger (s,v) = SaveInteger (hash,h,StringHash(s),v)
define SvReal (s,v) = SaveReal (hash,h,StringHash(s),v)
define SvInt (s,v) = SaveInteger (hash,h,StringHash(s),v)
define SvFloat (s,v) = SaveReal (hash,h,StringHash(s),v)
define SvBoolean (s,v) = SaveBoolean (hash,h,StringHash(s),v)
define SvString (s,v) = SaveStr (hash,h,StringHash(s),v)
define SvPlayer (s,v) = SavePlayerHandle (hash,h,StringHash(s),v)
define SvWidget (s,v) = SaveWidgetHandle (hash,h,StringHash(s),v)
define SvDestructable (s,v) = SaveDestructableHandle (hash,h,StringHash(s),v)
define SvItem (s,v) = SaveItemHandle (hash,h,StringHash(s),v)
define SvUnit (s,v) = SaveUnitHandle (hash,h,StringHash(s),v)
define SvTimer (s,v) = SaveTimerHandle (hash,h,StringHash(s),v)
define SvTrigger (s,v) = SaveTriggerHandle (hash,h,StringHash(s),v)
define SvForce (s,v) = SaveForceHandle (hash,h,StringHash(s),v)
define SvGroup (s,v) = SaveGroupHandle (hash,h,StringHash(s),v)
define SvLocation (s,v) = SaveLocationHandle (hash,h,StringHash(s),v)
define SvRect (s,v) = SaveRectHandle (hash,h,StringHash(s),v)
define SvBoolexpr (s,v) = SaveBooleanExprHandle (hash,h,StringHash(s),v)
define SvSound (s,v) = SaveSoundHandle (hash,h,StringHash(s),v)
define SvEffect (s,v) = SaveEffectHandle (hash,h,StringHash(s),v)
define SvTextTag (s,v) = SaveTextTagHandle (hash,h,StringHash(s),v)
define SvLightning (s,v) = SaveLightningHandle (hash,h,StringHash(s),v)
define SvRegion (s,v) = SaveRegionHandle (hash,h,StringHash(s),v)
define SvProps (s,v) = SaveDestructableHandle (hash,h,StringHash(s),v)
define LdProps (s) = LoadDestructableHandle (hash,h,StringHash(s))
define LdBool (s) = LoadBoolean (hash,h,StringHash(s))
define LdInteger (s) = LoadInteger (hash,h,StringHash(s))
define LdReal (s) = LoadReal (hash,h,StringHash(s))
define LdInt (s) = LoadInteger (hash,h,StringHash(s))
define LdFloat (s) = LoadReal (hash,h,StringHash(s))
define LdBoolean (s) = LoadBoolean (hash,h,StringHash(s))
define LdString (s) = LoadStr (hash,h,StringHash(s))
define LdPlayer (s) = LoadPlayerHandle (hash,h,StringHash(s))
define LdWidget (s) = LoadWidgetHandle (hash,h,StringHash(s))
define LdDestructable (s) = LoadDestructableHandle (hash,h,StringHash(s))
define LdItem (s) = LoadItemHandle (hash,h,StringHash(s))
define LdUnit (s) = LoadUnitHandle (hash,h,StringHash(s))
define LdTimer (s) = LoadTimerHandle (hash,h,StringHash(s))
define LdTrigger (s) = LoadTriggerHandle (hash,h,StringHash(s))
define LdForce (s) = LoadForceHandle (hash,h,StringHash(s))
define LdGroup (s) = LoadGroupHandle (hash,h,StringHash(s))
define LdLocation (s) = LoadLocationHandle (hash,h,StringHash(s))
define LdRect (s) = LoadRectHandle (hash,h,StringHash(s))
define LdRegion (s) = LoadRegionHandle (hash,h,StringHash(s))
define LdBoolexpr (s) = LoadBooleanExprHandle (hash,h,StringHash(s))
define LdSound (s) = LoadSoundHandle (hash,h,StringHash(s))
define LdEffect (s) = LoadEffectHandle (hash,h,StringHash(s))
define LdTextTag (s) = LoadTextTagHandle (hash,h,StringHash(s))
define LdLightning (s) = LoadLightningHandle (hash,h,StringHash(s))
define DestroyHash (h) = FlushChildHashtable(hash,h)
define UnitRemoveHash (u) = FlushChildHashtable(hash,GetHandleId(u))
endlibrary
Пример наработки в рабочем проекте.
Видео
Обновления
Версия 1.0
● Оптимизированы переменные
● Задержка приказа снижена с 0.1-1 до 0.01 секунды.
● Оптимизированы переменные
● Задержка приказа снижена с 0.1-1 до 0.01 секунды.