Warcraft III resources & community, 2003–2006 · archived

As suspected... I need help with my scripts.

46 posts
#46
Ich war noch nicht fertig. ~~
Das Forum hat nur mal eben zehn Minuten (nun gut, wohl etwas weniger) gebraucht, um mich von der Eintragung wieder zurückzubringen.

... Du hast das, was ich eben schrieb, nie konkret ausgesagt und es hat sich mir, da du stets meine komplette Struktur geändert hast, auch nicht aus dem Quelltext erschlossen.

Wie auch immer:

I will use UmMi's idea of a local trigger, hoping that "DestroyTrigger(trigger)" also destroys a triggers events.
Then I will create a new trigger on every death of a cat, which I grant the same function as "action" but an ever new generated event.

In a minute or two I will post the altered code as postscript.

postscript (okay, not only two minutes):

Just tested - It works.

global variables:
trigger array udg_Katze_Steuerung

Easier as the triggers have to be accessed by three functions.

"global" functions
//This enables the picked players to train new cats.

function Trig_Katze_Subactions1 takes nothing returns nothing
  call SetPlayerTechMaxAllowed(GetEnumPlayer(),'ndog',-1)
endfunction

//This disables the picked players to train new cats.

function Trig_Katze_Subactions2 takes nothing returns nothing
  call SetPlayerTechMaxAllowed(GetEnumPlayer(),'ndog',0)
endfunction

//If a unit enters a cats range, this returns if the unit is a possible target.

function Trig_Katze_Steuerung_Conditions takes nothing returns boolean
  return GetUnitTypeId(GetTriggerUnit()) == 'nfro' or GetUnitTypeId(GetTriggerUnit()) == 'ndwm' or GetUnitTypeId(GetTriggerUnit()) == 'nrat'
endfunction

//These ones are all identical exept for the array indices
//They make the specified cat attack the unit, which entered its range.

function Trig_Katze_Steuerung_1_Actions takes nothing returns nothing
  call DisableTrigger(udg_Katze_Steuerung[0])
  call DisableTrigger(gg_trg_Katze_Steuerung_1_Streifzug)
  call IssueTargetOrder(udg_Katze[0],"attack",GetTriggerUnit())
endfunction

function Trig_Katze_Steuerung_2_Actions takes nothing returns nothing
  call DisableTrigger(udg_Katze_Steuerung[1])
  call DisableTrigger(gg_trg_Katze_Steuerung_2_Streifzug)
  call IssueTargetOrder(udg_Katze[1],"attack",GetTriggerUnit())
endfunction

function Trig_Katze_Steuerung_3_Actions takes nothing returns nothing
  call DisableTrigger(udg_Katze_Steuerung[2])
  call DisableTrigger(gg_trg_Katze_Steuerung_3_Streifzug)
  call IssueTargetOrder(udg_Katze[2],"attack",GetTriggerUnit())
endfunction

function Trig_Katze_Steuerung_4_Actions takes nothing returns nothing
  call DisableTrigger(udg_Katze_Steuerung[3])
  call DisableTrigger(gg_trg_Katze_Steuerung_4_Streifzug)
  call IssueTargetOrder(udg_Katze[3],"attack",GetTriggerUnit())
endfunction

function Trig_Katze_Steuerung_5_Actions takes nothing returns nothing
  call DisableTrigger(udg_Katze_Steuerung[4])
  call DisableTrigger(gg_trg_Katze_Steuerung_5_Streifzug)
  call IssueTargetOrder(udg_Katze[4],"attack",GetTriggerUnit())
endfunction

function Trig_Katze_Steuerung_6_Actions takes nothing returns nothing
  call DisableTrigger(udg_Katze_Steuerung[5])
  call DisableTrigger(gg_trg_Katze_Steuerung_6_Streifzug)
  call IssueTargetOrder(udg_Katze[5],"attack",GetTriggerUnit())
endfunction


trigger "Katze Hilfe 1"

//This filters out the players, which did not build the cat currently being under construction but would be able to.

function Trig_Katze_Hilfe_1_Conditions takes nothing returns boolean
  return IsPlayerInForce(GetFilterPlayer(),udg_Streitmacht[0]) and GetFilterPlayer() != GetOwningPlayer(udg_tempEinheit)
endfunction

//This stops training of a cat if the maximum amount of cats has already been reached.
//It also counts each try to train a cat.

