ShiftDetect и Cкрытие приказов v 0.09

» опубликован

v 0.09

Детект зажатия Shift ( цель точка! )
Отлавливает smart,smartshift,setrally
Подходит для статичных юнитов.
Подходит как дамми интерфейс для управления движущимся юнитом. (требуется перенаправление приказов)
Скрывает RallyPoint флаги!
Задержка приказов 0.01 с
На двойной райтклик в точку срабатывают оба приказа! [исправлено за счет camerafix]

Почему нельзя оставить move:
если герою оставить движение, то shiftsmart не будет выполнен, пока войн не завершит текущий приказ.
» осторожно очень грубый код!
library ShiftDetectLib

 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"
  endglobals
 
 nothing OrderEffect(location p, string s){
  DestroyEffect(AddSpecialEffectLoc(s,p))
 }

 
boolean StopCond    (){return GetIssuedOrderId() == OrderId("setrally") or GetIssuedOrderId() == OrderId("smart") } 
nothing ShiftDetect (){

 unit     u  = GetTriggerUnit()
 location pa = GetUnitRallyPoint(u)
 location pb
 location pt 
 integer  ordertype
  

   
  if      GetOrderPointLoc()           != null {
   pt = Location(GetLocationX(GetOrderPointLoc()),GetLocationY(GetOrderPointLoc()))
   ordertype = 1
  }elseif GetOrderTargetUnit()         != null {
   pt = Location(GetUnitX(GetOrderTargetUnit()),GetUnitY(GetOrderTargetUnit()))
   ordertype = 2  
  }elseif GetOrderTargetDestructable() != null {
   pt = Location(GetDestructableX(GetOrderTargetDestructable()),GetDestructableY(GetOrderTargetDestructable(​)))
   ordertype = 3
  }elseif GetOrderTargetItem()         != null {
   pt = Location( GetItemX(GetOrderTargetItem()), GetItemY(GetOrderTargetItem()))
   ordertype = 4
  }
  PanCameraToTimed(GetCameraTargetPositionX()+0.1, GetCameraTargetPositionY()+0.1, 0)
  IssueImmediateOrder(u, "stop" ) 
 if GetIssuedOrderId() == OrderId("setrally") {
  OrderEffect(pt,OrderEffectC)
 }else{ 
   TriggerSleepAction( 0.01 )
   if      ordertype == 1 {
    pb = GetUnitRallyPoint(u)
   }elseif ordertype == 2 {
    pb = GetUnitLoc(GetUnitRallyUnit(u))
   }elseif ordertype == 3 {
    pb = GetDestructableLoc(GetUnitRallyDestructable(u))
   }elseif ordertype == 4 {
    pb = GetUnitLoc(GetUnitRallyUnit(u))
   } 


  if DistanceBetweenPoints (pa,pb) > 0.01  or ordertype != 1 {
   OrderEffect(pt,OrderEffectA)
  }else{
   OrderEffect(pt,OrderEffectB) 
  }
 
 }
 RemoveLocation(pa)
 RemoveLocation(pb)
 RemoveLocation(pt)
 pa = null
 pb = null
 pt = null
 u  = null
}

endlibrary
//===========================================================================
function InitTrig_ShiftDetect takes nothing returns nothing
  integer i = 0
  trigger t = CreateTrigger(  ) 

  
   loop
    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 )
  

endfunction
» Заменяемые модели
UI\Feedback\RallyPoint\NightElfRallyFlag.mdx
UI\Feedback\RallyPoint\OrcRallyFlag.mdx
UI\Feedback\RallyPoint\RallyPoint.mdx
UI\Feedback\RallyPoint\UndeadRallyFlag.mdx


Просмотров: 184

Jack-of-shadow #1 - 3 месяца назад 0
Внезапно решил попробовать, оказывается оно работает.
PT153 #2 - 3 месяца назад 0
Это без мемхака? И если да, то на каком патче?
Jack-of-shadow #3 - 3 месяца назад (отредактировано ) 0
PT153:
Это без мемхака? И если да, то на каком патче?
Без хака 1.26. По идее на всех должно работать. Единственное юнит не должен иметь 'amov' и должен уметь обучать войска.
И нужно заменить модели GetUnitRallyPoint на пустышки.

v 0.09

Нашел простой способ обойти срабатывание обоих приказов при дабл клике у статик камеры:
PanCameraToTimed(GetCameraTargetPositionX()+0.1, GetCameraTargetPositionY()+0.1, 0)