Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Версия Warcraft:
1.26a

SHIFT DETECT Версия 1.0

Описание

Система позволяющая отслеживать зажатие Shift при использовании правой кнопки мыши на рельефе.
Отлавливает приказы smart,smartshift,setrally.

● Подходит как дамми интерфейс для управления движущимся юнитом. (требуется перенаправление приказов)
Скрывает RallyPoint флаги
Задержка приказов 0.01 с
На двойной райтклик в точку срабатывают оба приказа (исправлено за счет camerafix)

Импорт

Скопировать триггер HashLib
Скопировать триггер ShiftDetect

Тип юнита должен быть указан в условии ShiftDetectCond
Юнит должен иметь приказ 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.

Код наработки
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

Пример наработки в рабочем проекте.

HunterOrVictim
Используется Shift для вращения камеры.
Видео

Обновления


Версия 1.0
● Оптимизированы переменные
● Задержка приказа снижена с 0.1-1 до 0.01 секунды.

`
ОЖИДАНИЕ РЕКЛАМЫ...