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?
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?
: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
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.
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.
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?.
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
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.
It's probably worth testing cos I can see an issue still. I think you mean $player[local.i]