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
	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
	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 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)