function Trig_Katze_Hilfe_1_Actions takes nothing returns nothing
  if GetIssuedOrderId() == 'ndog' then
    set udg_tempEinheit = GetTriggerUnit()
    if udg_Zaehler[13] == 5 then
      call IssueImmediateOrder(udg_tempEinheit,"stop")
    else
      set udg_tempSpielergruppe = GetPlayersMatching(Condition(function Trig_Katze_Hilfe_1_Conditions))
      call ForForce(udg_tempSpielergruppe,function Trig_Katze_Subactions2)
      set udg_Zaehler[13] = udg_Zaehler[13] + 1
    endif
  endif
endfunction

function InitTrig_Katze_Hilfe_1 takes nothing returns nothing
  set gg_trg_Katze_Hilfe_1 = CreateTrigger()
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Hilfe_1,Player(0),EVENT_PLAYER_UNIT_ISSUED_ORDER,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Hilfe_1,Player(1),EVENT_PLAYER_UNIT_ISSUED_ORDER,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Hilfe_1,Player(2),EVENT_PLAYER_UNIT_ISSUED_ORDER,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Hilfe_1,Player(3),EVENT_PLAYER_UNIT_ISSUED_ORDER,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Hilfe_1,Player(4),EVENT_PLAYER_UNIT_ISSUED_ORDER,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Hilfe_1,Player(8),EVENT_PLAYER_UNIT_ISSUED_ORDER,null)
  call TriggerAddAction(gg_trg_Katze_Hilfe_1,function Trig_Katze_Hilfe_1_Actions)
endfunction


trigger "Katze Hilfe 2"
//This counts each training of a cat, that was stopped by the owning player.

function Trig_Katze_Hilfe_2_Actions takes nothing returns nothing
  if GetIssuedOrderId() == OrderId("stop") then
    set udg_Zaehler[13] = udg_Zaehler[13] - 1
    call DestroyForce(udg_tempSpielergruppe)
    call ForForce(udg_Streitmacht[0],function Trig_Katze_Hilfe_Subactions1)
  endif
endfunction

function InitTrig_Katze_Hilfe_2 takes nothing returns nothing
  set gg_trg_Katze_Hilfe_2 = CreateTrigger()
  call TriggerRegisterUnitEvent(gg_trg_Katze_Hilfe_2,udg_tempEinheit,ConvertUnitEvent(75))
  call TriggerAddAction(gg_trg_Katze_Hilfe_2,function Trig_Katze_Hilfe_2_Actions)
endfunction


trigger "Katze Bau"
//This enables/creates the controlling triggers for each of the six cats.

function Trig_Katze_Bau_Actions takes nothing returns nothing
  if GetTrainedUnitType() == 'ndog' then
    set udg_Katze[udg_Zaehler[13]] = GetTrainedUnit()
    call SetUnitOwner(udg_Katze[udg_Zaehler[13]],Player(15),true)
    if udg_Zaehler[13] == 0 then
      set udg_Katze_Steuerung[0] = CreateTrigger()
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[0],udg_Katze[0],750,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[0],udg_Katze[0],500,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[0],udg_Katze[0],250,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerAddAction(udg_Katze_Steuerung[0],function Trig_Katze_Steuerung_1_Actions)
      call EnableTrigger(gg_trg_Katze_Steuerung_1_Hilfe)
      call EnableTrigger(gg_trg_Katze_Steuerung_1_Streifzug)
      call ForForce(udg_Streitmacht[0],function Trig_Katze_Subactions1)
    elseif udg_Zaehler[13] == 1 then
      set udg_Katze_Steuerung[1] = CreateTrigger()
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[1],udg_Katze[1],750,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[1],udg_Katze[1],500,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[1],udg_Katze[1],250,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerAddAction(udg_Katze_Steuerung[1],function Trig_Katze_Steuerung_2_Actions)
      call EnableTrigger(gg_trg_Katze_Steuerung_2_Hilfe)
      call EnableTrigger(gg_trg_Katze_Steuerung_2_Streifzug)
      call ForForce(udg_Streitmacht[0],function Trig_Katze_Subactions1)
    elseif udg_Zaehler[13] == 2 then
      set udg_Katze_Steuerung[2] = CreateTrigger()
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[2],udg_Katze[2],750,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[2],udg_Katze[2],500,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[2],udg_Katze[2],250,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerAddAction(udg_Katze_Steuerung[2],function Trig_Katze_Steuerung_3_Actions)
      call EnableTrigger(gg_trg_Katze_Steuerung_3_Hilfe)
      call EnableTrigger(gg_trg_Katze_Steuerung_3_Streifzug)
      call ForForce(udg_Streitmacht[0],function Trig_Katze_Subactions1)
    elseif udg_Zaehler[13] == 3 then
      set udg_Katze_Steuerung[3] = CreateTrigger()
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[3],udg_Katze[3],750,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[3],udg_Katze[3],500,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[3],udg_Katze[3],250,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerAddAction(udg_Katze_Steuerung[3],function Trig_Katze_Steuerung_4_Actions)
      call EnableTrigger(gg_trg_Katze_Steuerung_4_Hilfe)
      call EnableTrigger(gg_trg_Katze_Steuerung_4_Streifzug)
      call ForForce(udg_Streitmacht[0],function Trig_Katze_Subactions1)
    elseif udg_Zaehler[13] == 4 then
      set udg_Katze_Steuerung[4] = CreateTrigger()
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[4],udg_Katze[4],750,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[4],udg_Katze[4],500,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[4],udg_Katze[4],250,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerAddAction(udg_Katze_Steuerung[4],function Trig_Katze_Steuerung_5_Actions)
      call EnableTrigger(gg_trg_Katze_Steuerung_5_Hilfe)
      call EnableTrigger(gg_trg_Katze_Steuerung_5_Streifzug)
      call ForForce(udg_Streitmacht[0],function Trig_Katze_Subactions1)
    else
      set udg_Katze_Steuerung[5] = CreateTrigger()
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[5],udg_Katze[5],750,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[5],udg_Katze[5],500,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerRegisterUnitInRange(udg_Katze_Steuerung[5],udg_Katze[5],250,Condition(function Trig_Katze_Steuerung_Conditions))
      call TriggerAddAction(udg_Katze_Steuerung[5],function Trig_Katze_Steuerung_6_Actions)
      call EnableTrigger(gg_trg_Katze_Steuerung_6_Hilfe)
      call EnableTrigger(gg_trg_Katze_Steuerung_6_Streifzug)
      call ForForce(udg_Streitmacht[0],function Trig_Katze_Subactions2)
    endif
    call DestroyForce(udg_tempSpielergruppe)
  endif
