def load(self, db, worldid):
     super(WeaponHolder, self).load(db, worldid)
     self.__init()
     weapons = db(
         "SELECT weapon_id, number, remaining_ticks FROM weapon_storage WHERE owner_id = ?",
         worldid)
     for weapon_id, number, ticks in weapons:
         # create weapon and add to storage manually
         if self.session.db.get_weapon_stackable(weapon_id):
             weapon = StackableWeapon(self.session, weapon_id)
             weapon.set_number_of_weapons(number)
         else:
             weapon = Weapon(self.session, weapon_id)
         self._weapon_storage.append(weapon)
         # if weapon not ready add scheduled call and remove from fireable
         if ticks:
             weapon.attack_ready = False
             Scheduler().add_new_object(weapon.make_attack_ready, weapon,
                                        ticks)
         else:
             self._fireable.append(weapon)
         weapon.add_weapon_fired_listener(
             Callback(self._remove_from_fireable, weapon))
         weapon.add_attack_ready_listener(
             Callback(self._add_to_fireable, weapon))
         weapon.add_weapon_fired_listener(
             self._increase_fired_weapons_number)
     self.on_storage_modified()
     # load target after all objects have been loaded
     Scheduler().add_new_object(Callback(self.load_target, db),
                                self,
                                run_in=0)
     self.log.debug("%s weapon storage after load: %s", self,
                    self._weapon_storage)
    def add_weapon_to_storage(self, weapon_id):
        """
		adds weapon to storage
		@param weapon_id : id of the weapon to be added
		"""
        self.log.debug("%s add weapon %s", self, weapon_id)
        #if weapon is stackable, try to stack
        weapon = None
        if self.equipped_weapon_number == self.total_number_of_weapons:
            self.log.debug("%s weapon storage full", self)
            return False
        if self.session.db.get_weapon_stackable(weapon_id):
            stackable = [
                w for w in self._weapon_storage if weapon_id == w.weapon_id
            ]
            #try to increase the number of weapons for one stackable weapon
            increased = False
            for weapon in stackable:
                try:
                    weapon.increase_number_of_weapons(1)
                    increased = True
                    break
                except SetStackableWeaponNumberError:
                    continue

            if not increased:
                weapon = StackableWeapon(self.session, weapon_id)
        else:
            weapon = Weapon(self.session, weapon_id)
        if weapon:
            self._weapon_storage.append(weapon)
            weapon.add_weapon_fired_listener(
                Callback(self._remove_from_fireable, weapon))
            weapon.add_attack_ready_listener(
                Callback(self._add_to_fireable, weapon))
            weapon.add_weapon_fired_listener(
                self._increase_fired_weapons_number)
            self._fireable.append(weapon)
            self.equipped_weapon_number += 1
        self.on_storage_modified()  # will update the range
        return True