Author Topic: addItem in a schedule  (Read 4197 times)

Have you tried turning it off and on again?

Maybe instead of doing the schedules on global variables do them on the clients themselves? Like
%client.BombDelaySchedule = schedule(blah,#,etc.);
I used globals so I could cancel the schedules, because I was getting double messages, meaning onSpawn was getting called twice due to whatever add-on combination causes that.  I wonder if they are causing this.

You can still cancel it that way, just cancel(%client.schedule); instead of cancel($schedule);
Otherwise they'll just be overwritten when someone else spawns

You can still cancel it that way, just cancel(%client.schedule); instead of cancel($schedule);
Otherwise they'll just be overwritten when someone else spawns
Thanks.  However, now the schedules all occur three times each despite the cancels.  Puzzling.

Code: [Select]
function GameConnection::CanBuyCreepBombs(%client)
{
%client.CanBuyCreepBombs = 1;

if(!isObject(%client.player))
return;

MessageClient(%client,'',"You may now purchase basic creep bombs with /buy creepbomb.");
}

    function GameConnection::spawnPlayer(%client)
{
        Parent::spawnPlayer(%client);
        %client.updateSuperCreeperScore();
        %player = %client.player;

        if(!isObject(%client.player))
return; // slayer removes late joining players and this can cause errors here
        
//buy bomb delay
%client.BoughtBombs = 0;
%client.CanBuyCreepBombs = 0;

if($Creep::BuyBombDelay)
{
cancel(%BuyBombSchedule);
%BuyBombSchedule = %client.schedule( $Creep::BuyBombDelay * 60000 , CanBuyCreepBombs );
}

        // CREEPER VARIABLES //
        %client.kills = 0;
        %player.nochase = 0;
        
        // START ITEMS //
        // Anti-Creeper Loadout:
        if($Creep::GameMode == 0 || $Creep::GameMode == 3 || $Creep::GameMode == 5)
{
            // are we using a map with shop functionality?
            if(!$Creep::DisableUpgrades)
{
                switch(UpgradeMan.getValue(%client.bl_id, "CreepKillLvl"))
{
                    case 1:
                        %player.addItem(nameToID(CreepKillWeakGunItem),%client);
                    case 2:
                        %player.addItem(nameToID(CreepKillGunItem),%client);
                    case 3:
                        %player.addItem(nameToID(CreepKillStrongGunItem),%client);
                    case 4:
                        %player.addItem(nameToID(CreepKillVStrongGunItem),%client);
                }
                
                if(UpgradeMan.getValue(%client.bl_id, "CreepBombLvl") > 0)
{
if(!isObject(%client.player))
return;
if($Creep::DisableBombs)
return;

                    if(UpgradeMan.getValue(%client.bl_id, "CreepBombLvl") == 1)
{
cancel(%BombDelayScheduleNotify);
cancel(%BombDelaySchedule);
%BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBombItem );
%BombDelayScheduleNotify = schedule( $Creep::DefaultBombDelay * 60000 , 0 , messageClient,%client,'MsgItemPickup',"Your upgraded creep-bomb is now available.");
}
                    else
{
cancel(%BombDelayScheduleNotify);
cancel(%BombDelaySchedule);
%BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBomb2Item );
%BombDelayScheduleNotify = schedule( $Creep::DefaultBombDelay * 60000 , 0 , messageClient,%client,'MsgItemPickup',"Your upgraded creep-bomb is now available.");
}                  
                }
            }
else// if not just give everyone the bog standard
                %player.addItem(nameToID(CreepKillGunItem),%client);  
        }
        
        // LIVES //
        
        // can players respawn in the current gamemode?
        if($Creep::GameMode != 3 && $Creep::GameMode != 4 && $Creep::GameMode != 5) {
            %client.setLives(1); // if so, one life
        }
        
        // LOCATION //
        // players spawn on bricks named "spawn"
        %pos = getRandomPosOnBrick(getRandomSpawnBrick());
        %player.settransform(%pos);
        %player.setvelocity("0 0 0");
        return;
    }

You need to put it as a client or player variable (%client.scheduleVar), not just %schedulevar, otherwise once it goes out of scope you'll lose it and not have anything to cancel

You need to put it as a client or player variable (%client.scheduleVar), not just %schedulevar, otherwise once it goes out of scope you'll lose it and not have anything to cancel