endfunction

function InitTrig_Katze_Bau takes nothing returns nothing
  set gg_trg_Katze_Bau = CreateTrigger()
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Bau,Player(0),EVENT_PLAYER_UNIT_TRAIN_FINISH,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Bau,Player(1),EVENT_PLAYER_UNIT_TRAIN_FINISH,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Bau,Player(2),EVENT_PLAYER_UNIT_TRAIN_FINISH,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Bau,Player(3),EVENT_PLAYER_UNIT_TRAIN_FINISH,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Bau,Player(4),EVENT_PLAYER_UNIT_TRAIN_FINISH,null)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Bau,Player(8),EVENT_PLAYER_UNIT_TRAIN_FINISH,null)
  call TriggerAddAction(gg_trg_Katze_Bau,function Trig_Katze_Bau_Actions)
endfunction


trigger "Katze Tod"
//This stops/destroys the controlling triggers for each of the six cats.

function Trig_Katze_Tod_Actions takes nothing returns nothing
  if GetUnitTypeId(GetDyingUnit()) == 'ndog' then
    if udg_Zaehler[13] == 5 then
      call DestroyTrigger(udg_Katze_Steuerung[5])
      call DisableTrigger(gg_trg_Katze_Steuerung_6_Hilfe)
      call DisableTrigger(gg_trg_Katze_Steuerung_6_Streifzug)
    elseif udg_Zaehler[13] == 4 then
      call DestroyTrigger(udg_Katze_Steuerung[4])
      call DisableTrigger(gg_trg_Katze_Steuerung_5_Hilfe)
      call DisableTrigger(gg_trg_Katze_Steuerung_5_Streifzug)
    elseif udg_Zaehler[13] == 3 then
      call DestroyTrigger(udg_Katze_Steuerung[3])
      call DisableTrigger(gg_trg_Katze_Steuerung_4_Hilfe)
      call DisableTrigger(gg_trg_Katze_Steuerung_4_Streifzug)
    elseif udg_Zaehler[13] == 2 then
      call DestroyTrigger(udg_Katze_Steuerung[2])
      call DisableTrigger(gg_trg_Katze_Steuerung_3_Hilfe)
      call DisableTrigger(gg_trg_Katze_Steuerung_3_Streifzug)
    elseif udg_Zaehler[13] == 1 then
      call DestroyTrigger(udg_Katze_Steuerung[1])
      call DisableTrigger(gg_trg_Katze_Steuerung_2_Hilfe)
      call DisableTrigger(gg_trg_Katze_Steuerung_2_Streifzug)
    else
      call DestroyTrigger(udg_Katze_Steuerung[0])
      call DisableTrigger(gg_trg_Katze_Steuerung_1_Hilfe)
      call DisableTrigger(gg_trg_Katze_Steuerung_1_Streifzug)
    endif
    set udg_Zaehler[13] = udg_Zaehler[13] - 1
    call ForForce(udg_Streitmacht[0],function Trig_Katze_Subactions1)
  endif
