Extremely weird bug.

Gwypaas

hook DoNothing MakeGUIUsersCrash
Reaction score
50
I'm creating a spell that is a half sphere and then it implodes but now I have an extremely weird bug.

When I cast it once then it fucks up totally, when that instance finish and I casts it again then it fucks up but in another way, BUT if I first cast it and it fucks up and then casts it again while the other is still running then it works.

How I can see the bug: If the instance is fucked up then the units moves totally randomly.

My awesome code :D
JASS:
library OtherSummon initializer Init requires HSAS
globals
    private constant integer SPELL_ID = 'A002'
    private constant integer DUMMY_ID = 'o001'
    private constant real RADIUS = 400
    
    private constant integer UNITS_PER_LAYER = 16
    private constant real TIMER_PERIOD = 0.025
    private constant real DECREASE_TIME = 4
endglobals

//! runtextmacro HSAS_Static("Other", "8190", "private")

private struct otherdata
    real x
    real y
    group g
    unit u
    player p
    real array xyspeeds[200]
    real array heightspeeds[200]
    integer iterator
    
    static method create takes unit u, real x, real y returns otherdata
        local otherdata d = .allocate()
        set d.x = x
        set d.y = y
        set d.u = u
        set d.g = CreateGroup() 
        set d.p = GetOwningPlayer(u)
        set d.iterator = 0
        return d
    endmethod
endstruct


globals
    private otherdata dddddd
endglobals

private function CallbackForgroup takes nothing returns nothing
    local unit u = GetEnumUnit()
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local otherdata d = dddddd
    local real angle = (Atan2(y - d.y, x - d.x))
    local real height = GetUnitFlyHeight(u)
    local real distance = SquareRoot((x - d.x) * (x - d.x) + (y - d.y) * (y - d.y))
    if distance == 0 then
        set distance = 1
    endif

    if distance >= 20 then
        call SetUnitX(u, d.x + (distance - d.xyspeeds[d.iterator]) * Cos(angle))
        call SetUnitY(u, d.y + (distance - d.xyspeeds[d.iterator]) * Sin(angle))
    endif
    if height > 10 then
        call SetUnitFlyHeight(u, height - d.heightspeeds[d.iterator], 0 )
    endif
    
    if distance < 20 and height <= 10 then
        call GroupRemoveUnit(d.g, u)
    endif
    set d.iterator = d.iterator + 1
endfunction


private function Callback takes nothing returns nothing
    local otherdata d = GetAttachedStructOther(GetExpiredTimer()) 
    set dddddd = d
    if FirstOfGroup(d.g) == null then
        call d.destroy()
        call PauseTimer(GetExpiredTimer())
        call DestroyTimer(GetExpiredTimer())
    else
        call ForGroup(d.g , function CallbackForgroup)
    endif
    
    set d.iterator = 0
endfunction



private function Act takes nothing returns nothing
    local location loc = GetSpellTargetLoc()
    local unit u = GetTriggerUnit()
    local otherdata d = otherdata.create(u, GetLocationX(loc), GetLocationY(loc))
    local integer i = 0
    local real angleBetween = (360/UNITS_PER_LAYER) // The amount of units on the height = this/2
    local real angleDone = 0
    local real angleDoneHeight = 0
    local real cz = 1
    local timer t = CreateTimer()
    local real dist
    loop
        exitwhen cz < 0
        loop 
            exitwhen angleDone >= 360. or cz < 0
            set cz = RADIUS * Cos(angleDoneHeight*bj_DEGTORAD)
            set u = CreateUnit(d.p, DUMMY_ID, d.x + RADIUS * Sin(angleDoneHeight*bj_DEGTORAD) * Cos(angleDone*bj_DEGTORAD) , d.y + RADIUS * Sin(angleDoneHeight*bj_DEGTORAD) * Sin(angleDone*bj_DEGTORAD) , 270)
            call UnitApplyTimedLife( u, 'BTLF', 6)
            call SetUnitFlyHeight(u, cz + 10, 0)
            call GroupAddUnit(d.g, u)
            set angleDone = angleDone + angleBetween
            
            set dist = SquareRoot((GetUnitX(u) - d.x) * (GetUnitX(u)  - d.x) + (GetUnitY(u)  - d.y) * (GetUnitY(u) - d.y))
            set d.xyspeeds<i> = (dist * TIMER_PERIOD) / DECREASE_TIME
            set d.heightspeeds<i> = (GetUnitFlyHeight(u) * TIMER_PERIOD) / DECREASE_TIME
            set u = null
            set i = i + 1
        endloop
        set angleDone = 0
        set angleDoneHeight = angleDoneHeight+angleBetween
    endloop

    
    call AttachStructOther(t, d)
    call TimerStart(t, TIMER_PERIOD, true, function Callback)
    
endfunction

private function Cond takes nothing returns boolean
    return GetSpellAbilityId() == SPELL_ID
endfunction

private function Init takes nothing returns nothing
    local trigger Trig = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(Trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(Trig, Condition(function Cond))
    call TriggerAddAction(Trig, function Act)
endfunction
endlibrary</i></i>
 

Gwypaas

hook DoNothing MakeGUIUsersCrash
Reaction score
50
How could it be null?

JASS:
    static method create takes unit u, real x, real y returns otherdata
        local otherdata d = .allocate()
        set d.x = x
        set d.y = y
        set d.u = u
        set d.g = CreateGroup()  // Here it gets created
        set d.p = GetOwningPlayer(u)
        set d.iterator = 0
        return d
    endmethod


And here the units are added to the group:
JASS:
            set cz = RADIUS * Cos(angleDoneHeight*bj_DEGTORAD)
            set u = CreateUnit(d.p, DUMMY_ID, d.x + RADIUS * Sin(angleDoneHeight*bj_DEGTORAD) * Cos(angleDone*bj_DEGTORAD) , d.y + RADIUS * Sin(angleDoneHeight*bj_DEGTORAD) * Sin(angleDone*bj_DEGTORAD) , 270)
            call UnitApplyTimedLife( u, &#039;BTLF&#039;, 6)
            call SetUnitFlyHeight(u, cz + 10, 0)
            call GroupAddUnit(d.g, u) // There



And my code "works" since the units gets moved but they get moved in entirely wrong direction if you only have 1 instance.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top