Starcraft-2

如何讓worker攜帶多種資源?

  • November 23, 2014

我想做一個相當簡單的(?)改變:我希望探測器(或其他工人)能夠同時攜帶多種礦物。我希望調查能夠:

  • 接近礦場
  • 收集礦物
  • 再次收集礦物
  • … 然後再次…
  • 然後把它帶回基地

原本我以為是worker的簡單數據變化:我以為可以簡單的把行為Carry Mineral Field Minerals->(Basic) Stats; Maximum Stack Count從1改成5。可惜,一旦探針採集到礦物,它就會自動返回。

在仔細考慮之後,我認為可能有一些內置觸發器,檢查工人是否已經攜帶礦物 - 如果是這樣 - 發出“返回”命令。從那時起,我一直在研究可用的觸發器、腳本、解壓 Liberty 和 Swarm 模組,但到目前為止 - 我什麼也沒找到。

有任何想法嗎?指針?

我是改裝新手,我不打算做任何大事。只是想破解這個進行一些實驗……

我知道如何增加收集時間以及如何使探測器在一個更新檔中只攜帶更多礦物質……但我想特別讓探測器在它返回之前多次重新觸發收集(並在兩者之間增加一些延遲)

此外,我不在乎將礦物與氣體或任何其他資源混合時會發生什麼。

遵循 user1337 的想法,我提出了以下想法:

  • 當一個工人在收割時,記住它是從哪個礦場做的
  • 當工人​​完成收割後,取出貨物並重複收割順序,再次為同一礦場。
  • 有一個“堆棧計數”來記住上述點發生了多少次。當達到門檻值時,讓設備正常返回。
  • 返回的礦物數量應乘以堆疊數量。

第一點是要記住,在單位中,它是從哪個礦場採集的。該資訊將在稍後返回時使用。查看問題/答案探測返回:從哪個礦區採集資源?單位的自定義變數/欄位?

(Trigger) onStartGettingResources
Events
   TriggerAddEventUnitAbility(null, "ProbeHarvest", 0, c_abilHarvestStageHarvest, false)
   TriggerAddEventUnitAbility(null, "DroneHarvest", 0, c_abilHarvestStageHarvest, false)
   TriggerAddEventUnitAbility(null, "SCVHarvest", 0, c_abilHarvestStageHarvest, false)
Local Variables
   minerals <unit>
       EventUnitTargetUnit()
Actions
   StoreUnitWithUnit(EventUnit(), "miningFrom", minerals) //custom function for custom "fields" in a unit

第二個觸發應該發生在工人完成收割時。實驗表明,當它開始攜帶礦物時,它最好通過改變單位行為來觸發。在技​​能階段觸發它ApproachDropOff會導致動畫短時卡頓。

(Trigger) onProbeGetResources
Events
   TriggerAddEventUnitBehaviorChange(null, "CarryMineralFieldMinerals", c_unitBehaviorChangeActivate)
Conditions
   Comparison(UnitGetType(EventUnit()), ==, "Probe")
Actions
   GatherResourcesStack("ProbeHarvest", 0) //custom function, see below

.... //Similar triggers for SCV and Drone

(Global variable) g_gatherStackCount <constant int>
   4

(Action definition) GatherResourcesStack
Parameters
   gatherCommand <Ability Command - Unit>
Local Variables
   mineralPatch <unit>
       GetUnitWithUnit(EventUnit(), "miningFrom")
   stackCount <int>
       GetIntWithUnit(EventUnit(), "minigStackCount")
Actions
   SetVariable(stackCount, ArithmeticInt(stackCount, +, 1))
   IfThenElse()
       if
           Comparison(stackCount, <, g_gatherStackCount)
       then
           UnitSetPropertyFixed(EventUnit(), c_unitPropCarriedMinerals, 0.0)
           StoreIntWithUnit(EventUnit(), "miningStackCount", stackCount)
           UnitBehaviorRemove(EventUnit(), "CarryMineralFieldMinerals", 1)
           UnitIssueOrder(EventUnit(), OrderTargetingUnit(gatherCommand, mineralPatch), c_orderQueueReplace)
       else
           StoreIntWithUnit(EventUnit(), "miningStackCount", 0)
           UnitSetPropertyFixed(EventUnit(), c_unitPropCarriedMinerals, 
               ArithmeticReal(
                   UnitGetPropertyFixed(EventUnit(), c_unitPropCarriedMinerals, c_unitPropCurrent),
                   *, g_gatherStackCount
               )
           )

引用自:https://gaming.stackexchange.com/questions/192365