Chewbalka
New Member
- Reaction score
- 14
This is my first JASS Script, also it is a JASS version of a GUI system i created, Cone Vision.
Firstly i used "Convert to Custom Text" as a starting point so i didint have to actuall re-write everything. I then reduced it from about 50 functions to 3 and I put all loops into local variables. other then that its almost exactly the same as after conversion.
The problem with this code is that it has more lag then the GUI version. Meaning I can run less units (in the unit group) before lag starts appearing. In the original (GUI) I had 24 units before lag starts with this one I have 18 and its already slightly noticeable.
What can be changed to reduce the lag/performance?
If your to test this script you will need to create the same varaibles as the GUI version needs, these variables are not local.
Firstly i used "Convert to Custom Text" as a starting point so i didint have to actuall re-write everything. I then reduced it from about 50 functions to 3 and I put all loops into local variables. other then that its almost exactly the same as after conversion.
The problem with this code is that it has more lag then the GUI version. Meaning I can run less units (in the unit group) before lag starts appearing. In the original (GUI) I had 24 units before lag starts with this one I have 18 and its already slightly noticeable.
What can be changed to reduce the lag/performance?
If your to test this script you will need to create the same varaibles as the GUI version needs, these variables are not local.
- VISCount int
- VISGroup UnitGroup
- VISLocation Point
- VISTest Visibility Modifier (Array)
JASS:
function Trig_Vision_pathing takes nothing returns boolean
if ( IsTerrainPathableBJ(udg_VISLocation, PATHING_TYPE_WALKABILITY) == true ) then
if ( IsTerrainPathableBJ(udg_VISLocation, PATHING_TYPE_FLOATABILITY) == true ) then
return true
endif
endif
return false
endfunction
function Trig_Vision_main takes nothing returns nothing
local integer forLoopAIndex = 0
local integer forLoopAIndexEnd = 0
if ( IsUnitDeadBJ(GetEnumUnit()) == true ) then
return
else
endif
set udg_VISCount = ( udg_VISCount + 1 )
// 1
call RemoveLocation (udg_VISLocation)
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 50.00, GetUnitFacing(GetEnumUnit()))
if ( Trig_Vision_pathing () ) then
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 150.00 )
set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
set udg_VISCount = ( udg_VISCount + 1 )
endif
set forLoopAIndex = 50
set forLoopAIndexEnd = 100
loop
exitwhen forLoopAIndex > forLoopAIndexEnd
if ( Trig_Vision_pathing () ) then
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
call RemoveLocation (udg_VISLocation)
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
endif
set forLoopAIndex = forLoopAIndex + 2
endloop
// 2
call RemoveLocation (udg_VISLocation)
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 100.00, GetUnitFacing(GetEnumUnit()))
if ( Trig_Vision_pathing () ) then
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 225.00 )
set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
set udg_VISCount = ( udg_VISCount + 1 )
endif
set forLoopAIndex = 100
set forLoopAIndexEnd = 200
loop
exitwhen forLoopAIndex > forLoopAIndexEnd
if ( Trig_Vision_pathing () ) then
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
call RemoveLocation (udg_VISLocation)
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
endif
set forLoopAIndex = forLoopAIndex + 2
endloop
// 3
call RemoveLocation (udg_VISLocation)
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 200.00, GetUnitFacing(GetEnumUnit()))
if ( Trig_Vision_pathing () ) then
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 300.00 )
set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
set udg_VISCount = ( udg_VISCount + 1 )
endif
set forLoopAIndex = 200
set forLoopAIndexEnd = 310
loop
exitwhen forLoopAIndex > forLoopAIndexEnd
if ( Trig_Vision_pathing () ) then
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
call RemoveLocation (udg_VISLocation)
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
endif
set forLoopAIndex = forLoopAIndex + 2
endloop
// 4
call RemoveLocation (udg_VISLocation)
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 310.00, GetUnitFacing(GetEnumUnit()))
if ( Trig_Vision_pathing () ) then
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 400.00 )
set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
set udg_VISCount = ( udg_VISCount + 1 )
endif
call RemoveLocation (udg_VISLocation)
set forLoopAIndex = 310
set forLoopAIndexEnd = 475
loop
exitwhen forLoopAIndex > forLoopAIndexEnd
if ( Trig_Vision_pathing () ) then
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
call RemoveLocation (udg_VISLocation)
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
endif
set forLoopAIndex = forLoopAIndex + 2
endloop
// 5
call RemoveLocation (udg_VISLocation)
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 475.00, GetUnitFacing(GetEnumUnit()))
if ( Trig_Vision_pathing () ) then
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 400.00 )
set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
set udg_VISCount = ( udg_VISCount + 1 )
endif
call RemoveLocation (udg_VISLocation)
set forLoopAIndex = 475
set forLoopAIndexEnd = 600
loop
exitwhen forLoopAIndex > forLoopAIndexEnd
if ( Trig_Vision_pathing () ) then
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
call RemoveLocation (udg_VISLocation)
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
endif
set forLoopAIndex = forLoopAIndex + 2
endloop
// 6
call RemoveLocation (udg_VISLocation)
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 600.00, GetUnitFacing(GetEnumUnit()))
if ( Trig_Vision_pathing () ) then
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 480.00 )
set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
set udg_VISCount = ( udg_VISCount + 1 )
endif
call RemoveLocation (udg_VISLocation)
set forLoopAIndex = 600
set forLoopAIndexEnd = 850
loop
exitwhen forLoopAIndex > forLoopAIndexEnd
if ( Trig_Vision_pathing () ) then
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
call RemoveLocation (udg_VISLocation)
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
endif
set forLoopAIndex = forLoopAIndex + 2
endloop
// 7
call RemoveLocation (udg_VISLocation)
set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 750.00, GetUnitFacing(GetEnumUnit()))
if ( Trig_Vision_pathing () ) then
if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
else
return
endif
else
call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 550.00 )
set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
set udg_VISCount = ( udg_VISCount + 1 )
endif
endfunction
function Trig_ConeVision_Actions takes nothing returns nothing
local integer forLoopAIndex = 0
local integer forLoopAIndexEnd = 0
set forLoopAIndex = 1
set forLoopAIndexEnd = ( CountUnitsInGroup(GetUnitsOfPlayerAll(Player(0))) * 7 )
loop
exitwhen forLoopAIndex > forLoopAIndexEnd
call FogModifierStop( udg_VISTest[forLoopAIndex] )
call DestroyFogModifier( udg_VISTest[forLoopAIndex] )
set forLoopAIndex = forLoopAIndex + 1
endloop
call RemoveLocation (udg_VISLocation)
call DestroyGroup (udg_VISGroup)
set udg_VISGroup = GetUnitsOfPlayerAll(Player(0))
call ForGroupBJ( udg_VISGroup, function Trig_Vision_main )
set udg_VISCount = 1
endfunction
//===========================================================================
function InitTrig_ConeVision takes nothing returns nothing
set gg_trg_ConeVision = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_ConeVision, 0.50 )
call TriggerAddAction( gg_trg_ConeVision, function Trig_ConeVision_Actions )
endfunction