[Solved] Add a specific condition to jass script

Status
Not open for further replies.
Level 1
Joined
Jun 21, 2015
Messages
2
Hello everyone, glad to see there is still activity in these forums.

I have been away for a few years now and Im trying to fix a map to play with friends, and it uses the script attached below at the bottom. It is an item combine system that is functioning 100% and consists of two triggers.

I do not take credit for it and I have no clue who made it or to give credit too, never the less the map exists with it unprotected and I am not trying to steal or take credit for anything.

I would simply like to add a boolean check similar to this to the FIRST script, so it checks for a unit type manipulating items before peforming any actions. How can this be done?

Thank you and very much appreciated.

I believe the script can be found, open source, somewhere on the forums but I am not sure where and/or how, but it is definitely made for public use and I give credit for it.

JASS:
function Trig_fdgssdfg_Conditions takes nothing returns boolean
    if ( not ( GetUnitTypeId(GetManipulatingUnit()) == GetUnitTypeId(udg_UNITTYPE[GetConvertedPlayerId(GetOwningPlayer(GetManipulatingUnit()))]) ) ) then
        return false
    endif
    return true
endfunction

function Trig_fdgssdfg_Actions takes nothing returns nothing
endfunction

//===========================================================================
function InitTrig_fdgssdfg takes nothing returns nothing
    set gg_trg_fdgssdfg = CreateTrigger(  )
    call TriggerAddCondition( gg_trg_fdgssdfg, Condition( function Trig_fdgssdfg_Conditions ) )
    call TriggerAddAction( gg_trg_fdgssdfg, function Trig_fdgssdfg_Actions )
endfunction



JASS:
library DDItemCombineBasic initializer Init

    globals
        // *** Edit to your own will ***
		private constant string ITEM_COMBINE_EFFECT = "Abilities\\Spells\\Items\\AIlm\\AIlmTarget.mdl"
		private constant string ATTACH_POINT		= "origin"
        // *** End edit ***
	
        private sound ItemCombineSound = null
        private integer array CType[8191]
		private integer ItemN = 0
    endglobals

    function NewItemGroup takes nothing returns nothing
        local integer i = ItemN*6 + 7
        local integer h = 1
        set ItemN = ItemN + 1

        loop
        exitwhen (h == 7)
            set udg_CItemType[i] = udg_CItemType[h]
            set udg_CItemType[h] = 0
            set h = h + 1
            set i = i + 1
        endloop
        set CType[ItemN-1] = udg_CItemType[0]
        set udg_CItemType[0] = 0
    endfunction

    private function UnitRemoveItemById takes unit whichUnit, integer itemId returns nothing
        local integer i = 0
        local item it
        
        loop
        exitwhen (i >= bj_MAX_INVENTORY)
            set it = UnitItemInSlot(whichUnit, i)
            if GetItemTypeId(it) == itemId then
                call RemoveItem(it)
                exitwhen (true)
            endif
            set i = i + 1
        endloop
        set it = null
    endfunction

    private function Actions takes nothing returns nothing
        local integer n = 0
        local integer array it
        local integer i = 7
        local integer h = 0
        local integer x = 0
        local unit u = GetTriggerUnit()
        local boolean b = true
        local integer y = 0
        local integer z = 0
        local integer array hero_item_type

        // Get hero items
        loop
        exitwhen (x >= bj_MAX_INVENTORY)
            set hero_item_type[x] = GetItemTypeId(UnitItemInSlot(u, x))
            set x = x + 1
        endloop

        loop
        exitwhen (n >= ItemN)
            set h = i + 6
            
            set x = 0
            set it[x] = hero_item_type[x]
            set x = x + 1
            set it[x] = hero_item_type[x]
            set x = x + 1
            set it[x] = hero_item_type[x]
            set x = x + 1
            set it[x] = hero_item_type[x]
            set x = x + 1
            set it[x] = hero_item_type[x]
            set x = x + 1
            set it[x] = hero_item_type[x]
            set x = x + 1
            
            set y = 0 // N of items that hero has ()
            set z = 0 // N of items needed ()
            loop
            exitwhen (i >= h or udg_CItemType[i] == 0)
                set z = z + 1
                // Does unit contain item n
                set x = 0
                loop
                exitwhen (x >= bj_MAX_INVENTORY)
                    if (it[x] == udg_CItemType[i]) then
                        // Kick out the item
                        set it[x] = 0
                        set y = y + 1
                        // And increase by 1
                        exitwhen (true)
                    endif
                    set x = x + 1
                endloop
                
                set i = i + 1
            endloop
            set i = h
            
            if (y == z) then
                set h = i
                set i = i-6
                loop
                exitwhen (i > h or udg_CItemType[i] == 0)
                    call UnitRemoveItemById(u, udg_CItemType[i])
                    set i = i + 1
                endloop
                call UnitAddItemById(u, CType[n])
                call SetSoundPosition(ItemCombineSound, GetUnitX(u), GetUnitY(u), 0.)
                call StartSound(ItemCombineSound)
                call DestroyEffect(AddSpecialEffectTarget(ITEM_COMBINE_EFFECT, u, ATTACH_POINT))
                set u = null
                return
            endif
            
            set n = n + 1
        endloop
    endfunction

    //===========================================================================
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_PICKUP_ITEM )
        call TriggerAddAction( t, function Actions )

        call Preload(ITEM_COMBINE_EFFECT)

        set ItemCombineSound = CreateSound( "Abilities\\Spells\\Orc\\AncestralSpirit\\AncestralSpirit.wav", false, true, true, 10, 10, "" )
        call SetSoundParamsFromLabel( ItemCombineSound, "AncestralSpirit" )
        call SetSoundDuration( ItemCombineSound, 1756 )
        call SetSoundPitch(ItemCombineSound, 1.2)
        call SetSoundVolume(ItemCombineSound, 100)
    endfunction

