AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Suggestions / Requests (https://forums.alliedmods.net/forumdisplay.php?f=12)
-   -   Solved Something strange about function limit (https://forums.alliedmods.net/showthread.php?t=333002)

Adryyy 06-13-2021 09:48

Something strange about function limit
 
Hi. I have this code:
PHP Code:

    set_user_health(iKiller,min(user_data[iKiller][max_hp],get_user_health(iKiller) + user_data[iKiller][!hs?hp_kill:hp_kill_hs]+wpn[0]=='k'?
    
user_data[iKiller][!hs?knife_kill_multi:knife_kill_hs_multi]:wpn[1]=='r'?user_data[iKiller][grenade_kill_multi]:0));
    
set_user_armor(iKiller,min(user_data[iKiller][max_ap],get_user_armor(iKiller) + user_data[iKiller][!hs?ap_kill:ap_kill_hs]+wpn[0]=='k'?
    
user_data[iKiller][!hs?knife_kill_multi:knife_kill_hs_multi]:wpn[1]=='r'?user_data[iKiller][grenade_kill_multi]:0))
    
cs_set_user_money(iKillercs_get_user_money(iKiller) + user_data[iKiller][!hs?money_kill:money_kill_hs]+wpn[0]=='k'?
    
user_data[iKiller][!hs?knife_kill_multi:knife_kill_hs_multi]:wpn[1]=='r'?user_data[iKiller][grenade_kill_multi]:DEFAULT_CS_KILL_MONEY,1); 

But will set everything(hp,ap,money) to 0, but the logic of function is ok. I tested stored values(every one, one by one), and they are ok.

If i use like this:
PHP Code:

    if(hs){
        if(
wpn[0]=='k'){
            
set_user_health(iKiller,min(user_data[iKiller][max_hp],\
            
get_user_health(iKiller)+user_data[iKiller][hp_kill_hs]+user_data[iKiller][knife_kill_hs_multi]))
            
cs_set_user_money(iKiller,min(16000,\
            
cs_get_user_money(iKiller)+user_data[iKiller][money_kill_hs]+user_data[iKiller][knife_kill_hs_multi]),1)
            
set_user_armor(iKiller,min(user_data[iKiller][max_ap],\
            
get_user_armor(iKiller)+user_data[iKiller][ap_kill_hs]+user_data[iKiller][knife_kill_hs_multi]))
        }
        else{
            
set_user_health(iKiller,min(user_data[iKiller][max_hp],get_user_health(iKiller)+user_data[iKiller][hp_kill_hs]))
            
cs_set_user_money(iKiller,min(16000,cs_get_user_money(iKiller)+user_data[iKiller][money_kill_hs]),1)
            
set_user_armor(iKiller,min(user_data[iKiller][max_ap],get_user_armor(iKiller)+user_data[iKiller][ap_kill_hs]))
        }
    }
    else{
        if(
wpn[0]=='k'){
            
set_user_health(iKiller,min(user_data[iKiller][max_hp],\
            
get_user_health(iKiller)+user_data[iKiller][hp_kill]+user_data[iKiller][knife_kill_multi]))
            
cs_set_user_money(iKiller,min(16000,\
            
cs_get_user_money(iKiller)+user_data[iKiller][money_kill]+user_data[iKiller][knife_kill_multi]),1)
            
set_user_armor(iKiller,min(user_data[iKiller][max_ap],\
            
get_user_armor(iKiller)+user_data[iKiller][ap_kill]+user_data[iKiller][knife_kill_multi]))
        }
        else if(
wpn[1]=='r'){
            
set_user_health(iKiller,min(user_data[iKiller][max_hp],\
            
get_user_health(iKiller)+user_data[iKiller][hp_kill]+user_data[iKiller][grenade_kill_multi]))
            
cs_set_user_money(iKiller,min(16000,\
            
cs_get_user_money(iKiller)+user_data[iKiller][money_kill]+user_data[iKiller][grenade_kill_multi]),1)
            
set_user_armor(iKiller,min(user_data[iKiller][max_ap],\
            
get_user_armor(iKiller)+user_data[iKiller][ap_kill]+user_data[iKiller][grenade_kill_multi]))
        }
        else{
            
set_user_health(iKiller,min(user_data[iKiller][max_hp],get_user_health(iKiller)+user_data[iKiller][hp_kill]))
            
cs_set_user_money(iKiller,min(16000,cs_get_user_money(iKiller)+user_data[iKiller][money_kill]),1)
            
set_user_armor(iKiller,min(user_data[iKiller][max_ap],get_user_armor(iKiller)+user_data[iKiller][ap_kill]))
        }
    } 

Will set the right values.

So..i don't understand why the first type is not working, but the second is...I tried with clamp, the same problem for first code.

fysiks 06-13-2021 16:16

Re: Something strange about function limit
 
There is often no benefit to trying to put an insane amount of code into a single line and often causes you to create bugs.

Are the two codes supposed to do the same thing? If yes, is there some reason you are trying to refactor the code? Maybe there is a better solution for your goal.

I did my own version of refactoring the second code you posted and it is much more modular, easier to change the calculations, and much much easier to debug:

PHP Code:

// Set headshot bonus based on headshot status
new hsHealthBonushsMoneyBonushsArmorBonus
hsHealthBonus 
user_data[iKiller][hs hp_kill_hs hp_kill]
hsMoneyBonus user_data[iKiller][hs money_kill_hs money_kill]
hsArmorBonus user_data[iKiller][hs ap_kill_hs ap_kill]

// Set the bonus values based on weapon type
new weaponHealthBonus 0weaponMoneyBonus 0weaponArmorBonus 0
if( wpn[0] == 'k' // Knife
{
    
weaponHealthBonus user_data[iKiller][knife_kill_multi]
    
weaponMoneyBonus user_data[iKiller][knife_kill_multi]
    
weaponArmorBonus user_data[iKiller][knife_kill_multi]
}
else if( 
wpn[1] == 'r' // Grenade
{
    
weaponHealthBonus user_data[iKiller][grenade_kill_multi]
    
weaponMoneyBonus user_data[iKiller][grenade_kill_multi]
    
weaponArmorBonus user_data[iKiller][grenade_kill_multi]
}

// Calculate new values
new newHealthnewMoneynewArmor
newHealth 
get_user_health(iKiller) + hsHealthBonus weaponHealthBonus
newMoney 
cs_get_user_money(iKiller) + hsMoneyBonus weaponMoneyBonus
newArmor 
get_user_armor(iKiller) + hsArmorBonus weaponArmorBonus

// Set new values without exceeding max value
set_user_health(iKillermin(user_data[iKiller][max_hp], newHealth))
cs_set_user_money(iKillermin(16000newMoney), 1)
set_user_armor(iKillermin(user_data[iKiller][max_ap], newArmor)) 


Adryyy 06-15-2021 09:26

Re: Something strange about function limit
 
ok i got the idea, thanks!! (solved)


All times are GMT -4. The time now is 01:31.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.