[GUI/MUI] Katon 1.2

This bundle is marked as awaiting update. A staff member has requested changes to it before it can be approved.
  • Like
Reactions: WINbyTEAMWORK

Katon Goukakyuu

Created by Assassins-Creed/MetaDeath

1. Features
2. Triggers
3. How to Import
4. Graphical Information
5. Change Log
6. Credits
7. Author’s Notes

Features


A fireball is launched doing an initial wave of damage, once the fireball is in its resting position, it does stream damage over time, with accurate hit boxes.

Triggers



JASS:
function SetUnitXY takes location l, unit u returns nothing

local real x
local real y

set x = GetLocationX(l)
set y = GetLocationY(l)

call SetUnitX(u,x)
call SetUnitY(u,y)

endfunction



  • KatonConfig
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- =======CREATING THE HASHTABLE, DO NOT TOUCH======= --------
      • Hashtable - Create a hashtable
      • Set KGJ_StreamHashtable = (Last created hashtable)
      • -------- =======HASHTABLE CREATION DONE :P======= --------
      • -------- ============================================================================ --------
      • Set KGJ_TimerConfig = 1.00
      • -------- ===TimerConfig is the amount of time it takes for the fireball to reach the DistanceConfig=== --------
      • Set KGJ_StreamTimerConfig = 4.00
      • -------- ===StreamTimerConfig is the amount of time that the fire stream and fire ball remain.=== --------
      • Set KGJ_InitialDamageConfig = 150.00
      • -------- ===InitialDamage is the total damage that hits units while the fireball is still moving to it's resting position.=== --------
      • Set KGJ_StreamDamageConfig = 150.00
      • -------- ===StreamDamage is the total amount of damage applied to units within the fireball or stream over the duration of StreamTimerConfig=== --------
      • Set KGJ_AoEConfig = 300.00
      • -------- ===AoEConfig is the AoE that the fireball will detect units to damage them with InitialDamage and then StreamDamage=== --------
      • Set KGJ_DistanceConfig = 800.00
      • -------- ===DistanceConfig is the distance the fireball will travel before stopping.=== --------
      • Set KGJ_MaxStreamAoEConfig = 150.00
      • -------- ===MaximumStreamAoE is the widest AoE right before the fireball in the fire stream.=== --------
      • Set KGJ_FireHeightConfig = 120.00
      • -------- ===FireHeightConfig is the height of the fire stream so that you can easily adjust it and determine the best height for the stream.=== --------
      • Set KGJ_ManaDrainConfig = 70.00
      • -------- KGJ_ManaDrainConfig is the amount of mana drained during the stream. --------
      • -------- ============================================================================ --------
      • -------- ============================================================================ --------
      • -------- Note that in the Katon trigger there is a reserved configuration block intended for custom damage(Damage based on level of ability, stats, etc.) --------
      • -------- Just move the DamageConfigs over to that block, and use KGJ_Caster[udg_Temp_Spell_ID] as the unit you get your stats/level check from. --------
      • -------- There is an animation played in the loop trigger, using custom script, delete it if you do not want the animation, change the animation number, or make it a gui function. --------
      • -------- ============================================================================ --------
      • -------- ============================================================================ --------



  • Katon
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Katon
    • Actions
      • -------- ====Indexing START (DONT TOUCH)==== --------
      • Set KGJ_Count = (KGJ_Count + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • KGJ_Count Equal to 1
        • Then - Actions
          • Trigger - Turn on KatonLoop <gen>
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • KGJ_RecycledSize Equal to 0
        • Then - Actions
          • Set KGJ_MaxIndex = (KGJ_MaxIndex + 1)
          • Set Temp_Spell_ID = KGJ_MaxIndex
        • Else - Actions
          • Set KGJ_RecycledSize = (KGJ_RecycledSize - 1)
          • Set Temp_Spell_ID = KGJ_RecycleStack[KGJ_RecycledSize]
      • Set KGJ_Next[Temp_Spell_ID] = 0
      • Set KGJ_Next[KGJ_Last] = Temp_Spell_ID
      • Set KGJ_Prev[Temp_Spell_ID] = KGJ_Last
      • Set KGJ_Last = Temp_Spell_ID
      • -------- ====Indexing END==== --------
      • Set KGJ_Caster[Temp_Spell_ID] = (Triggering unit)
      • -------- ======================RESERVED CONFIGURATION BLOCK====================== --------
      • -------- ============================================================================ --------
      • -------- If you do not want sounds, delete the sound custom scripts and KGJ_Sound variables... there is another sound which is played in the loop config. --------
      • Custom script: set udg_KGJ_Sound[udg_Temp_Spell_ID] = CreateSound("war3mapImported\\KatonInitialFire.mp3", false, false, false, 10, 10, "")
      • Custom script: set udg_KGJ_Sound2[udg_Temp_Spell_ID] = CreateSound("war3mapImported\\KatonFireLoop.mp3", false, false, false, 10, 10, "")
      • Sound - Play KGJ_Sound[Temp_Spell_ID]
      • Custom script: call SetUnitAnimationByIndex(udg_KGJ_Caster[udg_Temp_Spell_ID], 3)
      • Set KGJ_Timer[Temp_Spell_ID] = KGJ_TimerConfig
      • Set KGJ_StreamTimer[Temp_Spell_ID] = KGJ_StreamTimerConfig
      • Set KGJ_InitialDamage[Temp_Spell_ID] = KGJ_InitialDamageConfig
      • Set KGJ_StreamDamage[Temp_Spell_ID] = ((KGJ_StreamDamageConfig / KGJ_StreamTimer[Temp_Spell_ID]) x 0.03)
      • Set KGJ_ManaDrain[Temp_Spell_ID] = ((KGJ_ManaDrainConfig / KGJ_StreamTimer[Temp_Spell_ID]) x 0.03)
      • Set KGJ_AoE[Temp_Spell_ID] = KGJ_AoEConfig
      • Set KGJ_Offset[Temp_Spell_ID] = ((KGJ_DistanceConfig / KGJ_Timer[Temp_Spell_ID]) x 0.03)
      • Set KGJ_SetupBoolean2[Temp_Spell_ID] = True
      • Set KGJ_Cancelled[Temp_Spell_ID] = False
      • Custom script: if udg_KGJ_InitialDamageTakenGroup[udg_Temp_Spell_ID] == null then
      • Custom script: set udg_KGJ_InitialDamageTakenGroup[udg_Temp_Spell_ID] = CreateGroup()
      • Custom script: endif
      • -------- ====This block of code attempts to make an accurate stream hit box. The stream is the fire stream before the ball.=== --------
      • Set KGJ_MaximumStreamAoE[Temp_Spell_ID] = KGJ_MaxStreamAoEConfig
      • -------- ===MaximumStreamAoE is the widest AoE right before the fireball in the fire stream.=== --------
      • Set KGJ_MaximumStreamDistance[Temp_Spell_ID] = (KGJ_DistanceConfig - (KGJ_AoE[Temp_Spell_ID] / 2.00))
      • -------- ===MaximumStreamDistance is the maximum distance of the stream, since we don't want the fire stream to overlap with the fireball we remove half of the fireball's AoE from the distance.=== --------
      • Set KGJ_StreamOffset[Temp_Spell_ID] = ((KGJ_MaximumStreamDistance[Temp_Spell_ID] / KGJ_Timer[Temp_Spell_ID]) x 0.03)
      • -------- ===KGJ_StreamOffset sets up the accurate point setting offset=== --------
      • Set KGJ_StreamCounter[Temp_Spell_ID] = 0
      • -------- ===KGJ_Counter set to 0=== --------
      • Set KGJ_SetupBoolean[Temp_Spell_ID] = True
      • -------- ===KGJ_SetupBoolean is used to setup the first StreamPoint=== --------
      • Set KGJ_MaxLoopInteger[Temp_Spell_ID] = (Integer(((KGJ_MaximumStreamDistance[Temp_Spell_ID] / KGJ_Timer[Temp_Spell_ID]) x 0.03)))
      • Set KGJ_MaxLoopInteger[Temp_Spell_ID] = (Integer((KGJ_MaximumStreamDistance[Temp_Spell_ID] / (Real(KGJ_MaxLoopInteger[Temp_Spell_ID])))))
      • -------- ===Used to get an accurate Max for the Stream_Counter=== --------
      • Set KGJ_StreamAoEIncrement[Temp_Spell_ID] = (KGJ_MaximumStreamAoE[Temp_Spell_ID] / (Real(KGJ_MaxLoopInteger[Temp_Spell_ID])))
      • -------- ===KGJ_StreamAoEIncrement is how much each AoE of the Stream increases per hitbox.=== --------
      • Set TempReal = 0.00
      • Custom script: set udg_Handle = GetHandleId(udg_KGJ_Caster[udg_Temp_Spell_ID])
      • For each (Integer KGJ_StreamLoop) from 1 to KGJ_MaxLoopInteger[Temp_Spell_ID], do (Actions)
        • Loop - Actions
          • Set TempReal = (TempReal + KGJ_StreamAoEIncrement[Temp_Spell_ID])
          • Hashtable - Save TempReal as KGJ_StreamLoop of Handle in KGJ_StreamHashtable
      • -------- ===End KGJ Stream code block=== --------
      • Set TempPoint = (Position of KGJ_Caster[Temp_Spell_ID])
      • Set TempPoint2 = (Target point of ability being cast)
      • Set KGJ_Angle[Temp_Spell_ID] = (Angle from TempPoint to TempPoint2)
      • Unit - Make KGJ_Caster[Temp_Spell_ID] face TempPoint2 over 0.00 seconds
      • Unit - Create 1 KatonFireBall for (Owner of KGJ_Caster[Temp_Spell_ID]) at TempPoint facing KGJ_Angle[Temp_Spell_ID] degrees
      • Set KGJ_Dummy[Temp_Spell_ID] = (Last created unit)
      • Unit - Create 1 KatonFireStream for (Owner of KGJ_Caster[Temp_Spell_ID]) at TempPoint facing KGJ_Angle[Temp_Spell_ID] degrees
      • Set KGJ_Dummy2[Temp_Spell_ID] = (Last created unit)
      • Unit - Add Crow Form to KGJ_Dummy2[Temp_Spell_ID]
      • Unit - Remove Crow Form from KGJ_Dummy2[Temp_Spell_ID]
      • Animation - Change KGJ_Dummy2[Temp_Spell_ID] flying height to KGJ_FireHeightConfig at 0.00
      • Custom script: call RemoveLocation(udg_TempPoint)
      • Custom script: call RemoveLocation(udg_TempPoint2)


  • KatonLoop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • Set Temp_Spell_ID = 0
      • For each (Integer KGJ_Loop) from 1 to KGJ_Count, do (Actions)
        • Loop - Actions
          • Set Temp_Spell_ID = KGJ_Next[Temp_Spell_ID]
          • Custom script: set udg_Handle = GetHandleId(udg_KGJ_Caster[udg_Temp_Spell_ID])
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (KGJ_Caster[Temp_Spell_ID] is alive) Equal to False
            • Then - Actions
              • Set KGJ_Cancelled[Temp_Spell_ID] = True
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • KGJ_Timer[Temp_Spell_ID] Greater than 0.00
            • Then - Actions
              • Set KGJ_StreamCounter[Temp_Spell_ID] = (KGJ_StreamCounter[Temp_Spell_ID] + 1)
              • Set KGJ_Timer[Temp_Spell_ID] = (KGJ_Timer[Temp_Spell_ID] - 0.03)
              • -------- ===========Setting up Stream Locations============ --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • KGJ_SetupBoolean[Temp_Spell_ID] Equal to True
                • Then - Actions
                  • Set KGJ_SetupBoolean[Temp_Spell_ID] = False
                  • Set TempPoint = (Position of KGJ_Caster[Temp_Spell_ID])
                  • Set TempPoint2 = (TempPoint offset by KGJ_StreamOffset[Temp_Spell_ID] towards KGJ_Angle[Temp_Spell_ID] degrees)
                  • Unit - Create 1 KatonLocationDummy for (Owner of KGJ_Caster[Temp_Spell_ID]) at TempPoint2 facing Default building facing degrees
                  • Set TempUnit = (Last created unit)
                  • Hashtable - Save Handle Of(Position of TempUnit) as (KGJ_StreamCounter[Temp_Spell_ID] + KGJ_MaxLoopInteger[Temp_Spell_ID]) of Handle in KGJ_StreamHashtable
                  • Unit - Remove TempUnit from the game
                  • Custom script: call RemoveLocation(udg_TempPoint)
                  • Custom script: call RemoveLocation(udg_TempPoint2)
                • Else - Actions
                  • Hashtable - Save Handle Of((Load ((KGJ_StreamCounter[Temp_Spell_ID] - 1) + KGJ_MaxLoopInteger[Temp_Spell_ID]) of Handle in KGJ_StreamHashtable) offset by KGJ_StreamOffset[Temp_Spell_ID] towards KGJ_Angle[Temp_Spell_ID] degrees) as (KGJ_StreamCounter[Temp_Spell_ID] + KGJ_MaxLoopInteger[Temp_Spell_ID]) of Handle in KGJ_StreamHashtable
              • -------- ===========Setting up Stream Locations END============ --------
              • Set TempPoint = (Position of KGJ_Dummy[Temp_Spell_ID])
              • Set TempPoint2 = (TempPoint offset by KGJ_Offset[Temp_Spell_ID] towards KGJ_Angle[Temp_Spell_ID] degrees)
              • Set TempGroup = (Units within KGJ_AoE[Temp_Spell_ID] of TempPoint2 matching (((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an ally of (Owner of KGJ_Caster[Temp_Spell_ID])) Equal to False)) and ((((Matching unit) is dead) Equal to False)
              • Custom script: call SetUnitXY(udg_TempPoint2,udg_KGJ_Dummy[udg_Temp_Spell_ID])
              • Custom script: call RemoveLocation(udg_TempPoint)
              • Custom script: call RemoveLocation(udg_TempPoint2)
              • Unit Group - Pick every unit in TempGroup and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) is in KGJ_InitialDamageTakenGroup[Temp_Spell_ID]) Equal to False
                    • Then - Actions
                      • Unit - Cause KGJ_Caster[Temp_Spell_ID] to damage (Picked unit), dealing KGJ_InitialDamage[Temp_Spell_ID] damage of attack type Spells and damage type Normal
                      • Unit Group - Add (Picked unit) to KGJ_InitialDamageTakenGroup[Temp_Spell_ID]
                    • Else - Actions
              • Unit Group - Remove all units of TempGroup from TempGroup
              • -------- =====In my experience, when I destroy a unit group without recreating it like this, the units which were in the tempgroup will not be added to the newly set tempgroup===== --------
              • Custom script: call DestroyGroup(udg_TempGroup)
              • Custom script: set udg_TempGroup = CreateGroup()
              • -------- ==================================================================== --------
            • Else - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • KGJ_Cancelled[Temp_Spell_ID] Equal to False
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • KGJ_StreamTimer[Temp_Spell_ID] Greater than 0.00
                    • Then - Actions
                      • Set KGJ_StreamTimer[Temp_Spell_ID] = (KGJ_StreamTimer[Temp_Spell_ID] - 0.03)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Mana of KGJ_Caster[Temp_Spell_ID]) Greater than 1.00
                        • Then - Actions
                          • Unit - Set mana of KGJ_Caster[Temp_Spell_ID] to ((Mana of KGJ_Caster[Temp_Spell_ID]) - KGJ_ManaDrain[Temp_Spell_ID])
                        • Else - Actions
                          • Unit - Order KGJ_Caster[Temp_Spell_ID] to Stop
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • KGJ_SetupBoolean2[Temp_Spell_ID] Equal to True
                        • Then - Actions
                          • Set KGJ_SetupBoolean2[Temp_Spell_ID] = False
                          • Sound - Play KGJ_Sound2[Temp_Spell_ID]
                          • -------- =========I do not have to destroy this unit group because I am just using it to store units, and take them out.======== --------
                          • Unit Group - Remove all units of KGJ_InitialDamageTakenGroup[Temp_Spell_ID] from KGJ_InitialDamageTakenGroup[Temp_Spell_ID]
                          • -------- ==================================================================== --------
                        • Else - Actions
                      • For each (Integer KGJ_StreamLoop) from 1 to KGJ_StreamCounter[Temp_Spell_ID], do (Actions)
                        • Loop - Actions
                          • Set TempReal = (Load KGJ_StreamLoop of Handle from KGJ_StreamHashtable)
                          • Set TempGroup = (Units within TempReal of (Load (KGJ_StreamLoop + KGJ_MaxLoopInteger[Temp_Spell_ID]) of Handle in KGJ_StreamHashtable) matching (((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an ally of (Owner of KGJ_Caster[Temp_Spell_ID]
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Number of units in TempGroup) Greater than 0
                            • Then - Actions
                              • Unit Group - Pick every unit in TempGroup and do (Actions)
                                • Loop - Actions
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • ((Picked unit) is in TempGroup2) Equal to False
                                    • Then - Actions
                                      • Unit - Cause KGJ_Caster[Temp_Spell_ID] to damage (Picked unit), dealing KGJ_StreamDamage[Temp_Spell_ID] damage of attack type Spells and damage type Normal
                                      • Unit Group - Add (Picked unit) to TempGroup2
                                    • Else - Actions
                            • Else - Actions
                          • Unit Group - Remove all units of TempGroup from TempGroup
                          • Custom script: call DestroyGroup(udg_TempGroup)
                          • Custom script: set udg_TempGroup = CreateGroup()
                      • Set TempPoint = (Position of KGJ_Dummy[Temp_Spell_ID])
                      • Set TempGroup = (Units within KGJ_AoE[Temp_Spell_ID] of TempPoint matching (((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an ally of (Owner of KGJ_Caster[Temp_Spell_ID])) Equal to False)) and ((((Matching unit) is dead) Equal to False) a
                      • Unit Group - Pick every unit in TempGroup and do (Actions)
                        • Loop - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • ((Picked unit) is in TempGroup2) Equal to False
                            • Then - Actions
                              • Unit - Cause KGJ_Caster[Temp_Spell_ID] to damage (Picked unit), dealing KGJ_StreamDamage[Temp_Spell_ID] damage of attack type Spells and damage type Normal
                              • Unit Group - Add (Picked unit) to TempGroup2
                            • Else - Actions
                      • Custom script: call RemoveLocation(udg_TempPoint)
                      • Unit Group - Remove all units of TempGroup2 from TempGroup2
                      • Unit Group - Remove all units of TempGroup from TempGroup
                      • Custom script: call DestroyGroup(udg_TempGroup)
                      • Custom script: set udg_TempGroup = CreateGroup()
                    • Else - Actions
                      • Set KGJ_Cancelled[Temp_Spell_ID] = True
                • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • KGJ_SetupBoolean2[Temp_Spell_ID] Equal to True
                    • Then - Actions
                      • Set KGJ_SetupBoolean2[Temp_Spell_ID] = False
                      • Unit Group - Remove all units of KGJ_InitialDamageTakenGroup[Temp_Spell_ID] from KGJ_InitialDamageTakenGroup[Temp_Spell_ID]
                    • Else - Actions
                  • For each (Integer KGJ_StreamLoop) from 1 to KGJ_StreamCounter[Temp_Spell_ID], do (Actions)
                    • Loop - Actions
                      • Set TempPoint = (Load (KGJ_StreamLoop + KGJ_MaxLoopInteger[Temp_Spell_ID]) of Handle in KGJ_StreamHashtable)
                      • Custom script: call RemoveLocation(udg_TempPoint)
                  • Sound - Stop KGJ_Sound[Temp_Spell_ID] After fading
                  • Sound - Stop KGJ_Sound2[Temp_Spell_ID] After fading
                  • Unit - Remove KGJ_Dummy[Temp_Spell_ID] from the game
                  • Unit - Remove KGJ_Dummy2[Temp_Spell_ID] from the game
                  • Hashtable - Clear all child hashtables of child Handle in KGJ_StreamHashtable
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • KGJ_Last Equal to Temp_Spell_ID
                    • Then - Actions
                      • Set KGJ_Last = KGJ_Prev[Temp_Spell_ID]
                    • Else - Actions
                  • Set KGJ_RecycleStack[KGJ_RecycledSize] = Temp_Spell_ID
                  • Set KGJ_RecycledSize = (KGJ_RecycledSize + 1)
                  • Set KGJ_Next[KGJ_Prev[Temp_Spell_ID]] = KGJ_Next[Temp_Spell_ID]
                  • Set KGJ_Prev[KGJ_Next[Temp_Spell_ID]] = KGJ_Prev[Temp_Spell_ID]
                  • Set KGJ_Count = (KGJ_Count - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • KGJ_Count Equal to 0
                    • Then - Actions
                      • Trigger - Turn off (This trigger)
                    • Else - Actions

  • KatonCancel
    • Events
      • Unit - A unit Is issued an order targeting an object
      • Unit - A unit Is issued an order targeting a point
      • Unit - A unit Is issued an order with no target
    • Conditions
    • Actions
      • Set TempInt = 0
      • For each (Integer KGJ_CancelLoop) from 1 to KGJ_Count, do (Actions)
        • Loop - Actions
          • Set TempInt = KGJ_Next[TempInt]
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Triggering unit) Equal to KGJ_Caster[TempInt]
            • Then - Actions
              • Set KGJ_Cancelled[TempInt] = True
              • Unit - Remove KGJ_Dummy2[TempInt] from the game
            • Else - Actions

How to Import



Importing Steps:
  • Import all the files from the map to the desired map.
  • Copy the spell from the object editor to your map.
  • Copy all of the units in the object editor from the map to your map.
  • Copy the folder with all of the triggers and paste it in your map.
  • Look through the triggers and fix the 'Create Unit' GUI function lines.
  • udg_KGJ_Dummy[udg_Temp_Spell_ID] should equal the fireball.
  • udg_KGJ_Dummy2[udg_Temp_Spell_ID] should equal the fire stream.





Graphical Information




Katon Goukakyuu

full





Katon Goukakyuu



Change Log





Initial Release:
  • Initial Hive release.


Credits



Models:
  • Katon Stream Model: Chobibo(ChaosRealm)
  • Fireball Model:?????
  • Sasuke Model:????? I have an idea, but I don't want to make assumptions, and I have no way to confirm.
Description Template:
Other:
  • Unryze(ChaosRealm), who helped refresh my memory on hashtables.


Author’s Notes


This is heavily influenced by Naruto Legend's Katon, the only differences may be graphical, and the hit boxes are accurate.
I left in the model and sounds, they may be useful to someone.
I submitted this to be judged, and to see where I am at.

Contents

[GUI/MUI] Katon 1.2 (Map)

Reviews
Tasyen
You put much effort into this, it looks naruto like and the sounds make it feel powerful. Code: dat looks wierd: Unit Group - Remove all units of TempGroup from TempGroup In future better use this one. Unit Group - Remove all units from TempGroup...
You put much effort into this, it looks naruto like and the sounds make it feel powerful.

Code:
dat looks wierd:
Unit Group - Remove all units of TempGroup from TempGroup​
In future better use this one.
Unit Group - Remove all units from TempGroup
(Should be called "clear" group in the editor)​
you leak some groups, has to do with this recreation & pick units
pick units will create an new group.
add unit to group, can only be used if the group exists, which does not if it was destroyed.
I would recomment using an permanent group containing currently affected units which is never destroyed and only cleared after the streamline dmg is done.
Do the rest with this below.​
One-Time use groups are in gui best handled with
  • Actions
    • Set Source = (Triggering unit)
    • Set Loc = (Position of (Source))
    • Custom script: set bj_wantDestroyGroup =true
    • Unit Group - Pick every unit in (Units within 200.00 of Loc) and do (Actions)
      • Loop - Actions
        • Set Picked = (Picked unit)
        • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • (Picked is A structure) Equal to False
            • (Picked belongs to an enemy of (Owner of Source)) Equal to True
            • (Picked is alive) Equal to True
          • Then - Actions
            • Unit - Cause Source to damage Picked, dealing x damage of attack type Spells and damage type Magic
          • Else - Actions
    • Custom script: call RemoveLocation(udg_Loc)
Pros:
one does not need an group variable
it's easy to read/change filters.
dat would solve your recreation of tempgroup problem too.​
Cons:
You can not reuse the group.
empty filter.​
 
Great spell though as with all anime spells they can get laggy and should be optimized as much as possible, looking forward to seeing more. =)
Only suggestion I have currently is learning how to use faster unit group checks.

Considering it's GUI, I won't use such functions (SetUnitXY) due to the fact that we can neglect speed here. But that's rather personal. In term of actual use, the header script might be missed and cause issues.

Actually I think it'd be a great idea to be suggesting the use of FirstOfGroup instead?
 
Level 11
Joined
Aug 6, 2009
Messages
697
Considering it's GUI, I won't use such functions (SetUnitXY) due to the fact that we can neglect speed here. But that's rather personal. In term of actual use, the header script might be missed and cause issues.

People can go through and replace every SetUnitXY with a move unit instantly, if they want. I only used this little function because I became used to using it. It wasn't used with the intent of making it faster in terms of processing. Assuming, that's what you meant by speed. I am not sure what you mean by "missed and cause issues".

You put much effort into this, it looks naruto like and the sounds make it feel powerful.

Thank you, I realized that sounds are more important than I thought. If possible, I look for sounds that can add the feeling of impact. But, they are hard to find, and I have not spent time learning any kind of sound design. I've only used audacity to edit sounds, whether its cutting, raising the volume, adding some fade out and reverb effects, or welding sounds to make them sound "seamless".

Code:
dat looks wierd:
Unit Group - Remove all units of TempGroup from TempGroup​
In future better use this one.
Unit Group - Remove all units from TempGroup
(Should be called "clear" group in the editor)

I am not sure how I missed that, must have been tunnel vision.

you leak some groups, has to do with this recreation & pick units
pick units will create an new group.
add unit to group, can only be used if the group exists, which does not if it was destroyed.
I would recomment using an permanent group containing currently affected units which is never destroyed and only cleared after the streamline dmg is done.
Do the rest with this below.​

I am confused. I set the TempGroup to the value, then destroy it, then recreate it, and set it to something. This causes the leak? If this causes a leak, then I am not sure how to destroy a group leak, then reuse it. If I destroyed a group without recreating, and just setting, it would cause a problem where if unit A was in TempGroup, then I destroyed it, and set it again, and unit A was still within the conditions, it wouldnt add unit A to the TempGroup.

Or are you talking about TempGroup2 where I use it to temporarily store units and then remove them. Since I do not set TempGroup2 to anything specific, this causes the leak?


Great spell though as with all anime spells they can get laggy and should be optimized as much as possible

Thanks, but I think it doesn't matter if they're anime or not, all spells can get laggy and should be optimized. I am trying to do things with optimization in mind, most of the time. Sometimes I just say "screw it, if it lags, ill fix it later" out of frustration.

Only suggestion I have currently is learning how to use faster unit group checks.

What do you mean? Where is the link to KNOWLEDGE?

Actually I think it'd be a great idea to be suggesting the use of FirstOfGroup instead?

I am confused.

P.S. Sorry for the weird text, I hit backspace on the indents, but it doesn't remove them.​
 
This is Pick unit in range from
JASS Manual: API Browser - Blizzard.j
used by in range of loc with/out matching.
JASS:
function GetUnitsInRangeOfLocMatching takes real radius, location whichLocation, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRangeOfLoc(g, whichLocation, radius, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction

This is what you code does:
call GetUnitsInRangeOfLocMatching, remember the result. +1 group
do something with the group
clear the group​
destroy the group - 1 group
create the group +1 group
-> +1 group = leak

The group has to exist if you use the action addUnit/Group to group, which is tempgroup2.
Tempgroup2 is not destroyed which is correct.

Edit: First of group is a jass only thing.
 
Level 11
Joined
Aug 6, 2009
Messages
697
This is Pick unit in range from
JASS Manual: API Browser - Blizzard.j
used by in range of loc with/out matching.
JASS:
function GetUnitsInRangeOfLocMatching takes real radius, location whichLocation, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRangeOfLoc(g, whichLocation, radius, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction

This is what you code does:
call GetUnitsInRangeOfLocMatching, remember the result. +1 group
do something with the group
clear the group​
destroy the group - 1 group
create the group +1 group
-> +1 group = leak

The group has to exist if you use the action addUnit/Group to group, which is tempgroup2.
Tempgroup2 is not destroyed which is correct.

Edit: First of group is a jass only thing.

Okay, I removed the CreateGroup() to show you my problem. I either need to find another work around, or just deal with the leaks.
Here is the video.

Looks awesome.
Thanks!

Reminds me of that Naruto map: NCD 7.0+ versions. SASUKE!!!!
That's surprising.
 
Top