endlibrar
 
Last edited by a moderator:
Welcome the hive! :)

Simply add a condition to the second script like so. The "Init" function is where events, conditions, and actions are all registered. Events control when the trigger is executed, and conditions are any checks to be made before the actions are executed.

You can make a new function and copy and paste your contents into it. Then we use TriggerAddCondition to link it to the trigger. This should work, for example:
JASS:
    // our condition function 
    private function CheckUnit takes nothing returns boolean
        if ( not ( GetUnitTypeId(GetManipulatingUnit()) == GetUnitTypeId(udg_UNITTYPE[GetConvertedPlayerId(GetOwningPlayer(GetManipulatingUnit()))]) ) ) then
            return false
        endif
        return true
    endfunction

//===========================================================================
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_PICKUP_ITEM )
        call TriggerAddCondition(t, Condition(function CheckUnit)) // add this line
        call TriggerAddAction( t, function Actions )

        call Preload(ITEM_COMBINE_EFFECT)

        set ItemCombineSound = CreateSound( "Abilities\\Spells\\Orc\\AncestralSpirit\\AncestralSpirit.wav", false, true, true, 10, 10, "" )
        call SetSoundParamsFromLabel( ItemCombineSound, "AncestralSpirit" )
        call SetSoundDuration( ItemCombineSound, 1756 )
        call SetSoundPitch(ItemCombineSound, 1.2)
        call SetSoundVolume(ItemCombineSound, 100)
    endfunction

That is just an excerpt of the code. The rest of the script was omitted.

You can also reduce the condition down if you'd like. It doesn't matter too much, but it is neater:
JASS:
private function CheckUnit takes nothing returns boolean
        return GetUnitTypeId(GetManipulatingUnit()) == GetUnitTypeId(udg_UNITTYPE[GetConvertedPlayerId(GetOwningPlayer(GetManipulatingUnit()))]) 
endfunction
 
Status
Not open for further replies.
Top