Page 4 of 6 FirstFirst ... 23456 LastLast
Results 31 to 40 of 52

Thread: Give Weapon (but only once?)

  1. #31

    Default

    No problem, I enjoy this stuff so I get something out of it too .

    Do you mean cb_sniper_give? I didn't see anything in your version that allowed more than one 'allow', unless I missed something?

  2. #32

    Default

    :facepalm:

    Yes, cb_rifle_give is what I meant to type. End-of-day Brain isn't useful.

    I just tested it and everything seems to be working great - Thank you! I'll test it out tonight with ~20 people to see if it holds up. My script I posted seemed to work fine for one person, but stopped once we had about 6 people in the server (everyone was getting Rockets, and I was really dreading figuring out which of the 700 if statements was breaking it lol).

    I'm happy it's working, but I'm wondering if you can explain how the cb_*_give section works? I don't understand how it's checking all the weapons with so few lines of code haha
    Last edited by [cB]SplatterGuts; January 4th, 2019 at 04:00 PM.

  3. #33

    Default

    Sure, it works just like the code before it when determining defaults and swaps, by looping through the available 8 classes:


    GiveExtras local.weaponclass local.weapon local.weap local.player local.team: // these are the variables passed into this function
    for (local.i = 1; local.i <= local.weaponclass.size; local.i++) // this is the for loop, where local.i is defined on entry and set to 1, then with a condition that as long as local.i is less than or equal to the size of the weaponclass array (8) it will continue iterating, and at the end of each iteration it increments, local.i++, which is just a shorter version of local.i = local.i + 1
    {
    local.class = local.weaponclass[local.i] // every iteration or loop, local.class is set to local.weaponclass[local.i], and as described above, local.i will go from 1 to 8 so at the start this will be local.weaponclass[1] and so on
    local.item = local.weapon[local.class][local.team] // we then store the item every iteration, at the start this will be local.weapon[local.weaponclass[1]][local.team] which will be local.weapon["rifle"][local.team] and then it will be sniper and so on
    if (local.class != "grenade")
    {
    if (local.item != local.weap) // as long as the current iteration local.item is not equal to the player's weapon
    {
    if (getcvar("cb_" + local.class + "_give") == "1") // check to see if the current iteration class can be given - at the start it will be cb_rifle_give then cb_sniper_give etc...
    {
    local.player give local.item
    }
    else
    {
    local.player take local.item
    }
    }
    }
    else
    {
    local.player give local.item // we give grenades by default, no checks needed
    }
    }
    end


    It's iterating over those lines for as long as the local.i variable is less than or equal to the size of the weaponclass array and updating each variable every time for the following checks.

    'for' loops are just a handy way to do this, allowing you to initialise a variable, set a condition, and perform an action every iteration all within the parentheses ( ).

    So this:


    local.string[1] = "hello"
    local.string[2] = "darkness"
    local.string[3] = "my"
    local.string[4] = "old"
    local.string[5] = "friend"

    for (local.i = 1; local.i <= local.string.size; local.i++)
    {
    println local.string[local.i]
    }


    Would print out

    hello
    darkness
    my
    old
    friend


    in the console

    You can do all sorts. For example, if you wanted to start at class 5 and go backwards, it would be:

    for (local.i = 5; local.i >= 1; local.i--)
    {
    //code
    }

    Or increment by 0.5 and have extra conditions:

    for (local.i = 0; local.i <= 10 && local.variable != 1; local.i += 0.5)
    {
    //code
    }

    etc...

    You can do the same stuff in a 'while' loop, but it just uses more lines by separating the logic:

    local.i = 1
    while (local.i <= local.weaponclass.size)
    {
    //code

    local.i++
    }


    The variable name doesn't have to be 'i' either, it's just a common practice in various languages that people have never seen a need to depart from. Whether it started because i stands for index or because an old language autocasted variables to integers if they start with 'i', it doesn't really matter, it's just nice and succinct.
    Last edited by 1337Smithy; January 5th, 2019 at 11:11 AM.

  4. #34

    Default

    Wow! Thanks for breaking that down. It all makes sense to me now

    I really appreciate your help on this.

  5. #35

    Default

    No problem. I just noticed a bit of superfluous duplication I made actually. As we never reference the player's weapon entity after grabbing the model name, we can clear the targetname straight after.

    So you can remove the several:

    $(local.weap_targetname).targetname = NULL

    elsewhere in the code

    And just have one here:

    if ($(local.weap_targetname) != NULL)
    {
    local.weap = $(local.weap_targetname).model // we only ever reference the model name
    $(local.weap_targetname).targetname = NULL // clear the targetname so we can reuse on next spawn
    }
    else
    {
    end // player isn't holding a weapon
    }


    There's also a bit of defensive code you could put just before checking for a valid class (just an easy way of checking if it's null):

    // the player is holding an unrecognised item
    if !(local.player_class)
    {
    end
    }

    // no swaps found, proceed to check if player's class is allowed
    if (getcvar("cb_" + local.player_class + "_allow" ) == "0")
    {
    local.player takeall // not allowed, assign a default weapon
    local.player give local.default_weapon // ** should we hard-code a default default_weapon if it is null?? **
    local.player use local.default_weapon
    local.weap = local.default_weapon // this is now his weapon
    }


    Again, it may be unlikely to occur, but if it does it would stop a load of errors being thrown up. You can add your own println statements in there to check when it does if you wish (along with other places in the code).
    Last edited by 1337Smithy; January 6th, 2019 at 04:03 AM.

  6. #36
    Senior Member verruguitens's Avatar
    Join Date
    Mar 2017
    Location
    Argentina
    Posts
    207

    Default

    Hello i want this too, i create a pk3 with all CFG for only snipa, only rifle, only pistol, only rocket, with CVARS "sniper 1/0", "rifle 1/0" etc, perfect work but drop weapons infinite if press H (drop weapon), generates lag and the server goes down if people do that.


    main:

    level.sniper = getcvar "sniper"
    if(level.sniper == "1")



    while(1)
    {
    for(local.i=1;local.i<=$player.size;local.i++)
    {
    if($player[local.i].done == NIL)
    {
    if($player[local.i].dmteam == axis)
    {

    $player[local.i] give models/weapons/kar98sniper.tik
    $player[local.i] take models/weapons/kar98.tik
    $player[local.i] take models/weapons/mp44.tik
    $player[local.i] take models/weapons/panzerschreck.tik
    $player[local.i] take models/weapons/shotgun.tik
    $player[local.i] take models/weapons/steilhandgranate.tik
    $player[local.i] take models/weapons/p38.tik
    $player[local.i] take models/weapons/mp40.tik
    $player[local.i] take models/weapons/nebelhandgranate.tik
    $player[local.i] take models/weapons/kar98_mortar.tik
    $player[local.i] take models/weapons/G43.tik
    $player[local.i] take models/weapons/Gr_W_Mine.tik
    $player[local.i] take models/weapons/Gr_W_MineDetector.tik
    $player[local.i] take models/weapons/It_W_Beretta.tik
    $player[local.i] take models/weapons/It_W_Bomba.tik
    $player[local.i] take models/weapons/It_W_BombaBreda.tik
    $player[local.i] take models/weapons/It_W_Breda.tik
    $player[local.i] take models/weapons/It_W_Carcano.tik
    $player[local.i] take models/weapons/It_W_Moschetto.tik
    $player[local.i] thread death
    }
    else if($player[local.i].dmteam == allies)
    {
    $player[local.i] give models/weapons/kar98sniper.tik
    $player[local.i] take models/weapons/springfield.tik
    $player[local.i] take models/weapons/bar.tik
    $player[local.i] take models/weapons/bazooka.tik
    $player[local.i] take models/weapons/m1_garand.tik
    $player[local.i] take models/weapons/shotgun.tik
    $player[local.i] take models/weapons/m2frag_grenade.tik
    $player[local.i] take models/weapons/colt45.tik
    $player[local.i] take models/weapons/thompsonsmg.tik
    $player[local.i] take models/weapons/ppsh_smg.tik
    $player[local.i] take models/weapons/sten.tik
    $player[local.i] take models/weapons/enfield.tik
    $player[local.i] take models/weapons/Mosin_Nagant_Rifle.tik
    $player[local.i] take models/weapons/mills_grenade.tik
    $player[local.i] take models/weapons/LandmineAllies.tik
    $player[local.i] take models/weapons/M18_smoke_grenade.tik
    $player[local.i] take models/weapons/m2frag_grenade.tik
    $player[local.i] take models/weapons/Nagant_revolver.tik
    $player[local.i] take models/weapons/RDG-1_Smoke_grenade.tik
    $player[local.i] take models/weapons/Russian_F1_grenade.tik
    $player[local.i] take models/weapons/svt_rifle.tik
    $player[local.i] take models/weapons/Uk_W_L42A1.tik
    $player[local.i] take models/weapons/Uk_W_Piat.tik
    $player[local.i] take models/weapons/Uk_W_Vickers.tik
    $player[local.i] take models/weapons/US_W_Mine.tik
    $player[local.i] take models/weapons/US_W_MineDetector.tik
    $player[local.i] take models/weapons/webley_revolver.tik
    $player[local.i] take models/weapons/DeLisle.tik
    $player[local.i] thread death
    }
    }
    }
    wait 1
    }
    end
    death:

    local.spec = 1
    while(local.spec)
    {
    if(self == NULL)
    local.spec = 0
    else
    {
    if!(isalive self || self.dmteam == spectator)
    {
    self.done = NIL
    local.spec = 0
    }
    }
    wait 1
    }

    end

    put line "exec global/sniper.cfg" in mike_torso.st and have folder MODELS/PROJECTILES and MODELS/WEAPONS in pk3, My intention is to make a multi mod all in the same pk3, and activate and deactivate the one I want with CVARS by console, how do I solve this issue that it drops infinite weapons?.

  7. #37

    Default

    The problem is the script was missing a variable
    I have fixed now:

    main:

    if(level.sniper_mod == 1)
    end

    level.sniper_mod = 1

    local.sniper = getcvar "sniper"
    if(local.sniper == "1")

    while(1)
    {

    for(local.i=1;local.i<=$player.size;local.i++)
    {

    local.player = local.player

    if(local.player.done == NIL)
    {
    if(local.player.dmteam == axis)
    {

    local.player give models/weapons/kar98sniper.tik
    local.player take models/weapons/kar98.tik
    local.player take models/weapons/mp44.tik
    local.player take models/weapons/panzerschreck.tik
    local.player take models/weapons/shotgun.tik
    local.player take models/weapons/steilhandgranate.tik
    local.player take models/weapons/p38.tik
    local.player take models/weapons/mp40.tik
    local.player take models/weapons/nebelhandgranate.tik
    local.player take models/weapons/kar98_mortar.tik
    local.player take models/weapons/G43.tik
    local.player take models/weapons/Gr_W_Mine.tik
    local.player take models/weapons/Gr_W_MineDetector.tik
    local.player take models/weapons/It_W_Beretta.tik
    local.player take models/weapons/It_W_Bomba.tik
    local.player take models/weapons/It_W_BombaBreda.tik
    local.player take models/weapons/It_W_Breda.tik
    local.player take models/weapons/It_W_Carcano.tik
    local.player take models/weapons/It_W_Moschetto.tik
    local.player thread death
    }
    else if(local.player.dmteam == allies)
    {
    local.player give models/weapons/kar98sniper.tik
    local.player take models/weapons/springfield.tik
    local.player take models/weapons/bar.tik
    local.player take models/weapons/bazooka.tik
    local.player take models/weapons/m1_garand.tik
    local.player take models/weapons/shotgun.tik
    local.player take models/weapons/m2frag_grenade.tik
    local.player take models/weapons/colt45.tik
    local.player take models/weapons/thompsonsmg.tik
    local.player take models/weapons/ppsh_smg.tik
    local.player take models/weapons/sten.tik
    local.player take models/weapons/enfield.tik
    local.player take models/weapons/Mosin_Nagant_Rifle.tik
    local.player take models/weapons/mills_grenade.tik
    local.player take models/weapons/LandmineAllies.tik
    local.player take models/weapons/M18_smoke_grenade.tik
    local.player take models/weapons/m2frag_grenade.tik
    local.player take models/weapons/Nagant_revolver.tik
    local.player take models/weapons/RDG-1_Smoke_grenade.tik
    local.player take models/weapons/Russian_F1_grenade.tik
    local.player take models/weapons/svt_rifle.tik
    local.player take models/weapons/Uk_W_L42A1.tik
    local.player take models/weapons/Uk_W_Piat.tik
    local.player take models/weapons/Uk_W_Vickers.tik
    local.player take models/weapons/US_W_Mine.tik
    local.player take models/weapons/US_W_MineDetector.tik
    local.player take models/weapons/webley_revolver.tik
    local.player take models/weapons/DeLisle.tik
    local.player thread death
    }

    local.player.done = 1
    }
    }
    wait 1

    }

    end

    death:

    while(IsAlive self)
    {
    waitframe
    }

    if(self != NULL)
    {
    self.done = 0
    }

    end

  8. #38
    Senior Member verruguitens's Avatar
    Join Date
    Mar 2017
    Location
    Argentina
    Posts
    207

    Default

    Quote Originally Posted by DoubleKill View Post
    The problem is the script was missing a variable
    I have fixed now:

    main:

    if(level.sniper_mod == 1)
    end

    level.sniper_mod = 1

    local.sniper = getcvar "sniper"
    if(local.sniper == "1")

    while(1)
    {

    for(local.i=1;local.i<=$player.size;local.i++)
    {

    local.player = local.player

    if(local.player.done == NIL)
    {
    if(local.player.dmteam == axis)
    {

    local.player give models/weapons/kar98sniper.tik
    local.player take models/weapons/kar98.tik
    local.player take models/weapons/mp44.tik
    local.player take models/weapons/panzerschreck.tik
    local.player take models/weapons/shotgun.tik
    local.player take models/weapons/steilhandgranate.tik
    local.player take models/weapons/p38.tik
    local.player take models/weapons/mp40.tik
    local.player take models/weapons/nebelhandgranate.tik
    local.player take models/weapons/kar98_mortar.tik
    local.player take models/weapons/G43.tik
    local.player take models/weapons/Gr_W_Mine.tik
    local.player take models/weapons/Gr_W_MineDetector.tik
    local.player take models/weapons/It_W_Beretta.tik
    local.player take models/weapons/It_W_Bomba.tik
    local.player take models/weapons/It_W_BombaBreda.tik
    local.player take models/weapons/It_W_Breda.tik
    local.player take models/weapons/It_W_Carcano.tik
    local.player take models/weapons/It_W_Moschetto.tik
    local.player thread death
    }
    else if(local.player.dmteam == allies)
    {
    local.player give models/weapons/kar98sniper.tik
    local.player take models/weapons/springfield.tik
    local.player take models/weapons/bar.tik
    local.player take models/weapons/bazooka.tik
    local.player take models/weapons/m1_garand.tik
    local.player take models/weapons/shotgun.tik
    local.player take models/weapons/m2frag_grenade.tik
    local.player take models/weapons/colt45.tik
    local.player take models/weapons/thompsonsmg.tik
    local.player take models/weapons/ppsh_smg.tik
    local.player take models/weapons/sten.tik
    local.player take models/weapons/enfield.tik
    local.player take models/weapons/Mosin_Nagant_Rifle.tik
    local.player take models/weapons/mills_grenade.tik
    local.player take models/weapons/LandmineAllies.tik
    local.player take models/weapons/M18_smoke_grenade.tik
    local.player take models/weapons/m2frag_grenade.tik
    local.player take models/weapons/Nagant_revolver.tik
    local.player take models/weapons/RDG-1_Smoke_grenade.tik
    local.player take models/weapons/Russian_F1_grenade.tik
    local.player take models/weapons/svt_rifle.tik
    local.player take models/weapons/Uk_W_L42A1.tik
    local.player take models/weapons/Uk_W_Piat.tik
    local.player take models/weapons/Uk_W_Vickers.tik
    local.player take models/weapons/US_W_Mine.tik
    local.player take models/weapons/US_W_MineDetector.tik
    local.player take models/weapons/webley_revolver.tik
    local.player take models/weapons/DeLisle.tik
    local.player thread death
    }

    local.player.done = 1
    }
    }
    wait 1

    }

    end

    death:

    while(IsAlive self)
    {
    waitframe
    }

    if(self != NULL)
    {
    self.done = 0
    }

    end
    Not work. :/

  9. #39

    Default

    Sorry, was a mistake on the script when i have change him
    Is good now:

    main:

    if(level.sniper_mod == 1)
    end

    level.sniper_mod = 1

    local.sniper = getcvar "sniper"
    if(local.sniper == "1")

    while(1)
    {

    for(local.i=1;local.i<=$player.size;local.i++)
    {

    local.player = $player[local.i]

    if(local.player.done == NIL)
    {
    if(local.player.dmteam == axis)
    {

    local.player give models/weapons/kar98sniper.tik
    local.player take models/weapons/kar98.tik
    local.player take models/weapons/mp44.tik
    local.player take models/weapons/panzerschreck.tik
    local.player take models/weapons/shotgun.tik
    local.player take models/weapons/steilhandgranate.tik
    local.player take models/weapons/p38.tik
    local.player take models/weapons/mp40.tik
    local.player take models/weapons/nebelhandgranate.tik
    local.player take models/weapons/kar98_mortar.tik
    local.player take models/weapons/G43.tik
    local.player take models/weapons/Gr_W_Mine.tik
    local.player take models/weapons/Gr_W_MineDetector.tik
    local.player take models/weapons/It_W_Beretta.tik
    local.player take models/weapons/It_W_Bomba.tik
    local.player take models/weapons/It_W_BombaBreda.tik
    local.player take models/weapons/It_W_Breda.tik
    local.player take models/weapons/It_W_Carcano.tik
    local.player take models/weapons/It_W_Moschetto.tik
    local.player thread death
    }
    else if(local.player.dmteam == allies)
    {
    local.player give models/weapons/kar98sniper.tik
    local.player take models/weapons/springfield.tik
    local.player take models/weapons/bar.tik
    local.player take models/weapons/bazooka.tik
    local.player take models/weapons/m1_garand.tik
    local.player take models/weapons/shotgun.tik
    local.player take models/weapons/m2frag_grenade.tik
    local.player take models/weapons/colt45.tik
    local.player take models/weapons/thompsonsmg.tik
    local.player take models/weapons/ppsh_smg.tik
    local.player take models/weapons/sten.tik
    local.player take models/weapons/enfield.tik
    local.player take models/weapons/Mosin_Nagant_Rifle.tik
    local.player take models/weapons/mills_grenade.tik
    local.player take models/weapons/LandmineAllies.tik
    local.player take models/weapons/M18_smoke_grenade.tik
    local.player take models/weapons/m2frag_grenade.tik
    local.player take models/weapons/Nagant_revolver.tik
    local.player take models/weapons/RDG-1_Smoke_grenade.tik
    local.player take models/weapons/Russian_F1_grenade.tik
    local.player take models/weapons/svt_rifle.tik
    local.player take models/weapons/Uk_W_L42A1.tik
    local.player take models/weapons/Uk_W_Piat.tik
    local.player take models/weapons/Uk_W_Vickers.tik
    local.player take models/weapons/US_W_Mine.tik
    local.player take models/weapons/US_W_MineDetector.tik
    local.player take models/weapons/webley_revolver.tik
    local.player take models/weapons/DeLisle.tik
    local.player thread death
    }

    local.player.done = 1
    }
    }
    wait 1

    }

    end

    death:

    while(IsAlive self)
    {
    waitframe
    }

    if(self != NULL)
    {
    self.done = 0
    }

    end
    Last edited by DoubleKill; June 4th, 2022 at 08:16 AM.

  10. #40

    Default

    It's probably worth testing cos I can see an issue still. I think you mean $player[local.i]

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •