wc3edit.net

United Warcraft 3 map hacking!
It is currently March 29th, 2024, 9:54 am

All times are UTC




Post new topic Reply to topic  [ 1 post ] 
Author Message
PostPosted: November 11th, 2009, 9:43 pm 
Offline
Some Honorary Title

Joined: June 8th, 2007, 5:08 am
Posts: 1781
Title: Angry Bird
Content

Chapter one- A direct argument is faster than a converted function

Chapter two- BJ or not, make your choice!!

Chapter three- You don't need a saving account to save some RAM!!

Chapter four- A leaky container won't hold water!!

Credit: JASS codes written by JJ2197, Aero, Weirdones2, Fai, Dekar, SgGuy and Xantan

[line][/line]
Chapter ONE - A direct argument is faster!!!

Example 1:
Code:
call TriggerRegisterPlayerUnitEvent(trigger,player,ConvertPlayerUnitEvent(273),null)
call TriggerRegisterPlayerUnitEvent(trigger,player,ConvertPlayerUnitEvent(275),null)

The 3rd argument required will be a "playerunitevent".

ConvertPlayerUnitEvent(273)=EVENT_PLAYER_UNIT_SPELL_CAST
ConvertPlayerUnitEvent(275)=EVENT_PLAYER_UNIT_SPELL_FINISH

Somehow, converting an integer to a playerunitevent is slow. Get a direct argument instead.
Code:
call TriggerRegisterPlayerUnitEvent(trigger,player,EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(trigger,player,EVENT_PLAYER_UNIT_SPELL_FINISH,null)



Example 2:
Code:
local integer i=3
call AnyFunction(i+2)

Obviously AnyFunction is a function that takes an integer argument.
In the above case. Anyfunction will take argument integer 5 (3+2).
Somehow, the following code is better. Get direct arguments as often as possible.

Code:
call AnyFuntion(5)

[line][/line]
Chapter TWO - BJ or not, make your choice!!

Example 1:
Code:
function TriggerRegisterDialogEventBJ takes trigger trig, dialog whichDialog returns event
    return TriggerRegisterDialogEvent(trig, whichDialog)
endfunction

Well, this is one of the lame and useless BJ function ever. And there are many useless BJ functions!

As you can see, TriggerRegisterDialogEventBJ(trig, dialog) does nothing but only calling a native function, which is TriggerRegisterDialogEvent(trig, whichDialog).

Instead of wasting a few more cycles, you may just directly call the native function.
Thus

calling TriggerRegisterDialogEvent(trig, whichDialog) is always faster than calling TriggerRegisterDialogEventBJ(trig, whichDialog)

And don't forget, both of them do the same thing! You don't need the BJ here.


Example 2:
Code:
call SetHeroLevel(whichHero, newLevel, showEyeCandy)
call SetHeroLevelBJ(whichHero, newLevel, showEyeCandy)

This is somehow, not like the above example. Though both of them seems alike but the BJ's function here is useful.

Notice that SetHeroLevel will only able to set a higher hero's level. Thus you can't reduce hero's level by using this native function.

Here is what you should do to make it able to reduce hero's level.
Code:
function Fai_Setherolevel takes unit whichHero, integer newLevel, boolean showEyeCandy returns nothing
local boolean faib
local integer oldLevel = GetHeroLevel(whichHero)
if (newLevel > oldLevel) then
call SetHeroLevel(whichHero, newLevel, showEyeCandy)
elseif (newLevel < oldLevel) then
set faib=UnitStripHeroLevel(whichHero, oldLevel - newLevel)
endif
endfunction

Compare the above Pure_JASS function with the following function which Blizzard provided.
Not much differences, right? In this case, Blizzard has provided a function considered good enough. Use the BJ function to save some spaces.
Code:
function SetHeroLevelBJ takes unit whichHero, integer newLevel, boolean showEyeCandy returns nothing
local integer oldLevel = GetHeroLevel(whichHero)
if (newLevel > oldLevel) then
call SetHeroLevel(whichHero, newLevel, showEyeCandy)
elseif (newLevel < oldLevel) then
call UnitStripHeroLevel(whichHero, oldLevel - newLevel)
else
endif
endfunction

[line][/line]
Chapter THREE - You don't need a saving account to save some RAM!!

Example 1:
Code:
local integer c7=S2I(SubString(string,9,11))
local integer temp7=0
if SubString(string,0,8)=="-additem"then
set temp7=0
loop
set temp7=temp7+1
exitwhen temp7>c7
call CreateItemLoc(ChooseRandomItemExBJ(-1,ITEM_TYPE_ANY),GetUnitLoc(unit))
endloop
endif

This is what we often see while running a "loop" action. c7 is an integer in a chat string, this integer will decide how many time the function in between "loop" and "endloop" runs.

Integer temp7 is used to calculate how many times the function has already runned.

Somehow, since c7 has already an integer indicate how many times the "loop" should run. We may not need temp7! Here is what you can do to save some RAM.
Code:
local integer c7=S2I(SubString(string,9,11))
if SubString(string,0,8)=="-additem"then
loop
set c7=c7-1
exitwhen c7<0
call CreateItemLoc(ChooseRandomItemExBJ(-1,ITEM_TYPE_ANY),GetUnitLoc(unit))
endloop
endif

In this case, use a same variable for different purposes! Use as less variable as possible!

Example 2:
Code:
if fai=="ow."then
if z7<0 or z7>15then
call DoNothing()
else
call SetUnitOwner(u7,Player(z7),ggF)
endif
endif

Integer z7 can't be bigger than 15 or smaller than 0 or player(z7) will make the game crashes.
That's why a detector is there doing its job.

Somehow, calling DoNothing() is not really necessary. It can be simply done as following:
Code:
if fai=="ow."then
if z7>-1 and z7<16then
call SetUnitOwner(u7,Player(z7),ggF)
endif
endif

Save as many lines as possible!!

[line][/line]
Chapter FOUR - A leaky container won't hold water!!

Example 1:
Code:
function FastUnit2 takes nothing returns nothing
local player p2p=GetTriggerPlayer()
local integer I2I=GetTrainedUnitType()
local location j2j=GetUnitLoc(GetTriggerUnit())
call CreateUnitAtLoc(p2p,I2I,j2j,270)
set p2p=null
set j2j=null
endfunction

locations leak. Minor memory leakings are acceptable. Somehow it's fine to avoid as much memory leakings as possible

It's easy. Just save the location on a local variable and then remove it. As following:
Code:
function FastUnit2 takes nothing returns nothing
local player p2p=GetTriggerPlayer()
local integer I2I=GetTrainedUnitType()
local location j2j=GetUnitLoc(GetTriggerUnit())
call CreateUnitAtLoc(p2p,I2I,j2j,270)
call RemoveLocation(j2j)
set p2p=null
set j2j=null
endfunction


Example 2:
Code:
function Trig_w00t_Func001001 takes nothing returns boolean
return(IsPlayerInForce(udg_SCVirus,GetForceOfPlayer(GetTriggerPlayer())))
endfunction

Here again, GetForceOfPlayer returns force. Forces leak.

Just use an already existed force to avoid memory leaks, as following:
Code:
function Trig_w00t_Func001001 takes nothing returns boolean
return(IsPlayerInForce(udg_SCVirus,bj_FORCE_PLAYER[GetPlayerId(GetTriggerPlayer)]))
endfunction


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC


Who is online

Users browsing this forum: Google [Bot] and 25 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group

phpBB SEO


Privacy Policy Statement
Impressum (German)