- Joined
- Mar 31, 2016
- Messages
- 657
Woot! One step closer... wait I have to define cost for every single upgrade and unit? @_@ dam cause i have like 500 (although roughly 200 won't use custom resources) in total, can the trigger handle that?
//=========================================================
library CustomResourcesCosts initializer Init uses CustomResources
//------------------------------------------------------------------------------------------------
globals
private constant boolean PRINT_WARNING = true
private group g_groupCancel = CreateGroup()
private timer g_timerCancel = CreateTimer()
private integer array g_upgradeTarget
private constant string GREEN = "|cff00ff00"
private constant string RED = "|cffff0000"
trigger g_triggerMultiOrderCancel = CreateTrigger()
endglobals
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
/*
//for Addon
601 -- units/structure/research/upgradeBuilding ID as parentKey -- >
saves boolean true for registered objects for prices purposes
call SaveBoolean(g_hashCR, objectId, 601, true)
if LoadBoolean(g_hashCR, objectId, 601) then ...
602 .. and up - for prices -- object ID as parent key
*/
function CustomResource_SaveCosts takes nothing returns nothing
local integer x=2 // we do not start from "1" as 1 is normal-wood
local integer parentKey
//is it object or research?
if udg_Resource_CostUnit>0 then
set parentKey = udg_Resource_CostUnit
elseif udg_Resource_CostResearch>0 then
set parentKey = udg_Resource_CostResearch
endif
call SaveBoolean(CustomResources_g_hashCR, parentKey, 601, true) // save "true" as sign that object is registered
loop
exitwhen x>CustomResources_g_customResourcesCount
call SaveInteger(CustomResources_g_hashCR, parentKey, 600+x, udg_Resource_Cost[x])
// remember resource2 cost at 602 key, resource3 at 603 key, .. etc
//reset for next object:
set udg_Resource_Cost[x] = 0
set x=x+1
endloop
//reset integers:
set udg_Resource_CostUnit = 0
set udg_Resource_CostResearch = 0
endfunction
//------------------------------------------------------------------------------------------------
function IsCustomCostDefined takes integer objectId returns boolean // object: unit/structure/upgrade-building/research
return LoadBoolean(CustomResources_g_hashCR, objectId, 601)
endfunction
//------------------------------------------------------------------------------------------------
function GetObjectCost takes integer objectId, integer resourceNumber returns integer
// resourceNumber = defined in ResourceMUSHROOM and so on triggers, as udg_Resource_Number
// will not return value for resourceNumber=1 as it is normal war3 wood!
return LoadInteger(CustomResources_g_hashCR, objectId, 600+resourceNumber)
endfunction
//=========================================================
//------------------------TRIGGERS RELATED---------------------------------------------------
//=========================================================
//------------------------------------------------------------------------------
function CancelOrder_Enum takes nothing returns nothing
local unit u = GetEnumUnit()
call GroupRemoveUnit(g_groupCancel, u)
call IssueImmediateOrderById(u, 851976) //upgrades , researches , trains
call IssueImmediateOrderById(u, ORDER_stop) //for builders
set u=null
endfunction
function CancelOrder takes nothing returns nothing
call DisableTrigger(g_triggerMultiOrderCancel)
call ForGroup(g_groupCancel, function CancelOrder_Enum)
call EnableTrigger(g_triggerMultiOrderCancel)
endfunction
function UnitCancelOrder takes unit u returns nothing
call GroupAddUnit(g_groupCancel, u)
call TimerStart(g_timerCancel, 0.00, false, function CancelOrder)
endfunction
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function PlayerHasMoneyForObject takes player pla, integer objectId returns boolean
local integer x=2
local integer cost=0
local string s = " "
local boolean hasMoney = true
loop
exitwhen x>CustomResources_g_customResourcesCount
set cost = GetObjectCost(objectId, x)
if cost>0 then
if cost <= GetPlayerCustomResource(pla, x) then
set s = s + (GREEN+udg_Resource_Name[x] + "|r(" + I2S(cost) + ") ") // green color
else // not enough resource nr x
set hasMoney=false
set s = s + (RED+udg_Resource_Name[x] + "|r(" + I2S(cost) + ") ") // red color
endif
endif
set x=x+1
endloop
if (not hasMoney) and PRINT_WARNING then
call DisplayTextToPlayer(pla, 0.00, 0.00, "Not enough resources: " + s)
endif
return hasMoney
endfunction
//-------------------------------------------------------------------------------------------
function PlayerPayPriceForObject takes player pla, integer objectId returns nothing
local integer x=2
local integer cost=0
loop
exitwhen x>CustomResources_g_customResourcesCount
set cost = GetObjectCost(objectId, x)
if cost>0 then
call AdjustPlayerCustomResource(pla, x, - cost)
//event
set udg_Resource_Player = pla
set udg_Resource_Value = -cost
set udg_Resource_Event = 0.00
set udg_Resource_Event = I2R(x)
set udg_Resource_Event = 0.00
set udg_Resource_Player = null
set udg_Resource_Value = 0
endif
set x=x+1
endloop
endfunction
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function Trig_MultiOrder_Cond takes nothing returns boolean
return IsCustomCostDefined(GetIssuedOrderId())
endfunction
//------------------------------------------------------------------------------
function Trig_MultiOrder_Act takes nothing returns nothing
local integer h = GetHandleId(GetTriggerEventId())
local unit u = GetOrderedUnit()
local player pla = GetOwningPlayer(u)
local integer ord = GetIssuedOrderId()
local integer id = GetUnitUserData(u)
if h==38 then // instant: TRAIN UNIT or RESEARCH or UPGRADE
//call BJDebugMsg("cost2: " + I2S(GetObjectCost(ord, 2)) + ", cost3: " + I2S(GetObjectCost(ord, 3)) + ", cost4: " + I2S(GetObjectCost(ord, 4)))
if not PlayerHasMoneyForObject(pla, ord) then //no $$$ ?
call UnitCancelOrder(u)
else //has $?, pay price:
set g_upgradeTarget[id] = ord //if it is UPGRADE save target-building (ord) as variable under number id
call PlayerPayPriceForObject(pla, ord)
endif
elseif h==39 and (UnitId2String(ord) != null) then // point-order: BUILD STRUCTURE
//call BJDebugMsg("cost2: " + I2S(GetObjectCost(ord, 2)) + ", cost3: " + I2S(GetObjectCost(ord, 3)) + ", cost4: " + I2S(GetObjectCost(ord, 4)))
if not PlayerHasMoneyForObject(pla, ord) then //no $$$ ?
call UnitCancelOrder(u)
endif // paying is executed under event EVENT_PLAYER_UNIT_CONSTRUCT_START
endif
set u=null
set pla=null
endfunction
//----------------------------------------------------------------------------------
//---------------------------trigger Begins Construction -------------------------
//----------------------------------------------------------------------------------
function Trig_BeginsConstr_Cond takes nothing returns boolean
return IsCustomCostDefined(GetUnitTypeId(GetConstructingStructure()))
endfunction
//------------------------------------------------------------------
function Trig_BeginsConstr_Act takes nothing returns nothing
local unit u = GetConstructingStructure()
local player pla = GetOwningPlayer(u)
local integer objectId = GetUnitTypeId(u)
if not PlayerHasMoneyForObject(pla, objectId) then //no $$$ ?
call UnitCancelOrder(u)
else //has $?, pay price:
call PlayerPayPriceForObject(pla, objectId)
endif
set u=null
set pla=null
endfunction
//---------------------------------------------------------------------------------------------
// --------------------------trigger CANCEL--------------------------------------------------
//---------------------------------------------------------------------------------------------
private function GiveMoneyBackOnCancel takes player pla, integer objectId returns nothing
local integer x=2
local integer cost=0
loop
exitwhen x>CustomResources_g_customResourcesCount
set cost = GetObjectCost(objectId, x)
call AdjustPlayerCustomResource(pla, x, cost)
//event
set udg_Resource_Player = pla
set udg_Resource_Value = cost
set udg_Resource_Event = 0.00
set udg_Resource_Event = I2R(x)
set udg_Resource_Event = 0.00
set udg_Resource_Player = null
set udg_Resource_Value = 0
set x=x+1
endloop
endfunction
//---------------------------------------------------------------------------------------------
private function Trig_MultiOrderCancel_Actions takes nothing returns nothing
local integer h = GetHandleId(GetTriggerEventId())
local unit u = GetTriggerUnit() // the same for all 4 events
local player pla = GetOwningPlayer(u) // the same for all 4 events
local integer objectId
//---------------------------------------------------------------------------
if h==33 then // EVENT_PLAYER_UNIT_TRAIN_CANCEL
set objectId = GetTrainedUnitType()
if IsCustomCostDefined(objectId) then
call GiveMoneyBackOnCancel(pla, objectId)
//call DisplayTextToForce( GetPlayersAll(), GetUnitName(u) + " canceled custom-cost TRAIN" )
endif
//---------------------------------------------------------------------------
elseif h==27 then // EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL
set objectId = GetUnitTypeId(u)
if IsCustomCostDefined(objectId) then
call GiveMoneyBackOnCancel(pla, objectId)
//call DisplayTextToForce( GetPlayersAll(), "canceled custom-cost BUILD" )
endif
//---------------------------------------------------------------------------
elseif h==36 then // EVENT_PLAYER_UNIT_RESEARCH_CANCEL
set objectId = GetResearched()
if IsCustomCostDefined(objectId) then
call GiveMoneyBackOnCancel(pla, objectId)
//call DisplayTextToForce( GetPlayersAll(), "canceled custom-cost research" )
endif
//---------------------------------------------------------------------------
elseif h==30 then // EVENT_PLAYER_UNIT_UPGRADE_CANCEL
set objectId = g_upgradeTarget[GetUnitUserData(u)] // upgrade TARGET building
// (gives Keep - if Keep cancels upgrade and revert itself to TownHall)
if IsCustomCostDefined(objectId) then
call GiveMoneyBackOnCancel(pla, objectId)
//call DisplayTextToForce( GetPlayersAll(), "canceled custom-cost upgrade-building" )
endif
//---------------------------------------------------------------------------
endif
set u=null
set pla=null
endfunction
//=========================================================
//=========================================================
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerAddCondition( t, Condition(function Trig_MultiOrder_Cond))
call TriggerAddAction( t, function Trig_MultiOrder_Act )
set t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_CONSTRUCT_START )
call TriggerAddCondition( t, Condition( function Trig_BeginsConstr_Cond ) )
call TriggerAddAction( t, function Trig_BeginsConstr_Act )
call TriggerRegisterAnyUnitEventBJ( g_triggerMultiOrderCancel, EVENT_PLAYER_UNIT_TRAIN_CANCEL )
call TriggerRegisterAnyUnitEventBJ( g_triggerMultiOrderCancel, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL )
call TriggerRegisterAnyUnitEventBJ( g_triggerMultiOrderCancel, EVENT_PLAYER_UNIT_RESEARCH_CANCEL )
call TriggerRegisterAnyUnitEventBJ( g_triggerMultiOrderCancel, EVENT_PLAYER_UNIT_UPGRADE_CANCEL )
call TriggerAddAction( g_triggerMultiOrderCancel, function Trig_MultiOrderCancel_Actions )
set t=null
endfunction
endlibrary