I changed the rest of the schedules like that but the cancels still don't seem to work.  Did I do them wrong?
Code: [Select]
function GameConnection::CanBuyCreepBombs(%client)
{
%client.CanBuyCreepBombs = 1;

if(!isObject(%client.player))
return;

MessageClient(%client,'',"You may now purchase basic creep bombs with /buy creepbomb.");
}

    function GameConnection::spawnPlayer(%client)
{
        Parent::spawnPlayer(%client);
        %client.updateSuperCreeperScore();
        %player = %client.player;

        if(!isObject(%client.player))
return; // slayer removes late joining players and this can cause errors here
       
//buy bomb delay
%client.BoughtBombs = 0;
%client.CanBuyCreepBombs = 0;

if($Creep::BuyBombDelay)
{
cancel(%BuyBombSchedule);
%BuyBombSchedule = %client.schedule( $Creep::BuyBombDelay * 60000 , CanBuyCreepBombs );
}

        // CREEPER VARIABLES //
        %client.kills = 0;
        %player.nochase = 0;
       
        // START ITEMS //
        // Anti-Creeper Loadout:
        if($Creep::GameMode == 0 || $Creep::GameMode == 3 || $Creep::GameMode == 5)
{
            // are we using a map with shop functionality?
            if(!$Creep::DisableUpgrades)
{
                switch(UpgradeMan.getValue(%client.bl_id, "CreepKillLvl"))
{
                    case 1:
                        %player.addItem(nameToID(CreepKillWeakGunItem),%client);
                    case 2:
                        %player.addItem(nameToID(CreepKillGunItem),%client);
                    case 3:
                        %player.addItem(nameToID(CreepKillStrongGunItem),%client);
                    case 4:
                        %player.addItem(nameToID(CreepKillVStrongGunItem),%client);
                }
               
                if(UpgradeMan.getValue(%client.bl_id, "CreepBombLvl") > 0)
{
if(!isObject(%client.player))
return;
if($Creep::DisableBombs)
return;

                    if(UpgradeMan.getValue(%client.bl_id, "CreepBombLvl") == 1)
{
cancel(%BombDelayScheduleNotify);
cancel(%BombDelaySchedule);
%BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBombItem );
%BombDelayScheduleNotify = %client.schedule( $Creep::DefaultBombDelay * 60000 , messageClient, %client , 'MsgItemPickup' , "Your upgraded creep-bomb is now available.");
}
                    else
{
cancel(%BombDelayScheduleNotify);
cancel(%BombDelaySchedule);
%BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBomb2Item );
%BombDelayScheduleNotify = %client.schedule( $Creep::DefaultBombDelay * 60000 , messageClient, %client , 'MsgItemPickup' , "Your upgraded creep-bomb is now available.");
}                 
                }
            }
else// if not just give everyone the bog standard
                %player.addItem(nameToID(CreepKillGunItem),%client);   
        }
       
        // LIVES //
       
        // can players respawn in the current gamemode?
        if($Creep::GameMode != 3 && $Creep::GameMode != 4 && $Creep::GameMode != 5) {
            %client.setLives(1); // if so, one life
        }
       
        // LOCATION //
        // players spawn on bricks named "spawn"
        %pos = getRandomPosOnBrick(getRandomSpawnBrick());
        %player.settransform(%pos);
        %player.setvelocity("0 0 0");
        return;
    }

I changed the rest of the schedules like that but the cancels still don't seem to work.  Did I do them wrong?
Code: [Select]
-snip-
You need to put it as a client or player variable (%client.scheduleVar), not just %schedulevar, otherwise once it goes out of scope you'll lose it and not have anything to cancel
So instead of
Code: [Select]
                   if(UpgradeMan.getValue(%client.bl_id, "CreepBombLvl") == 1)
{
cancel(%BombDelayScheduleNotify);
cancel(%BombDelaySchedule);
%BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBombItem );
%BombDelayScheduleNotify = %client.schedule( $Creep::DefaultBombDelay * 60000 , messageClient, %client , 'MsgItemPickup' , "Your upgraded creep-bomb is now available.");
}
                    else
{
cancel(%BombDelayScheduleNotify);
cancel(%BombDelaySchedule);
%BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBomb2Item );
%BombDelayScheduleNotify = %client.schedule( $Creep::DefaultBombDelay * 60000 , messageClient, %client , 'MsgItemPickup' , "Your upgraded creep-bomb is now available.");
}
It'd be more like:
Code: [Select]
                   if(UpgradeMan.getValue(%client.bl_id, "CreepBombLvl") == 1)
{
cancel(%client.BombDelayScheduleNotify);
cancel(%player.BombDelaySchedule);
%player.BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBombItem );
%client.BombDelayScheduleNotify = %client.schedule( $Creep::DefaultBombDelay * 60000 , messageClient, %client , 'MsgItemPickup' , "Your upgraded creep-bomb is now available.");
}
                    else
{
cancel(%player.BombDelayScheduleNotify);
cancel(%%client.BombDelaySchedule);
%player.BombDelaySchedule = %player.schedule( $Creep::DefaultBombDelay * 60000 , addNewItem , CreepBomb2Item );
%client.BombDelayScheduleNotify = %client.schedule( $Creep::DefaultBombDelay * 60000 , messageClient, %client , 'MsgItemPickup' , "Your upgraded creep-bomb is now available.");
}

Thanks everyone, I tried out what headcrab and jes showed me for that last bit and it functions properly now.