1. Find your way through the deepest dungeon in the 18th Mini Mapping Contest Poll.
    Dismiss Notice
  2. A brave new world lies beyond the seven seas. Join the 34th Modeling Contest today!
    Dismiss Notice
  3. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
Hive 3 Remoosed BETA - NOW LIVE. Go check it out at BETA Hive Workshop! Post your feedback in this new forum BETA Feedback.
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Super imba hard to make spell

Discussion in 'World Editor Help Zone' started by best_player_88, Jan 5, 2012.

  1. best_player_88

    best_player_88

    Joined:
    Dec 19, 2007
    Messages:
    1,180
    Resources:
    2
    Maps:
    2
    Resources:
    2
    I wanna make a spell that cause units in 250 area to have their mana cap set to 100 for 10 seconds, which means any spells that required more than that will be unable to be cast.
    The thing is: heroes have more than 100 cap :D and int is hard to controll since they have items :D.
    So... without further edu: I gonna ask which way is the easiest and most buggless, please say your opinion:

    1) Setting the hero int to int that sum up in 100 mana: the hero will have buff and whenever the buff removed the hero mana will be set to the diffult (starting int + int gain = bug since i need to use special settings for each hero since this skill is undetected) additiional bug: hero gain level gets int and there is gonna be trigger that remove the hero ability to gain int when level up.

    2) Making the hero mana cap to -1000000 with item based skills, then giving him +100 with int based skill.
    Problams: int gain mana cap, which is undetected...

    3) making the hero have buff that check whenever he use a skill that cost more than 100 mana, then make him silenced for 10 seconds.
    Problams: the spell was never intended to silence, just prevent high cost abilities. another problam: the mana for each spell will have to be set on setting since its undetectable.

    4) making trigger that makes the hero mana set to 100 each and any 0.25 seconds.
    problam: regeneration update faster than that, I wouldnt care if the hero gets 100 mana fast but its forbiden to ever get more than that.

    Please give me your opinion about the best way to create this spell or give more options.
    Thanks.
     
  2. Boar

    Boar

    Joined:
    Oct 10, 2009
    Messages:
    418
    Resources:
    0
    Resources:
    0
    Or you could check whenever an ability that costs over 100 mana is being cast, then issue order "STOP" to triggering unit.
     
  3. maddeem

    maddeem

    Joined:
    Jan 1, 2011
    Messages:
    1,325
    Resources:
    6
    Icons:
    1
    Maps:
    2
    Spells:
    3
    Resources:
    6
    This would work.
    • No More Then 100
      • Events
        • Time - Every 0.03 seconds of game time
      • Conditions
      • Actions
        • Custom script: set bj_wantDestroyGroup = true
        • Unit Group - Pick every unit in (Units in (Playable map area) matching (((Matching unit) has buff Mana Flare) Equal to True)) and do (Actions)
          • Loop - Actions
            • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • (Mana of (Picked unit)) Greater than 100.00
              • Then - Actions
                • Unit - Set mana of (Picked unit) to 100.00
              • Else - Actions
     
  4. mckill2009

    mckill2009

    Joined:
    Mar 10, 2009
    Messages:
    4,696
    Resources:
    34
    Maps:
    5
    Spells:
    27
    JASS:
    2
    Resources:
    34
    none of the above specially #1 & #2, but #4 seems OK, and the 0.03 is OK for the loop...

    pick your units in 250AOE, set their mana to 100 (if their mana is above100)...
    save 10 seconds to a hashtable...
    add the unit to a group, loop the group for every 0.03 second, reducing the
    saved real (this is the timer)...
    in the loop, if mana is above 100, then set it to 100...

    Im not at home at the moment so cant provide a test map, but I can if
    you want it tonight, its not that hard...
     
  5. best_player_88

    best_player_88

    Joined:
    Dec 19, 2007
    Messages:
    1,180
    Resources:
    2
    Maps:
    2
    Resources:
    2
    how can mana cost be detected?

    Note: I alllready created the skill and it is well made :D exept for the minor bug that removing the buff will not remove the mana regeneration pause, oh well, still wanna know if there is a way.
    For those who wondered, I used #4 with some extra actions that allow multicasts and ally cast not to interfear with the mana return, after all, after the unit mana was set to 100, it will regain the mana it had in the first place with its costum value.
    And, I used each 0.20 seconds, does that not quike enough?
    If you want, I could play it with you :D so you see mckill2009
     
  6. rysnt11

    rysnt11

    Joined:
    Jan 21, 2010
    Messages:
    2,051
    Resources:
    0
    Resources:
    0
    best_player_88's description


    the solution is above...
     
  7. shadowvzs

    shadowvzs

    Joined:
    Nov 13, 2006
    Messages:
    1,803
    Resources:
    2
    Spells:
    2
    Resources:
    2
    u could use a harder methode what modify the max mana so unit cant use potion or trick out

    At map init, pls check the screenshot for makeing 2 ability but if u need only mana reduction then only 1 (ability based on item ability gain max mp)
    • Abilities2[1] = *your hp ability*
    • Abilities2[2] = *your mp ability*


    To header
    Code (vJASS):
     
    //add/decrease hp or mp
    function AddHPMP takes boolean HP, integer v, unit u returns nothing
        local integer a
        local integer s
        local integer i
        local integer l
        local integer cv
        local integer mv

        if HP then
            set a = udg_Abilities2[1]
        else
            set a = udg_Abilities2[2]
        endif

        if (v >= 0) then
            set s = 1
            set cv = v
        else
            set s = 5
            set cv = v * - 1
        endif
        set mv = cv - (cv / 1000) * 1000
        set l = cv / 1000
        set i = 1
        loop
            exitwhen i > l
            call UnitAddAbility( u, a )
            call SetUnitAbilityLevel( u, a, (4 + s) )
            call UnitRemoveAbility( u, a )
            set i = i + 1
        endloop
        set cv = mv
        set mv = cv - (cv / 100) * 100
        set l = cv / 100
        set cv = mv
        set i = 1
        loop
            exitwhen i > l
            call UnitAddAbility( u, a )
            call SetUnitAbilityLevel( u, a, (3 + s) )
            call UnitRemoveAbility( u, a )
            set i = i + 1
        endloop
        set mv = cv - (cv / 10) * 10
        set l = cv / 10
        set cv = mv
        set i = 1
        loop
            exitwhen i > l
            call UnitAddAbility( u, a )
            call SetUnitAbilityLevel( u, a, (2 + s) )
            call UnitRemoveAbility( u, a )
            set i = i + 1
        endloop
        set i = 1
        loop
            exitwhen i > cv
            call UnitAddAbility( u , a )
            call SetUnitAbilityLevel( u, a, (1 + s) )
            call UnitRemoveAbility( u, a )
            set i = i + 1
        endloop
        set u = null
    endfunction
     


    then trigger where u want use

    Code (vJASS):

    function Trig_mp_debuff_Conditions takes nothing returns boolean
        return GetSpellAbilityId() == *debuffer ability id*
    endfunction

    function Trig_mp_debuff_Actions takes nothing returns nothing
    local boolean exit = false
    local unit u = GetTriggerUnit()
    local unit up = null
    local integer mp
    local integer mpdur = 10
    local integer pnr
    local integer array mps
    local player p
    local player p1 = GetTriggerPlayer()
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local group gr1 = CreateGroup()
    local group gr2 = CreateGroup()
    local integer cv
    //if u want change the duration then change the mpdur to any number what u want
    // change the 600 if u want shorter range
    call GroupEnumUnitsInRange(gr1,x,y,600.00,null)
    loop
       set up = FirstOfGroup(gr1)
       exitwhen up==null
       call GroupRemoveUnit(gr1, up)
    //delete the ==false if u want debuff the enemy and not  ur ally
       if (IsUnitEnemy(up, p1)==false) and (GetWidgetLife(up) > 0) then
           set cv = GetUnitUserData(up)
           set p = GetOwningPlayer(up)
           call GroupAddUnit(gr2, up)
           set mp = R2I ( GetUnitState(up, ConvertUnitState(2)) - 100.00)
           set mps[cv] = mp
            //if true then its mp, if false then mana modification
           call AddHPMP(false, mp*-1, up)
           call DisplayTextToPlayer( p,0,0, "|cffffff77" + GetUnitName(up) + "|r got mp debuff (-" + R2S (mp) + " )" )
       endif  
    endloop
    call TriggerSleepAction(mpdur)
    loop
       set up = FirstOfGroup(gr2)
       exitwhen up==null
        set p = GetOwningPlayer(up)
        call GroupRemoveUnit(gr2, up)
        set cv = GetUnitUserData(up)
        set mp = mps[cv]
        if (mp>0) then
          if (GetUnitState(up, ConvertUnitState(0)) > 0) then
           set mps[cv] = 0
           call AddHPMP(false, mp, up)
           call DisplayTextToPlayer( p,0,0, "|cffffff77" + GetUnitName(up) + "|r regained the lost mp (+" + R2S (mp) +" )" )
          endif
        endif  
    endloop
    call DestroyGroup(gr1)
    call DestroyGroup(gr2)
    set gr1 = null
    set gr2 = null
    set u = null
    set p = null
    set p1 = null
    endfunction

    //===========================================================================
    function InitTrig_MP_Debuff takes nothing returns nothing
        set gg_trg_MP_Debuff = CreateTrigger(  )
        call TriggerRegisterAnyUnitEventBJ( gg_trg_MP_Debuff, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddCondition( gg_trg_MP_Debuff, Condition( function Trig_mp_debuff_Conditions ) )
        call TriggerAddAction( gg_trg_MP_Debuff, function Trig_mp_debuff_Actions )
    endfunction


     
     

    Attached Files:

    • 1.jpg
      1.jpg
      File size:
      144.3 KB
      Views:
      85
  8. best_player_88

    best_player_88

    Joined:
    Dec 19, 2007
    Messages:
    1,180
    Resources:
    2
    Maps:
    2
    Resources:
    2
    Wow man, this was deep, really really deep. So basicly u set real = hero mana and loop MANA ITEM GAIN (with minus) and give it to the player uptill it has exactly 100 (with +1 +10 +100 +1000, -1, -10 -100 -1000)
    Did I get it?
    That was really really deep, seryesly,
    but it has 3 bugs: u cant return the player mana as soon as the spell dispelled or finished, and u cant track how much mana cap u removed from the hero. the final bug is that adding too many abilities causes brief lag that can become big, when spammed.
    It was really really deep and I couldnt think about it , but I found "easier" way to do it, since my map is complete, do you wanna see it? :D. :ogre_haosis:
     
  9. shadowvzs

    shadowvzs

    Joined:
    Nov 13, 2006
    Messages:
    1,803
    Resources:
    2
    Spells:
    2
    Resources:
    2
    u tryed or just talk?

    1. not deep coz most of jass u must copy only, 1st to header 2nd make a trigger, convert to custom text and past this instead that, u must do only 1-2 ability (depend if u need hp too) and put ur ability id where i wrote

    2.every mana store to array and its give back exactly how much was removed, also for this need the unit indexer trigger from gui damage engine http://www.hiveworkshop.com/forums/spells-569/gui-damage-engine-201016/
    displelled thing is right, this isnt dispell able, but have another methode, if u save to harshtable instead local array then u can make a trigger where the even unit begin cast and casted ability=purge etc and with load data from harshtable u can give back the removed mp and every harshtable value where the buff was stored to 0.
    (u can save to harshtable like this: 1st key is debuff number lets say 8, second is unit custom value) - u can see the example in my orpg template where hp buff was made like this just there still isnt buffable.
    (noticed at debuff trigger u dont debuff the units if there debuff value not 0 in harshtable, so u cant debuff the unit 2x before his buff expired and with this u ignore the only problem with harshtable methode)

    anyway what i removed was stored to here
    Code (vJASS):
    set mps[cv] = mp

    its mean every unit mana difference is stred to a array where the index is the unit custom value what is unique to every unit if u use index what really easy to implentate mbecause just copy/paste :p

    3. huge lagg? not even noticedable since its lagg only 1st time the custom ability but u can preload all ability at map init=>dont lagg even u add 30 to a unit

    try add more unit on my orpg template near hero and test it urself if u think its alggy
     
  10. mckill2009

    mckill2009

    Joined:
    Mar 10, 2009
    Messages:
    4,696
    Resources:
    34
    Maps:
    5
    Spells:
    27
    JASS:
    2
    Resources:
    34
    - Never use local groups then destroy, use global groups or bj_lastCreatedGroup...
    - This
    if ???==false
    , should be this
    not ???
    ...
    - The loops that adds the ability lags, set preload to it...
    - Don't use TriggerSleepAction, use a timer that expired instead...
    - No need for a unit indexer with complex code, hastahbles will just do fine...

    I'll come up with something simple...
     
  11. shadowvzs

    shadowvzs

    Joined:
    Nov 13, 2006
    Messages:
    1,803
    Resources:
    2
    Spells:
    2
    Resources:
    2
    - right
    - i said need preload but i dont wrote preload trigger coz everybody can add a ability to unit and remove it.
    - i wrote not the best but somehow i think its more simple to somebody who dont want complicate it instead harshtable and timers where need much more thing
    - easier pase a trigger what need everywhere mostly than makeing harshtable and everytime save load data if we need something simple thing

    what i wrote easy in that point when u implentate, not the best but usefull, also that functions (add hp/mp, indexer) could use in more palce like add self max hp/mp buff ability or max hp debuffer ability etc, and indexer i think its a standard sincemostly most of map use dds
     
  12. mckill2009

    mckill2009

    Joined:
    Mar 10, 2009
    Messages:
    4,696
    Resources:
    34
    Maps:
    5
    Spells:
    27
    JASS:
    2
    Resources:
    34
    @shadow
    its really not hard to do it via Hashtable, besides if you use custom value of
    units, then UnitIndexer needs to be imported which is fast but not needed...
    Static Mana

    • StaticMana
      • Events
        • Unit - A unit Starts the effect of an ability
      • Conditions
        • (Ability being cast) Equal to Thunder Clap
      • Actions
        • -------- too lazy to Filter the unit and remove the location :P... --------
        • Unit Group - Pick every unit in (Units within 512.00 of (Position of (Triggering unit))) and do (Actions)
          • Loop - Actions
            • Custom script: set udg_ID = GetHandleId(GetEnumUnit())
            • Set Index = (Index + 1)
            • Hashtable - Save 10.00 as 100 of ID in Hash
            • Hashtable - Save 100.00 as 101 of ID in Hash
            • Unit Group - Add (Picked unit) to Grp
        • Trigger - Turn on Loop <gen>


    • StaticManaLoop
      • Events
        • Time - Every 0.10 seconds of game time
      • Conditions
      • Actions
        • Unit Group - Pick every unit in Grp and do (Actions)
          • Loop - Actions
            • Set Target = (Picked unit)
            • Custom script: set udg_ID = GetHandleId(GetEnumUnit())
            • Set Duration = (Load 100 of ID from Hash)
            • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • (Target is alive) Equal to True
                • Duration Greater than 0.00
              • Then - Actions
                • Hashtable - Save (Duration - 0.10) as 100 of ID in Hash
                • Set Mana = (Load 101 of ID from Hash)
                • -------- floating text is really not needed --------
                • Floating Text - Create floating text that reads (String(Duration)) above Target with Z offset 0.00, using font size 10.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
                • Floating Text - Change (Last created floating text): Disable permanence
                • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
                • Floating Text - Change the lifespan of (Last created floating text) to 0.09 seconds
                • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                  • If - Conditions
                    • (Mana of Target) Greater than Mana
                  • Then - Actions
                    • Unit - Set mana of Target to Mana
                  • Else - Actions
              • Else - Actions
                • Unit Group - Remove Target from Grp
                • Set Index = (Index - 1)
                • -------- flush also is OK --------
                • Custom script: call RemoveSavedReal(udg_Hash, udg_ID, 100)
                • Custom script: call RemoveSavedReal(udg_Hash, udg_ID, 101)
                • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                  • If - Conditions
                    • Index Equal to 0
                  • Then - Actions
                    • Trigger - Turn off (This trigger)
                  • Else - Actions

     
  13. shadowvzs

    shadowvzs

    Joined:
    Nov 13, 2006
    Messages:
    1,803
    Resources:
    2
    Spells:
    2
    Resources:
    2
    oh i thought u do in jass with timer there.

    ok in gui your is shorter :p

    with harshtable my problem is: i got 96 ability on my map, so lets make 96 harshtable or 200+ global variable? :p
    i prefer triggersleep in that view point, y less accurated, yea could affter the lagg but still when i use 96 ability i skip alot harshtable useage :p
     
  14. -Kobas-

    -Kobas-

    Joined:
    Jan 17, 2010
    Messages:
    5,892
    Resources:
    28
    Icons:
    1
    Tools:
    2
    Maps:
    10
    Spells:
    4
    Template:
    5
    Tutorials:
    6
    Resources:
    28
    Actually that GUI converted to jass is well 2 or more times longer than jass code you provided, but both of them are inefficient, there is faster and better way to handle this, let me try.
     
  15. mckill2009

    mckill2009

    Joined:
    Mar 10, 2009
    Messages:
    4,696
    Resources:
    34
    Maps:
    5
    Spells:
    27
    JASS:
    2
    Resources:
    34
    I prefer GUI this time, if its vjass, it'll be much shorter and more efficient...
     
  16. -Kobas-

    -Kobas-

    Joined:
    Jan 17, 2010
    Messages:
    5,892
    Resources:
    28
    Icons:
    1
    Tools:
    2
    Maps:
    10
    Spells:
    4
    Template:
    5
    Tutorials:
    6
    Resources:
    28
    GUI
    • T1
      • Events
        • Unit - A unit Starts the effect of an ability
      • Conditions
        • (Ability being cast) Equal to Thunder Clap
      • Actions
        • Custom script: local real mana
        • Wait 0.00 seconds
        • Set Counter = (Counter + 1)
        • Trigger - Turn on T2 <gen>
        • Custom script: set mana = GetUnitState(GetTriggerUnit(), UNIT_STATE_MANA)
        • Unit Group - Add (Triggering unit) to G
        • Wait 10.00 seconds
        • Set Counter = (Counter - 1)
        • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • Counter Equal to 0
          • Then - Actions
            • Trigger - Turn off T2 <gen>
          • Else - Actions
        • Unit Group - Remove (Triggering unit) from G
        • Custom script: call SetUnitState(GetTriggerUnit(), UNIT_STATE_MANA, mana)
    • T2
      • Events
        • Time - Every 0.03 seconds of game time
      • Conditions
      • Actions
        • Unit Group - Pick every unit in G and do (Actions)
          • Loop - Actions
            • Unit - Set mana of (Picked unit) to 100.00
    Jass
    Code (vJASS):

    function T1_run takes nothing returns nothing
        local real mana
        if GetSpellAbilityId() == 'AHtc' then
            call TriggerSleepAction( 0.00 )
            set udg_Counter = udg_Counter + 1
            call EnableTrigger( gg_trg_T2_jass )
            set mana = GetUnitState(GetTriggerUnit(), UNIT_STATE_MANA)
            call GroupAddUnit(udg_G, GetTriggerUnit())
            call TriggerSleepAction( 10.00 )
            set udg_Counter = udg_Counter - 1
            if udg_Counter == 0 then
                call DisableTrigger( gg_trg_T2_jass )
            endif
            call GroupRemoveUnit(udg_G, GetTriggerUnit())
            call SetUnitState(GetTriggerUnit(), UNIT_STATE_MANA, mana)
        endif
    endfunction

    function InitTrig_T1_jass takes nothing returns nothing
        local trigger T = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( T, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddAction( T, function T1_run )
        set T = null
    endfunction
     
    Code (vJASS):

    function T2_doLoop takes nothing returns nothing
        call SetUnitState(GetEnumUnit(), UNIT_STATE_MANA, 100.)
    endfunction

    function T2_run takes nothing returns nothing
        call ForGroup( udg_G, function T2_doLoop )
    endfunction

    function InitTrig_T2_jass takes nothing returns nothing
        set gg_trg_T2_jass = CreateTrigger()
        call TriggerRegisterTimerEvent(gg_trg_T2_jass, 0.03, true)
        call TriggerAddAction( gg_trg_T2_jass, function T2_run )
    endfunction
     
    vjass
    Code (vJASS):

    struct Spell extends array

        private static integer COUNTER       = 0
        private static integer ABILITY_CODE  = 'AHtc'
        private static real DURATION         = 10.
        private static real MANA             = 100.
        private static trigger T             = CreateTrigger()
        private static group G               = CreateGroup()

        private static method setMana takes nothing returns nothing
            call SetUnitState(GetEnumUnit(), UNIT_STATE_MANA, MANA)
        endmethod

        private static method doLoop takes nothing returns nothing
            call ForGroup( G, function thistype.setMana )
        endmethod

        private static method run takes nothing returns nothing
            local real mana
            if GetSpellAbilityId() == ABILITY_CODE then
                call TriggerSleepAction(0.00)
                set COUNTER = COUNTER + 1
                call EnableTrigger(T)
                set mana = GetUnitState(GetTriggerUnit(), UNIT_STATE_MANA)
                call GroupAddUnit(G, GetTriggerUnit())
                call TriggerSleepAction(DURATION)
                set COUNTER = COUNTER - 1
                if COUNTER == 0 then
                    call DisableTrigger(T)
                endif
                call GroupRemoveUnit(G, GetTriggerUnit())
                call SetUnitState(GetTriggerUnit(), UNIT_STATE_MANA, mana)
            endif
        endmethod

        private static method onInit takes nothing returns nothing
            local trigger t = CreateTrigger()
            call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
            call TriggerRegisterTimerEvent(T, 0.03, true)
            call TriggerAddAction( t, function thistype.run )
            call TriggerAddAction( T, function thistype.doLoop )
            set t = null
        endmethod

    endstruct
     


    Few tricks used:
    - Wait 0.00 seconds or TriggerSleepAction(0.00) will delay actions long enough so we can store mana without spell manacost (if hero has 500 mana and spell cost 100 mana, instead of 500 we will save 400 mana).
    - we use local real in GUI to save different mana value for each different unit (MUI).
    - In jass we use for group instead FirstOfGroup to easily avoid indexing and creating more groups.
    - We use Wait 10. or TSA(10.) because we don't need accurate timer here.
     

    Attached Files:

    • x.w3x
      File size:
      17.7 KB
      Views:
      75
  17. mckill2009

    mckill2009

    Joined:
    Mar 10, 2009
    Messages:
    4,696
    Resources:
    34
    Maps:
    5
    Spells:
    27
    JASS:
    2
    Resources:
    34
    FirstOfGroup loop is faster than ForGroup coz it doesnt call another function and
    pass global datas if needed...
     
  18. -Kobas-

    -Kobas-

    Joined:
    Jan 17, 2010
    Messages:
    5,892
    Resources:
    28
    Icons:
    1
    Tools:
    2
    Maps:
    10
    Spells:
    4
    Template:
    5
    Tutorials:
    6
    Resources:
    28
    But to use it you need to remove units from group!
    This will force as to use 2 groups. We will just complicate things with it.
    This group will contain max 10 units so there is no need for some better optimizing.
     
  19. Hashjie

    Hashjie

    Joined:
    Apr 20, 2009
    Messages:
    1,515
    Resources:
    0
    Resources:
    0
    Also this:

    Code (vJASS):
    function TriggerRegisterAnyUnitEventBJ takes trigger trig, playerunitevent whichEvent returns nothing
        local integer index

        set index = 0
        loop
            call TriggerRegisterPlayerUnitEvent(trig, Player(index), whichEvent, null)

            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
    endfunction


    readability or 1 less function call, you decide :p
     
  20. -Kobas-

    -Kobas-

    Joined:
    Jan 17, 2010
    Messages:
    5,892
    Resources:
    28
    Icons:
    1
    Tools:
    2
    Maps:
    10
    Spells:
    4
    Template:
    5
    Tutorials:
    6
    Resources:
    28
    Hashjie you can leave such functions there.
    If you really want to avoid these BJ functions then I suggest PlayerEvent library or whatever created by Magtheridon.