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

Thread: Grenads

  1. #31

    Default

    Use this one:


    main:

    thread check_alive

    level.spot[1] = ( 549 -893 17 )
    level.spot[2] = ( -232 -1008 17 )
    level.spot[3] = ( 616 480 49 )
    level.spot[4] = ( 311 1111 49 )
    level.spot[5] = ( -596 335 -15 )
    level.spot[6] = ( -831 655 169 )
    level.spot[7] = ( -992 454 -15 )
    level.spot[8] = ( -344 911 49 )
    level.spot[9] = ( 1407 2189 513 )
    level.spot[10] = ( 1011 1136 99 )
    level.spot[11] = ( 1031 80 257 )
    level.spot[12] = ( 1536 728 384 )
    //*********************************************************************//

    level.grenades[max_spawns] = 10 // max concurrent spawns \\
    level.grenades[spawn_duration] = 30 // how long they stay in seconds \\
    level.grenades[respawn_delay] = 0 // how long till they come back in seconds \\
    level.grenades[axis_model] = "models/weapons/steilhandgranate.tik"
    level.grenades[allies_model] = "models/weapons/m2frag_grenade.tik"

    thread spawn_grenades
    end

    spawn_grenades:
    for (local.i = 1; local.i <= level.grenades[max_spawns]; local.i++)
    {
    waitthread dm1ammo local.i
    waitframe
    }
    end

    dm1ammo local.num:

    if (local.num > level.spot.size)
    {
    println "*********** removing grenade spawn - not enough spots!"
    end
    }

    while (1)
    {
    local.random = randomint (level.spot.size) + 1

    if (level.spot_used[local.random])
    {
    waitframe // spot already taken - try again \\
    }
    else
    {
    break // free spot found - spawn the grenade \\
    }
    }

    level.spot_used[local.random] = 1

    spawn script_model "targetname" ("steilhandgranate" + local.num)

    local.grenade = $("steilhandgranate" + local.num)
    local.grenade model level.grenades[axis_model]
    local.grenade.origin = level.spot[local.random]
    local.grenade light 0.00 1.50 0.00 50
    local.grenade solid

    spawn trigger_use "targetname" ("ammotrigger" + local.num)

    local.trigger = $("ammotrigger" + local.num)
    local.trigger.origin = local.grenade.origin
    local.trigger setsize ( -20 -20 0 ) ( 20 20 80 )
    local.trigger.grenade = local.grenade
    local.trigger.id = local.num
    local.trigger.spot_index = local.random
    local.trigger setthread gotammo

    //*********************************************************************//

    // wait for the spawn duration //

    for (local.i = 0; local.i <= level.grenades[spawn_duration]; local.i++)
    {
    wait 1

    if (!local.grenade) end // grenade picked up by player, stop here
    }

    // player didn't pick it up, remove and respawn //
    if(local.grenade == NULL)
    {
    local.trigger delete
    }
    else
    {
    local.trigger delete
    local.grenade delete
    }

    level.spot_used[local.random] = 0

    // do you want them to respawn instantly somewhere else if you haven't picked them up? \\
    wait 1
    // if you want them to respawn here after a delay remove above wait and add below: \\
    //wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end

    //*********************************************************************//

    gotammo:

    local.player = parm.other

    if(local.player.ng == 2)
    {

    local.player iprint "You cant get more than 2 nades!"

    }
    else
    {

    local.trigger = self

    local.num = local.trigger.id
    local.spot_index = local.trigger.spot_index
    local.grenade = local.trigger.grenade

    local.grenade delete
    local.trigger delete

    local.player = parm.other
    local.team = local.player.dmteam

    if ( local.team == "allies" )
    {
    local.player give level.grenades[allies_model]
    }
    else
    {
    local.player give level.grenades[axis_model]
    }

    local.player ammo grenade 1
    local.player iprint "You picked up a grenade"

    if(local.player.ng == NIL)
    {
    local.player.ng = 1

    }
    else
    {
    local.player.ng++
    }

    level.spot_used[local.spot_index] = 0

    wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end

    //*********************************************************************//

    check_alive:

    while(1)
    {
    wait 0.02

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

    local.player = $player[local.i]

    if(local.player == NULL)
    end

    if(!isalive local.player)
    {

    local.player.ng = 0
    }

    }

    end


    And put the pk3 on the server.
    Attached Files Attached Files

  2. #32

    Default

    Quote Originally Posted by DoubleKill View Post
    Use this one:


    main:

    thread check_alive

    level.spot[1] = ( 549 -893 17 )
    level.spot[2] = ( -232 -1008 17 )
    level.spot[3] = ( 616 480 49 )
    level.spot[4] = ( 311 1111 49 )
    level.spot[5] = ( -596 335 -15 )
    level.spot[6] = ( -831 655 169 )
    level.spot[7] = ( -992 454 -15 )
    level.spot[8] = ( -344 911 49 )
    level.spot[9] = ( 1407 2189 513 )
    level.spot[10] = ( 1011 1136 99 )
    level.spot[11] = ( 1031 80 257 )
    level.spot[12] = ( 1536 728 384 )
    //*********************************************************************//

    level.grenades[max_spawns] = 10 // max concurrent spawns \\
    level.grenades[spawn_duration] = 30 // how long they stay in seconds \\
    level.grenades[respawn_delay] = 0 // how long till they come back in seconds \\
    level.grenades[axis_model] = "models/weapons/steilhandgranate.tik"
    level.grenades[allies_model] = "models/weapons/m2frag_grenade.tik"

    thread spawn_grenades
    end

    spawn_grenades:
    for (local.i = 1; local.i <= level.grenades[max_spawns]; local.i++)
    {
    waitthread dm1ammo local.i
    waitframe
    }
    end

    dm1ammo local.num:

    if (local.num > level.spot.size)
    {
    println "*********** removing grenade spawn - not enough spots!"
    end
    }

    while (1)
    {
    local.random = randomint (level.spot.size) + 1

    if (level.spot_used[local.random])
    {
    waitframe // spot already taken - try again \\
    }
    else
    {
    break // free spot found - spawn the grenade \\
    }
    }

    level.spot_used[local.random] = 1

    spawn script_model "targetname" ("steilhandgranate" + local.num)

    local.grenade = $("steilhandgranate" + local.num)
    local.grenade model level.grenades[axis_model]
    local.grenade.origin = level.spot[local.random]
    local.grenade light 0.00 1.50 0.00 50
    local.grenade solid

    spawn trigger_use "targetname" ("ammotrigger" + local.num)

    local.trigger = $("ammotrigger" + local.num)
    local.trigger.origin = local.grenade.origin
    local.trigger setsize ( -20 -20 0 ) ( 20 20 80 )
    local.trigger.grenade = local.grenade
    local.trigger.id = local.num
    local.trigger.spot_index = local.random
    local.trigger setthread gotammo

    //*********************************************************************//

    // wait for the spawn duration //

    for (local.i = 0; local.i <= level.grenades[spawn_duration]; local.i++)
    {
    wait 1

    if (!local.grenade) end // grenade picked up by player, stop here
    }

    // player didn't pick it up, remove and respawn //
    if(local.grenade == NULL)
    {
    local.trigger delete
    }
    else
    {
    local.trigger delete
    local.grenade delete
    }

    level.spot_used[local.random] = 0

    // do you want them to respawn instantly somewhere else if you haven't picked them up? \\
    wait 1
    // if you want them to respawn here after a delay remove above wait and add below: \\
    //wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end

    //*********************************************************************//

    gotammo:

    local.player = parm.other

    if(local.player.ng == 2)
    {

    local.player iprint "You cant get more than 2 nades!"

    }
    else
    {

    local.trigger = self

    local.num = local.trigger.id
    local.spot_index = local.trigger.spot_index
    local.grenade = local.trigger.grenade

    local.grenade delete
    local.trigger delete

    local.player = parm.other
    local.team = local.player.dmteam

    if ( local.team == "allies" )
    {
    local.player give level.grenades[allies_model]
    }
    else
    {
    local.player give level.grenades[axis_model]
    }

    local.player ammo grenade 1
    local.player iprint "You picked up a grenade"

    if(local.player.ng == NIL)
    {
    local.player.ng = 1

    }
    else
    {
    local.player.ng++
    }

    level.spot_used[local.spot_index] = 0

    wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end

    //*********************************************************************//

    check_alive:

    while(1)
    {
    wait 0.02

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

    local.player = $player[local.i]

    if(local.player == NULL)
    end

    if(!isalive local.player)
    {

    local.player.ng = 0
    }

    }

    end


    And put the pk3 on the server.
    ok doublekill i add this scr in my mod in map 1 but ...the server is down and iam sure there is some thing wrong

    the scr and ss

    main:

    thread check_alive

    level.spot[1] = ( 549 -893 17 )
    level.spot[2] = ( -232 -1008 17 )
    level.spot[3] = ( 616 480 49 )
    level.spot[4] = ( 311 1111 49 )
    level.spot[5] = ( -596 335 -15 )

    //*********************************************************************//

    level.grenades[max_spawns] = 10 // max concurrent spawns \\
    level.grenades[spawn_duration] = 30 // how long they stay in seconds \\
    level.grenades[respawn_delay] = 0 // how long till they come back in seconds \\
    level.grenades[axis_model] = "models/weapons/steilhandgranate.tik"
    level.grenades[allies_model] = "models/weapons/m2frag_grenade.tik"

    thread spawn_grenades
    end

    spawn_grenades:
    for (local.i = 1; local.i <= level.grenades[max_spawns]; local.i++)
    {
    waitthread dm1ammo local.i
    waitframe
    }
    end

    dm1ammo local.num:

    if (local.num > level.spot.size)
    {
    println "*********** removing grenade spawn - not enough spots!"
    end
    }

    while (1)
    {
    local.random = randomint (level.spot.size) + 1

    if (level.spot_used[local.random])
    {
    waitframe // spot already taken - try again \\
    }
    else
    {
    break // free spot found - spawn the grenade \\
    }
    }

    level.spot_used[local.random] = 1

    spawn script_model "targetname" ("steilhandgranate" + local.num)

    local.grenade = $("steilhandgranate" + local.num)
    local.grenade model level.grenades[axis_model]
    local.grenade.origin = level.spot[local.random]
    local.grenade light 0.00 1.50 0.00 50
    local.grenade solid

    spawn trigger_use "targetname" ("ammotrigger" + local.num)

    local.trigger = $("ammotrigger" + local.num)
    local.trigger.origin = local.grenade.origin
    local.trigger setsize ( -20 -20 0 ) ( 20 20 80 )
    local.trigger.grenade = local.grenade
    local.trigger.id = local.num
    local.trigger.spot_index = local.random
    local.trigger setthread gotammo

    //*********************************************************************//

    // wait for the spawn duration //

    for (local.i = 0; local.i <= level.grenades[spawn_duration]; local.i++)
    {
    wait 1

    if (!local.grenade) end // grenade picked up by player, stop here
    }

    // player didn't pick it up, remove and respawn //
    local.grenade delete
    local.trigger delete

    level.spot_used[local.random] = 0

    // do you want them to respawn instantly somewhere else if you haven't picked them up? \\
    wait 1
    // if you want them to respawn here after a delay remove above wait and add below: \\
    //wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end

    //*********************************************************************//

    gotammo:

    local.player = parm.other

    if(local.player.dmteam == 2)
    {

    local.player iprint "You cant get more than 2 nades!"

    }
    else
    {

    local.trigger = self

    local.num = local.trigger.id
    local.spot_index = local.trigger.spot_index
    local.grenade = local.trigger.grenade

    local.grenade delete
    local.trigger delete

    local.player = parm.other
    local.team = local.player.dmteam

    if ( local.team == "allies" )
    {
    local.player give level.grenades[allies_model]
    }
    else
    {
    local.player give level.grenades[axis_model]
    }

    local.player ammo grenade 1
    local.player iprint "You picked up a grenade"

    if(local.player.dmteam == NIL)
    {
    local.player.dmteam = 1

    }
    else
    {
    local.player.dmteam++
    }

    level.spot_used[local.spot_index] = 0

    wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end

    //*********************************************************************//

    check_alive:

    while(1)
    {
    wait 0.02

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

    local.player = $player[local.i]

    if(local.player == NULL)
    end

    if(!isalive local.player)
    {

    local.player.dmteam = 0

    }

    }

    end

    viewmodelanim charge
    exec global/grenade_counter.scr
    Attached Thumbnails Attached Thumbnails Untitled.png  
    Last edited by Old Fox; March 25th, 2019 at 10:46 PM.

  3. #33
    Administrator James's Avatar
    Join Date
    May 2010
    Location
    on the intraweb
    Posts
    3,180

    Default

    I don't think you need to exec from dmprecache if you're doing it in the map. The map scr gets loaded when the map loads. It should auto execute!!?? Is the name of your map "Ammo1"??

    Also, in the pk3 DoubleKill posted, he's executing it from the Mikestorso.


    state CHARGE_ATTACK_GRENADE
    {
    movetype legs


    entrycommands
    {
    viewmodelanim charge
    exec global/grenade_counter.scr
    }

    action
    {
    steilhandgranate_crouch_charge : IS_WEAPON_ACTIVE "mainhand" "Stielhandgranate" POSITION_TYPE "crouching"
    steilhandgranate_stand_charge : IS_WEAPON_ACTIVE "mainhand" "Stielhandgranate"

    grenade_crouch_charge : POSITION_TYPE "crouching"
    grenade_stand_charge : default
    }


    states
    {
    // RELEASE_ATTACK_GRENADE : PAIN // This would make the player
    // drop a grenade when he gets hit
    // RELEASE_ATTACK_GRENADE : KILLED
    RELEASE_KILLED_FRAG : KILLED
    RELEASE_ATTACK_GRENADE : !ATTACK_PRIMARY MIN_CHARGE_TIME_MET "mainhand"
    }
    }

  4. #34
    Developer RyBack's Avatar
    Join Date
    Apr 2014
    Location
    In Front of the screen
    Posts
    1,603

    Default

    Is it just me or not a lot of modding issues recently get solved on this forum ?
    Is it that not a lot of pro modders are active ?

  5. #35

    Default

    Quote Originally Posted by James View Post
    I don't think you need to exec from dmprecache if you're doing it in the map. The map scr gets loaded when the map loads. It should auto execute!!?? Is the name of your map "Ammo1"??

    Also, in the pk3 DoubleKill posted, he's executing it from the Mikestorso.


    state CHARGE_ATTACK_GRENADE
    {
    movetype legs


    entrycommands
    {
    viewmodelanim charge
    exec global/grenade_counter.scr
    }

    action
    {
    steilhandgranate_crouch_charge : IS_WEAPON_ACTIVE "mainhand" "Stielhandgranate" POSITION_TYPE "crouching"
    steilhandgranate_stand_charge : IS_WEAPON_ACTIVE "mainhand" "Stielhandgranate"

    grenade_crouch_charge : POSITION_TYPE "crouching"
    grenade_stand_charge : default
    }


    states
    {
    // RELEASE_ATTACK_GRENADE : PAIN // This would make the player
    // drop a grenade when he gets hit
    // RELEASE_ATTACK_GRENADE : KILLED
    RELEASE_KILLED_FRAG : KILLED
    RELEASE_ATTACK_GRENADE : !ATTACK_PRIMARY MIN_CHARGE_TIME_MET "mainhand"
    }
    }
    yes i have it now in mike_torso.scr and remove the line from dmprecach
    Last edited by Old Fox; March 25th, 2019 at 10:46 PM.

  6. #36
    Administrator James's Avatar
    Join Date
    May 2010
    Location
    on the intraweb
    Posts
    3,180

    Default

    Ryback, ironically I always sucked at SCR scripting. My forte was in shaders and tiki files haha. I think the *issue* with scripting, is that if you have several mods, there is a HIGH probability that the mods might conflict. Especially if you use a custom dmprecache, or mikes legs/torso state files.

    That's why I wish there was an easier way to "merge" the files together so it would be dummy proof (not to call anyone a dummy, but you get my point). It's easy to overlook whether you may have a mod that conflicts with another if you are running a server with several customizations.

    @Old Fox - Isn't there a max count or something you can set in the tik to tell the server how many nades you can have? I know you can limit the amount of ammo for guns, I would imagine it should be similar for nades.

  7. #37

    Default

    He wants the script to stop players from picking up the 'fake' nades (which is done with triggers and script commands) depending on how many a player is carrying, so you need to track starting amount, usage, picking up 'real' nades from elsewhere in the map, and of course the 'fake' random nade spawns. Not that I've ever done a multiplayer mod or much multiplayer stuff in general, but from what I understand that is very difficult if not impossible to do. You can track some but that just doesn't seem that viable.

    I may try out an idea tomorrow that would simplify it greatly if it works, but I'm a moron when it comes to some modding so that's a big if.
    Last edited by 1337Smithy; August 21st, 2018 at 04:37 PM.

  8. #38

    Default

    OH hhhhhhhhh yes i need to control the nades and i know its hard but if it be done its will be great
    I have 50 position in every map. ill tell you whats happened to day, i sow a guy pickup about 8 grenades and i know he cant pickup more than 6,then he killed by somebody with the 6 nades so he didnt left anything to the other guys and they must wait about 50 second to can pickup nades again
    i know its funny but not justice

    about my scr by smithy its running good just need to control the nades so every player should to pickup only 2 nades.

  9. #39

    Default

    also ill share my scr again to take a look

    //*********************************************************************//
    //=[[ TOP GUN ]]= Founder //
    //Thanks to Smithy james Doublekill & RyBack //
    //Web www.tg-clan.net //
    //e-mail tg.oldfox@gmail.com //
    //*********************************************************************//
    /////////////////////////////////////////////////////////////////////////

    main:

    level.spot[1] = ( 549 -893 17 )
    //*********************************************************************//

    level.grenades[max_spawns] = 6 // max concurrent spawns \\
    level.grenades[spawn_duration] = 30 // how long they stay in seconds \\
    level.grenades[respawn_delay] = 5 // how long till they come back in seconds \\
    level.grenades[axis_model] = "models/weapons/steilhandgranate.tik"
    level.grenades[allies_model] = "models/weapons/m2frag_grenade.tik"

    thread spawn_grenades
    end

    spawn_grenades:
    for (local.i = 1; local.i <= level.grenades[max_spawns]; local.i++)
    thread dm1ammo local.i
    end

    dm1ammo local.num:

    if (local.num > level.spot.size)
    {
    println "*********** removing grenade spawn - not enough spots!"
    end
    }

    while (1)
    {
    local.random = randomint (level.spot.size) + 1

    if (level.spot_used[local.random])
    {
    waitframe // spot already taken - try again \\
    }
    else
    {
    break // free spot found - spawn the grenade \\
    }
    }

    level.spot_used[local.random] = 1

    spawn script_model "targetname" ("steilhandgranate" + local.num)

    local.grenade = $("steilhandgranate" + local.num)
    local.grenade model level.grenades[axis_model]
    local.grenade.origin = level.spot[local.random]
    local.grenade light 0.00 1.50 0.00 50
    local.grenade solid

    spawn trigger_use "targetname" ("ammotrigger" + local.num)
    local.trigger = $("ammotrigger" + local.num)
    local.trigger.origin = local.grenade.origin
    local.trigger setsize ( -20 -20 0 ) ( 20 20 80 )
    local.trigger.grenade = local.grenade
    local.trigger.id = local.num
    local.trigger.spot_index = local.random
    local.trigger setthread gotammo

    //*********************************************************************//

    // wait for the spawn duration //

    for (local.i = 0; local.i <= level.grenades[spawn_duration]; local.i++)
    {
    wait 1

    if (!local.grenade) end // grenade picked up by player, stop here
    }

    // player didn't pick it up, remove and respawn //
    local.grenade delete
    local.trigger delete

    level.spot_used[local.random] = 0

    // do you want them to respawn instantly somewhere else if you haven't picked them up? \\
    wait 1
    // if you want them to respawn here after a delay remove above wait and add below: \\
    //wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end

    //*********************************************************************//

    gotammo:

    local.trigger = self

    local.num = local.trigger.id
    local.spot_index = local.trigger.spot_index
    local.grenade = local.trigger.grenade

    local.grenade delete
    local.trigger delete

    local.player = parm.other
    local.team = local.player.dmteam

    if ( local.team == "allies" )
    {
    local.player give level.grenades[allies_model]
    }
    else
    {
    local.player give level.grenades[axis_model]
    }

    local.player ammo grenade 1
    local.player iprint "You picked up a grenade"

    level.spot_used[local.spot_index] = 0

    wait level.grenades[respawn_delay]

    thread dm1ammo local.num
    end
    Last edited by Old Fox; March 25th, 2019 at 10:47 PM.

  10. #40

    Default

    This is done differently by using an AmmoEntity object, making it a 'real' nade that is controlled by the game, so people cannot pick up more than they can carry (6). Obviously this isn't a max of 2 (unless you can do what James said as well), but I think it's better than nothing and means people cannot hoard more than they have. I guess it is what you originally wanted. I've made a bigger version for what you want further down...

    You don't need mike_torso stuff, you don't need any .tik stuff, you don't need to spawn triggers anymore (items actually inherit trigger properties so behave the same). This is all you need:


    main:

    ////////////////////////////////////
    level waittill prespawn
    ////////////////////////////////////

    level.grenades[max_spawns] = 6 // max concurrent spawns
    level.grenades[spawn_duration] = 30 // how long they stay in seconds
    level.grenades[respawn_delay] = 5 // how long till they come back in seconds
    level.grenades[axis_model] = "models/weapons/steilhandgranate.tik" // store axis model
    level.grenades[allies_model] = "models/weapons/m2frag_grenade.tik" // store allies model (not currently used)

    level.spot[1] = ( 549 -893 17 )
    level.spot[2] = ( -232 -1008 17 )
    level.spot[3] = ( 616 480 49 )
    level.spot[4] = ( 311 1111 49 )
    level.spot[5] = ( -596 335 -15 )
    level.spot[6] = ( -831 655 169 )
    level.spot[7] = ( -992 454 -15 )
    level.spot[8] = ( -344 911 49 )
    level.spot[9] = ( 1407 2189 513 )
    level.spot[10] = ( 1011 1136 99 )
    level.spot[11] = ( 1031 80 257 )
    level.spot[12] = ( 1536 728 384 )
    level.spot[13] = ( 1200 -624 305 )
    level.spot[14] = ( 295 1439 97 )
    level.spot[15] = ( -1288 1904 106 )
    level.spot[16] = ( -840 2191 385 )
    level.spot[17] = ( -560 783 385 )
    level.spot[18] = ( 620 1632 385 )
    level.spot[19] = ( 240 2451 129 )
    level.spot[20] = ( 911 3152 561 )
    level.spot[21] = ( -82 480 385 )
    level.spot[22] = ( -448 2050 385 )
    level.spot[23] = ( 337 2670 385 )
    level.spot[24] = ( 351 1351 385 )
    level.spot[25] = ( -344 1678 129 )
    level.spot[26] = ( -1316 -35 170 )
    level.spot[27] = ( -760 923 506 )
    level.spot[28] = ( 223 352 50 )
    level.spot[29] = ( -1184 1007 66 )
    level.spot[30] = ( 1592 1840 314 )
    level.spot[31] = ( 800 1870 610 )
    level.spot[32] = ( 127 2978 755 )
    level.spot[33] = ( -296 1448 50 )
    level.spot[34] = ( -448 1213 386 )
    level.spot[35] = ( -264 1121 274 )
    level.spot[36] = ( -32 483 48 )
    level.spot[37] = ( 222 591 100 )
    level.spot[38] = ( 624 1087 384 )
    level.spot[39] = ( 1191 1456 608 )
    level.spot[40] = ( 1359 1264 290 )
    level.spot[41] = ( 943 864 384 )
    level.spot[42] = ( -368 112 66 )
    level.spot[43] = ( -551 1904 162 )
    level.spot[44] = ( 1456 1904 348 )
    level.spot[45] = ( 704 -47 2 )
    level.spot[46] = ( 148 974 48 )
    level.spot[47] = ( 1588 1191 242 )
    level.spot[48] = ( -547 2416 424 )
    level.spot[49] = ( 224 1728 386 )
    level.spot[50] = ( -173 1604 384 )

    ////////////////////////////////////
    level waittill spawn
    ////////////////////////////////////

    thread InitGrenades
    end

    InitGrenades:
    if (level.grenades[max_spawns] > level.spot.size)
    {
    println "*********** removing some grenade spawns - not enough spots!"
    println "*********** number of spots: " level.spot.size
    println "*********** number of attempted spawns: " level.grenades[max_spawns]
    println "*********** reducing spawn size to: " level.spot.size
    level.grenades[max_spawns] = level.spot.size
    }

    for (local.i = 1; local.i <= level.grenades[max_spawns]; local.i++)
    thread NadeHandler
    end


    NadeHandler:

    while (1)
    {
    while (1)
    {
    local.random = randomint (level.spot.size) + 1
    if (level.spot_used[local.random])
    waitframe // spot already taken - try again
    else
    break // free spot found - spawn the grenade
    }

    level.spot_used[local.random] = 1

    // construct the item
    local.grenade = spawn AmmoEntity // spawn object of class 'AmmoEntity'
    local.grenade model level.grenades[axis_model] // set the model
    local.grenade name grenade // set AmmoEntity of type grenade
    local.grenade amount 1 // give only 1 nade
    local.grenade set_respawn 0 // turn off auto respawn
    local.grenade.origin = level.spot[local.random] // set the location
    local.grenade light 0.00 1.50 0.00 50 // spawn light
    local.grenade show // make it visible
    local.grenade solid // make it solid (take caution, players will get stuck if they are standing on the spawn point as it respawns)

    // wait for the spawn duration or for a player to pickup the nade
    for (local.i = 0; local.i <= level.grenades[spawn_duration] && local.grenade; local.i += 0.25)
    wait 0.25

    if (local.grenade) // if there is still a grenade by this point, assume it wasn't picked up by player
    {
    local.grenade delete
    wait 1
    }
    else // no grenade, it was picked up by player
    wait level.grenades[respawn_delay]

    level.spot_used[local.random] = 0
    }
    end


    Let me know if it works or not.

    Edit: OK, I got curious about the fact that the AmmoEntity object inherits trigger properties, and realised it's possible to allow for a limit of 2 or any other number per player spawn and still stop players taking more than they can carry, so here's a bigger version to cater for that:


    main:

    ////////////////////////////////////
    level waittill prespawn
    ////////////////////////////////////

    level.grenades[max_spawns] = 6 // max concurrent spawns
    level.grenades[spawn_duration] = 30 // how long they stay in seconds
    level.grenades[respawn_delay] = 5 // how long till they come back in seconds
    level.grenades[axis_model] = "models/weapons/steilhandgranate.tik" // store axis model
    level.grenades[allies_model] = "models/weapons/m2frag_grenade.tik" // store allies model (not currently used)
    level.grenades[player_capacity] = 2 // how many a player can carry

    level.respawn[max_health_hack] = 0.01 // used for a crafty hack to check player respawns
    level.respawn[max_health] = 100

    level.spot[1] = ( 549 -893 17 )
    level.spot[2] = ( -232 -1008 17 )
    level.spot[3] = ( 616 480 49 )
    level.spot[4] = ( 311 1111 49 )
    level.spot[5] = ( -596 335 -15 )
    level.spot[6] = ( -831 655 169 )
    level.spot[7] = ( -992 454 -15 )
    level.spot[8] = ( -344 911 49 )
    level.spot[9] = ( 1407 2189 513 )
    level.spot[10] = ( 1011 1136 99 )
    level.spot[11] = ( 1031 80 257 )
    level.spot[12] = ( 1536 728 384 )
    level.spot[13] = ( 1200 -624 305 )
    level.spot[14] = ( 295 1439 97 )
    level.spot[15] = ( -1288 1904 106 )
    level.spot[16] = ( -840 2191 385 )
    level.spot[17] = ( -560 783 385 )
    level.spot[18] = ( 620 1632 385 )
    level.spot[19] = ( 240 2451 129 )
    level.spot[20] = ( 911 3152 561 )
    level.spot[21] = ( -82 480 385 )
    level.spot[22] = ( -448 2050 385 )
    level.spot[23] = ( 337 2670 385 )
    level.spot[24] = ( 351 1351 385 )
    level.spot[25] = ( -344 1678 129 )
    level.spot[26] = ( -1316 -35 170 )
    level.spot[27] = ( -760 923 506 )
    level.spot[28] = ( 223 352 50 )
    level.spot[29] = ( -1184 1007 66 )
    level.spot[30] = ( 1592 1840 314 )
    level.spot[31] = ( 800 1870 610 )
    level.spot[32] = ( 127 2978 755 )
    level.spot[33] = ( -296 1448 50 )
    level.spot[34] = ( -448 1213 386 )
    level.spot[35] = ( -264 1121 274 )
    level.spot[36] = ( -32 483 48 )
    level.spot[37] = ( 222 591 100 )
    level.spot[38] = ( 624 1087 384 )
    level.spot[39] = ( 1191 1456 608 )
    level.spot[40] = ( 1359 1264 290 )
    level.spot[41] = ( 943 864 384 )
    level.spot[42] = ( -368 112 66 )
    level.spot[43] = ( -551 1904 162 )
    level.spot[44] = ( 1456 1904 348 )
    level.spot[45] = ( 704 -47 2 )
    level.spot[46] = ( 148 974 48 )
    level.spot[47] = ( 1588 1191 242 )
    level.spot[48] = ( -547 2416 424 )
    level.spot[49] = ( 224 1728 386 )
    level.spot[50] = ( -173 1604 384 )

    ////////////////////////////////////
    level waittill spawn
    ////////////////////////////////////

    thread InitGrenades
    end

    InitGrenades:
    if (level.grenades[max_spawns] > level.spot.size)
    {
    println "*********** removing some grenade spawns - not enough spots!"
    println "*********** number of spots: " level.spot.size
    println "*********** number of attempted spawns: " level.grenades[max_spawns]
    println "*********** reducing spawn size to: " level.spot.size
    level.grenades[max_spawns] = level.spot.size
    }

    for (local.i = 1; local.i <= level.grenades[max_spawns]; local.i++)
    thread NadeHandler
    end


    NadeHandler:

    while (1)
    {
    while (1)
    {
    local.random = randomint (level.spot.size) + 1
    if (level.spot_used[local.random])
    waitframe // spot already taken - try again
    else
    break // free spot found - spawn the grenade
    }

    level.spot_used[local.random] = 1

    // construct the item
    local.grenade = spawn AmmoEntity // spawn object of class AmmoEntity
    local.grenade model level.grenades[axis_model] // set the model
    local.grenade name grenade // set AmmoEntity of type grenade
    local.grenade amount 1 // give only 1 nade
    local.grenade set_respawn 0 // turn off auto respawn
    local.grenade.origin = level.spot[local.random] // set the location
    local.grenade light 0.00 1.50 0.00 50 // spawn light
    local.grenade show // make it visible
    local.grenade solid // make it solid (take caution, players will get stuck if they are standing on the spawn point as it respawns)
    local.grenade nottriggerable // player can't pick it up immediately (this allows us to run our CapacityCheck thread first)
    // construct the trigger
    local.trigger = spawn trigger_use
    local.trigger.grenade = local.grenade
    local.trigger.origin = local.grenade.origin
    local.trigger setsize ( -20 -20 0 ) ( 20 20 80 )
    local.trigger setthread CapacityCheck

    // wait for the spawn duration or for the player to pickup the nade
    for (local.i = 0; local.i <= level.grenades[spawn_duration] && local.grenade; local.i += 0.25)
    wait 0.25

    // wait a frame to make sure we don't delete the grenade before it's finished processing
    // only happens if processing takes longer than expected (which is highly unlikely)
    while (local.trigger.processing)
    waitframe

    local.trigger delete // don't need this trigger anymore

    if (local.grenade) // if there is still a grenade by this point, assume it wasn't picked up by player
    {
    local.grenade delete
    wait 1
    }
    else // no grenade, it was picked up by player
    wait level.grenades[respawn_delay]

    level.spot_used[local.random] = 0
    }
    end

    CapacityCheck:

    // store trigger and stop it from activating further
    local.trigger = self
    local.trigger nottriggerable

    // store player and grenade
    local.player = parm.other
    local.grenade = local.trigger.grenade

    // initialise (or reset) property if they are new or have since died thanks to a cheeky hack ;) (no loops required)
    if (local.player.max_health != (level.respawn[max_health] + level.respawn[max_health_hack]))
    {
    local.player.max_health += level.respawn[max_health_hack]
    local.player heal (level.respawn[max_health_hack] * 0.01)
    local.player.nades = 0
    }

    if (local.player.nades >= level.grenades[player_capacity])
    {
    // player has reached his limit
    local.trigger triggerable // reactivate trigger for next player or life
    if !(local.player.hinted) // tell player the rules only once per session
    {
    local.player iprint ("You can't take more than " + level.grenades[player_capacity] + " of these grenades per life.")
    local.player.hinted = 1
    }
    }
    else
    {
    // try to pick the nade up and increment their nade count if successful
    if (local.grenade)
    {
    local.trigger.processing = 1 // we don't want any other thread interfering

    local.grenade triggerable
    local.player trigger local.grenade // try to pick it up (won't allow more than max nade amount)
    local.grenade nottriggerable
    waitframe // wait a frame to allow for pickup event
    if !(local.grenade) // if nade has gone, player successfully picked it up
    local.player.nades++ // add the nade to his repertoire
    else
    local.trigger triggerable // he couldn't pick it up (he has 6 already)

    local.trigger.processing = 0 // stopped processing
    }
    }
    end


    For example, if you increase capacity to say 10, they can take enough to reach 6 and only take the remainder if they use the nades in their inv. Thanks to the fact the trigger event for items doesn't allow for the hard cap to be exceeded, we don't have to track anything else, so players can pick nades up from wherever or get a start amount and we let the engine do the legwork.

    Expect bugs here and there. Let me know how it goes.

    Edit 2:

    I've added a crafty hack to check for respawns/new players without needing to loop through them all .

    Edit 3:

    Fixed a bug where the trigger wasn't reactivated when it should have been so use the latest version!
    Last edited by 1337Smithy; August 23rd, 2018 at 11:15 AM.

Posting Permissions

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