endfunction

function InitTrig_Katze_Tod takes nothing returns nothing
  set gg_trg_Katze_Tod = CreateTrigger()
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Tod,Player(15),EVENT_PLAYER_UNIT_DEATH,null)
  call TriggerAddAction(gg_trg_Katze_Tod,function Trig_Katze_Tod_Actions)
endfunction


trigger "Katze Steuerung 1 Hilfe"
//While ordered to attack, the cat's controlling triggers are turned off.
//This reactivates them on death of the target.

function Trig_Katze_Steuerung_1_Hilfe_Actions takes nothing returns nothing
  if GetKillingUnit() == udg_Katze[0] then
    call EnableTrigger(udg_Katze_Steuerung[0])
    call EnableTrigger(gg_trg_Katze_Steuerung_1_Streifzug)
  endif
endfunction

function InitTrig_Katze_Steuerung_1_Hilfe takes nothing returns nothing
  set gg_trg_Katze_Steuerung_1_Hilfe = CreateTrigger()
  call DisableTrigger(gg_trg_Katze_Steuerung_1_Hilfe)
  call TriggerRegisterPlayerUnitEvent(gg_trg_Katze_Steuerung_1_Hilfe,Player(15),EVENT_PLAYER_UNIT_DEATH,null)
  call TriggerAddAction(gg_trg_Katze_Steuerung_1_Hilfe,function Trig_Katze_Steuerung_1_Hilfe_Actions)
endfunction


trigger "Katze Steuerung 1 Streifzug"
//This makes the cat wandering around like the ability 'AWan' but more randomly.

function Trig_Katze_Steuerung_1_Streifzug_Actions takes nothing returns nothing
  local location array tempPunkt
  local real array tempReal
  local rect tempGebiet
  set tempPunkt[0] = GetUnitLoc(udg_Katze[0])
  set tempReal[0] = GetLocationX(tempPunkt[0])
  set tempReal[1] = GetLocationY(tempPunkt[0])
  set tempGebiet = Rect(tempReal[0]-500,tempReal[1]-500,tempReal[0]+500,tempReal[1]+500)
  set tempReal[0] = GetRectMinX(tempGebiet)
  set tempReal[1] = GetRectMaxX(tempGebiet)
  set tempReal[2] = GetRectMinY(tempGebiet)
  set tempReal[3] = GetRectMaxY(tempGebiet)
  set tempPunkt[1] = Location(GetRandomReal(tempReal[0],tempReal[1]),GetRandomReal(tempReal[2],tempReal[3]))
  call IssuePointOrderLoc(udg_Katze[0],"move",tempPunkt[1])
  call TriggerSleepAction(3.00)
  call RemoveLocation(tempPunkt[0])
  call RemoveLocation(tempPunkt[1])
  call RemoveRect(tempGebiet)
  set tempPunkt[0] = null
  set tempPunkt[1] = null
  set tempGebiet = null
endfunction

function InitTrig_Katze_Steuerung_1_Streifzug takes nothing returns nothing
  set gg_trg_Katze_Steuerung_1_Streifzug = CreateTrigger()
  call DisableTrigger(gg_trg_Katze_Steuerung_1_Streifzug)
  call TriggerRegisterTimerEvent(gg_trg_Katze_Steuerung_1_Streifzug,GetRandomReal(10.00,20.00),true)
  call TriggerAddAction(gg_trg_Katze_Steuerung_1_Streifzug,function Trig_Katze_Steuerung_1_Streifzug_Actions)
endfunction


There are ten more triggers, which are simple copies of "Katze Steuerung 1 Hilfe" and "Katze Steuerung 1 Streifzug" with the numbers increasing up to six and with other indices for the cat-array.

There is a lot more to enhance but yet it works and as I and others spent a pretty big amount of time to make it do, I would dare to say that it is good work.

What may be better?

A filter in EventListener or an "if"-structure in "Actions"-function?
Returning values from one function to another or using globals?

(Before dooming globals from the beginning - think about that they are much saver than locals, do not need more space and are as useful while functions are not supposed to work parallel.)