예제 #1
0
 def addGunEffectPower(self, gunId, power, gunX):
     """
     使用狂暴弹增加威力
     """
     if gunId not in self.useGunEffect:
         return power, False
     data = self.useGunEffect[gunId]
     if data["state"] != State.USING:
         return power, False
     if float('%.2f' % time.time(
     )) - data["start_time"] + data["progress"][0] >= data["progress"][1]:
         return power, False
     if gunId not in self.gunEffectData:
         return power, False
     data = self.gunEffectData[gunId]
     if not data:
         return power, False
     conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
     if data[0] >= int(power * gunX * conf["power_rate"] / 100.0):
         val = int(power * gunX * (conf["power_rate"] / 100.0 - 1))
         self.updateFireOrEnergy(self, gunId, 0, val, add=False)  # 消耗能量
         newPower = power * conf["power_rate"] / 100.0  # 最大威力
     else:
         self.updateFireOrEnergy(self, gunId, 0, absValue=1)
         newPower = power * (float(data[0]) /
                             (power * gunX * conf["power_rate"] / 100.0) +
                             1)
     if ftlog.is_debug():
         ftlog.debug("addGunEffectPower", newPower)
     return newPower, True
예제 #2
0
def changeGunSkin(userId, gunId, skinId, mode):
    """
    切换火炮皮肤
    """
    if ftlog.is_debug():
        ftlog.debug("changeGunSkin, userId =", userId, "gunId =", gunId,
                    "skinId =", skinId, "mode =", mode)
    mo = MsgPack()
    mo.setCmd("gun_change_skin")
    mo.setResult("gameId", FISH_GAMEID)
    mo.setResult("userId", userId)
    mo.setResult("gunId", gunId)
    mo.setResult("skinId", skinId)
    mo.setResult("gameMode", mode)
    clientId = util.getClientId(userId)
    skins = config.getGunConf(gunId, clientId, mode=mode).get("skins")
    ownGunSkinSkinsKey = GameData.ownGunSkinSkins
    ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID,
                                               ownGunSkinSkinsKey, [])
    if skinId not in ownGunSkinSkins and skinId != skins[0]:
        mo.setResult("code", 1)  # 未获得
        router.sendToUser(mo, userId)
        return False
    if skinId not in skins:
        mo.setResult("code", 2)  # 皮肤不在该火炮下属的皮肤列表中
        router.sendToUser(mo, userId)
        return False
    equipGunSkin(userId, gunId, skinId, mode)
    mo.setResult("code", 0)
    router.sendToUser(mo, userId)
    return True
예제 #3
0
 def updateFireOrEnergy(self, gunId, idx=0, val=0, absValue=0, add=True):
     """
     更新开火次数
     :param gunId: 皮肤炮
     :param idx: 更新位置
     :param val: 更新的值
     :param abs_value: 赋值 0不赋值 1赋值
     :param add: 增加|减少
     """
     if gunId not in self.gunEffectData:
         listVal = self._getData(gunId)
     else:
         listVal = self.gunEffectData[gunId]
     if not listVal and ftlog.is_debug():
         ftlog.debug("updateFireOrEnergy", gunId, idx, val, absValue, add)
         return 0
     conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
     if add:
         listVal[idx] += val
     else:
         listVal[idx] -= val
     if idx == 1:
         listVal[idx] = min(listVal[idx], conf["fire_count"])
     if absValue:
         listVal[idx] = val
     if ftlog.is_debug():
         ftlog.debug("updateFireOrEnergy", gunId, idx, val, absValue,
                     listVal)
     self.gunEffectData[gunId] = listVal
     return listVal[idx]
예제 #4
0
def getAllGuns(userId, mode):
    """
    获得所有皮肤炮数据
    """
    clientId = util.getClientId(userId)
    assert isinstance(userId, int) and userId > 0
    _key = _buildUserGunKey(userId, mode)
    value = daobase.executeUserCmd(userId, "HGETALL", _key)
    if value:
        gunInfos = {}
        savaData = []
        for index in xrange(0, len(value), 2):
            gunId = value[index]
            if gunId in config.getAllGunIds(clientId, mode):
                gunData = strutil.loads(value[index + 1], False, True)
                if len(gunData) <= 2:
                    gunConfig = config.getGunConf(gunId, clientId,
                                                  gunData[INDEX_LEVEL], mode)
                    gunData.append(gunConfig["skins"][0])
                    savaData.append(gunId)
                    savaData.append(strutil.dumps(gunData))
                gunInfos[gunId] = gunData

        if savaData:
            daobase.executeUserCmd(userId, "HMSET", _key, *savaData)
        return gunInfos
    return {}
예제 #5
0
 def firstFireEffect(self, gunId):
     """开火第一颗子弹触发狂暴效果"""
     if gunId in self.useGunEffect and self.useGunEffect[gunId][
             "state"] == State.PREPARE:
         conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
         self.useGunEffect[gunId] = {
             "state": State.USING,
             "start_time": float('%.2f' % time.time()),
             "progress": [0, conf["duration"]]
         }
         self.updateFireOrEnergy(gunId, idx=1, absValue=1)
         self._setData(gunId)
         data = self.gunEffectData[gunId]
         self.setUseEffectTimer(conf["duration"])  # 启动结束的定时器
         if data:
             dataTmp = deepcopy(data)
             dataTmp.pop(0)
             dataTmp.append(conf["fire_count"])
             data = dataTmp
         msg = MsgPack()
         msg.setCmd("use_gun_effect")
         msg.setResult("userId", self.userId)
         msg.setResult("gunId", gunId)
         msg.setResult("code", 0)
         msg.setResult("progressData", data)
         msg.setResult("data", self.useGunEffect[gunId])
         GameMsg.sendMsg(msg, self.table.getBroadcastUids())
         return
예제 #6
0
def updateGun(userId, gunId, mode):
    """
    更新新增炮数据
    """
    clientId = util.getClientId(userId)
    assert int(gunId) in config.getAllGunIds(clientId, mode)
    gunConf = config.getGunConf(gunId, clientId, mode=mode)
    gunInfo = [1, 0, gunConf["skins"][0]]  # 皮肤炮熟练等级 | 经验 | 默认皮肤
    daobase.executeUserCmd(userId, "HSETNX", _buildUserGunKey(userId, mode),
                           str(gunId), json.dumps(gunInfo))
예제 #7
0
 def addGunEffectEnergy(self, gunId, coin):
     """
     添加能量
     """
     if gunId in self.useGunEffect and self.useGunEffect[gunId][
             "state"] in [State.PREPARE, State.USING, State.PAUSE]:
         return
     conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
     add_energy = coin * conf["percent"] / 100
     self.updateFireOrEnergy(gunId, 0, add_energy)
     return coin - add_energy
예제 #8
0
def isUnlock(userId, gunId, gunConf, mode):
    """
    皮肤炮是否已解锁
    """
    # 先判断当前模式是否解锁
    _isUnlocked = _isUnlockGun(userId, gunConf, mode)
    # 如果当前模式未达到解锁条件则检测另一个模式是否已达到解锁条件.(经典/千炮)
    if not _isUnlocked:
        clientId = util.getClientId(userId)
        _mode = MULTIPLE_MODE if mode == CLASSIC_MODE else CLASSIC_MODE
        _gunConf = config.getGunConf(gunId, clientId, mode=_mode)
        _isUnlocked = _isUnlockGun(userId, _gunConf, _mode)
    return _isUnlocked
예제 #9
0
 def _getData(self, gunId):
     """
     获取狂暴皮肤炮的效果
     """
     conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
     if "fire_count" not in conf:
         return []
     if conf["fire_count"] > 0 and gunId not in self.gunEffectData:
         val = daobase.executeUserCmd(self.userId, "HGET", self.rdKey,
                                      gunId)
         val = json.loads(val) if val else deepcopy(self.defaultVal)
         self.gunEffectData[gunId] = val
         self._setData(gunId)
     return self.gunEffectData.get(gunId, [])
예제 #10
0
def initGun(userId):
    """
    初始化炮数据
    """
    clientId = util.getClientId(userId)
    for mode in config.GAME_MODES:
        for gunId in config.getAllGunIds(clientId, mode):
            updateGun(userId, gunId, mode)
            gunData = getGunData(userId, gunId, mode)
            skinId = gunData[INDEX_SKINID]
            skins = config.getGunConf(gunId, clientId,
                                      mode=mode).get("skins")  # 配置炮的皮肤
            if skinId not in skins:
                gunData[INDEX_SKINID] = skins[0]
                setGunData(userId, gunId, gunData, mode)
예제 #11
0
def setGunData(userId, gunId, gunInfo, mode):
    """
    存储单个炮数据
    """
    clientId = util.getClientId(userId)
    assert int(gunId) in config.getAllGunIds(clientId, mode)
    assert isinstance(gunInfo, list) and len(gunInfo) == 3
    skins = config.getGunConf(gunId, clientId, mode=mode).get("skins")
    if gunInfo[INDEX_SKINID] not in skins:
        ftlog.error("setGunData, not find skin, userId =", userId, "gunId =",
                    gunId, "gunInfo =", gunInfo, "skins =", skins, "mode =",
                    mode, "clientId =", clientId)
        gunInfo[INDEX_SKINID] = skins[0]
    daobase.executeUserCmd(userId, "HSET", _buildUserGunKey(userId, mode),
                           str(gunId), json.dumps(gunInfo))
예제 #12
0
 def addGunEffectFire(self, gunId, count):
     """
     增加开火次数
     :param gunId: 武器ID
     :param count: 次数
     """
     if gunId in self.useGunEffect and self.useGunEffect[gunId][
             "state"] in [State.USING, State.PAUSE]:
         return
     count = self.updateFireOrEnergy(gunId, 1, count)
     conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
     if count >= conf["fire_count"]:  # 达到了临界值把内存的数据保存到数据库
         self.sendProgress(gunId)
         self._setData(gunId)
     return count
예제 #13
0
def getGunData(userId, gunId, mode):
    """
    获得单个皮肤炮数据
    """
    clientId = util.getClientId(userId)
    assert int(gunId) in config.getAllGunIds(clientId, mode)
    gunConf = config.getGunConf(gunId, clientId, mode=mode)
    value = daobase.executeUserCmd(userId, "HGET",
                                   _buildUserGunKey(userId, mode), str(gunId))
    if value:
        value = strutil.loads(value, False, True)
        if len(value) <= 2:
            value.append(gunConf["skins"][0])  # 默认皮肤
        return value
    # 获取初始化的值
    return [1, 0, gunConf["skins"][0]]
예제 #14
0
 def getGunNonCurveOdds(self, gunConf):
     """
     火炮-非曲线概率系数
     """
     gunConf = gunConf or {}
     gunId = gunConf.get("gunId", 0)
     gunLevel = gunConf.get("gunLevel", 1)
     aloofOdds = config.getGunConf(gunId, self.player.clientId, gunLevel,
                                   self.table.gameMode).get(
                                       "aloofOdds", [])
     probb = 0
     randomNum = random.randint(1, 10000)
     for oddsMap in aloofOdds:
         probb += oddsMap["probb"] * 10000
         if randomNum <= probb:
             return oddsMap["odds"]
예제 #15
0
def composeGunSkin(userId, gunId, skinId, mode):
    """
    合成火炮皮肤
    """
    clientId = util.getClientId(userId)
    if ftlog.is_debug():
        ftlog.debug("composeGunSkin, userId =", userId, "gunId =", gunId,
                    "skinId =", skinId, "clientId =", clientId, "mode =", mode)
    skinConf = config.getGunSkinConf(skinId, clientId, mode)
    mo = MsgPack()
    mo.setCmd("gun_compose_skin")
    mo.setResult("gameId", FISH_GAMEID)
    mo.setResult("userId", userId)
    mo.setResult("gunId", gunId)
    mo.setResult("skinId", skinId)
    mo.setResult("gameMode", mode)
    skins = config.getGunConf(gunId, clientId, mode=mode).get("skins")
    if skinId not in skins:
        mo.setResult("code", 99)  # 数据不对
        router.sendToUser(mo, userId)
        return False
    if not skinConf:
        mo.setResult("code", 99)  # 数据不对
        router.sendToUser(mo, userId)
        return False
    surplusCount = util.balanceItem(userId, skinConf["kindId"])
    ownGunSkinSkinsKey = GameData.ownGunSkinSkins
    ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID,
                                               ownGunSkinSkinsKey, [])
    if surplusCount < skinConf["consumeCount"]:
        mo.setResult("code", 1)  # 资源不足
        return False
    elif skinId in ownGunSkinSkins:
        mo.setResult("code", 2)  # 已经合成
        return False
    else:
        # 合成消耗皮肤碎片
        _consume = [{
            "name": skinConf["kindId"],
            "count": abs(skinConf["consumeCount"])
        }]
        util.consumeItems(userId, _consume, "ITEM_USE", int(gunId), mode)
        addEquipGunSkinSkin(userId, skinId, clientId, False)
        mo.setResult("code", 0)
        router.sendToUser(mo, userId)
    return True
예제 #16
0
def getGunIds(userId, mode):
    """
    玩家当前拥有的火炮ID
    """
    clientId = util.getClientId(userId)
    gunIds = [0]
    userBag = hallitem.itemSystem.loadUserAssets(userId).getUserBag()
    ownGunSkinSkinsKey = GameData.ownGunSkinSkins
    ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID,
                                               ownGunSkinSkinsKey, [])
    for kindId in config.getAllGunIds(clientId, mode):
        item = userBag.getItemByKindId(kindId)
        gunConf = config.getGunConf(kindId, clientId, mode=mode)
        if gunConf["skins"][0] in ownGunSkinSkins:  # 是否拥有皮肤炮默认永久皮肤
            gunIds.append(kindId)
        elif item and not item.isDied(int(time.time())):  # 皮肤炮是否过期   没过期
            gunIds.append(kindId)
    return gunIds
예제 #17
0
 def gunChange(self, gLv):
     """
     切换火炮等级
     """
     reason = 0
     if gLv > self.gunLevel or not config.getGunLevelConf(
             gLv, self.table.gameMode):
         reason = 1
     else:
         if gLv < self.table.runConfig.minGunLevel:
             return
         elif gLv > self.tableMaxGunLevel():
             return
         elif self.getUsingSkillInfo():
             # 技能处于使用中时,升级炮台,炮台等级需等技能状态结束后才会切换更新
             self.nowGunLevel = gLv
             return
     gunMultiple = config.getGunConf(self.gunId, self.clientId, self.gunLv,
                                     self.table.gameMode).get(
                                         "multiple", 1)
     retMsg = MsgPack()
     retMsg.setCmd("gchg")
     retMsg.setResult("gameId", config.FISH_GAMEID)
     retMsg.setResult("gLv", gLv)
     retMsg.setResult("userId", self.userId)
     retMsg.setResult("seatId", self.seatId)
     retMsg.setResult("gunMultiple", gunMultiple)
     retMsg.setResult("gameMode", self.table.gameMode)
     retMsg.setResult("reason", reason)
     retMsg.setResult("tableMaxGunLevel", self.tableMaxGunLevel())
     GameMsg.sendMsg(retMsg, self.userId)
     if reason == 0:
         self.nowGunLevel = gLv
         result = retMsg.getKey("result")
         del result["reason"]
         GameMsg.sendMsg(retMsg, self.table.getBroadcastUids(self.userId))
         from newfish.game import TGFish
         event = ChangeGunLevelEvent(self.userId, config.FISH_GAMEID,
                                     self.table.bigRoomId, self.nowGunLevel)
         TGFish.getEventBus().publishEvent(event)
         self.syncSkillSlots()
예제 #18
0
    def useEffect(self, gunId=None):
        """
        使用狂暴
        """
        code = 0
        gunId = self.player.gunId if gunId is None else gunId
        if gunId not in self.gunEffectData:
            data = self._getData(gunId)
        else:
            data = self.gunEffectData[gunId]
        if not data:
            code = 1  # 此炮不存在狂暴效果
        conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
        if data and data[1] < conf["fire_count"]:  # 开火次数没有达到要求
            code = 2
        if self.useGunEffect[gunId]["state"] != State.CAN_USE:
            code = 3
        if len(self.player.usingSkill) > 0:  # 使用技能期间, 不能使用狂暴
            code = 4
        if code == 0:
            self.useGunEffect[gunId] = {
                "state": State.PREPARE,  # 准备
                "start_time": 0,  # float('%.2f' % time.time())
                "progress": [0, conf["duration"]]
            }
        if data:
            dataTmp = deepcopy(data)
            dataTmp.pop(0)
            dataTmp.append(conf["fire_count"])
            data = dataTmp

        msg = MsgPack()
        msg.setCmd("use_gun_effect")
        msg.setResult("userId", self.userId)
        msg.setResult("gunId", gunId)
        msg.setResult("code", code)
        msg.setResult("progressData", data)
        msg.setResult("data", self.useGunEffect[gunId])
        GameMsg.sendMsg(msg, self.table.getBroadcastUids())
예제 #19
0
 def sendProgress(self, gunId=None, isSend=1):
     """
     发送是否开启狂暴技能效果|使用狂暴的数据
     """
     gunId = self.player.gunId if gunId is None else gunId
     if gunId not in self.gunEffectData:
         data = self._getData(gunId)
     else:
         data = self.gunEffectData[gunId]
     if not data:
         return
     conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
     temp_data = deepcopy(data)
     temp_data.pop(0)
     temp_data.append(conf["fire_count"])
     msg = MsgPack()
     msg.setCmd("gun_effect_process")
     msg.setResult("userId", self.userId)
     msg.setResult("gunId", gunId)
     msg.setResult("progressData", temp_data)
     GameMsg.sendMsg(msg, [self.player.userId])
     if data[1] >= conf["fire_count"] and isSend:
         self.sendUseEffectState(gunId)
예제 #20
0
def isCanEquip(userId, gunId, mode):
    """
    皮肤炮是否可以装配(条件同解锁,但是只检测当前模式是否可以装备)
    """
    clientId = util.getClientId(userId)
    gunConf = config.getGunConf(gunId, clientId, 1, mode)
    _isCanEquip = False
    if gunConf:
        from newfish.entity.honor import honor_system
        vipLevel = hallvip.userVipSystem.getVipInfo(userId).get("level", 0)
        gunLevelVal = util.getGunLevelVal(userId, mode)
        if gunId == 0:
            _isCanEquip = True
        elif gunConf["equipType"] == 0:
            _isCanEquip = True
        elif gunConf["equipType"] == 1 and vipLevel >= gunConf["equipValue"]:
            _isCanEquip = True
        elif gunConf["equipType"] == 2 and gunConf[
                "equipValue"] in honor_system.getOwnedHonors(userId):
            _isCanEquip = True
        elif gunConf["equipType"] == 3 and gunLevelVal >= gunConf["equipValue"]:
            _isCanEquip = True
    return _isCanEquip
예제 #21
0
 def sendUseEffectState(self, gunId=None):
     """
     发送是否开启狂暴技能效果|使用狂暴的数据
     """
     gunId = self.player.gunId if gunId is None else gunId
     if gunId not in self.gunEffectData:
         data_list = self._getData(gunId)
     else:
         data_list = self.gunEffectData[gunId]
     msg = MsgPack()
     msg.setCmd("gun_use_effect_state")
     msg.setResult("userId", self.userId)
     msg.setResult("gunId", gunId)
     if not data_list:
         msg.setResult("data", {
             "state": State.NOT_EFFECT,
             "start_time": 0,
             "progress": [0, 0]
         })
         GameMsg.sendMsg(msg, self.table.getBroadcastUids())
         return
     conf = config.getGunConf(gunId, self.clientId, 1, self.mode)
     if conf["fire_count"] <= 0:
         return
     if gunId not in self.useGunEffect:
         if data_list[1] >= conf["fire_count"]:
             self.useGunEffect[gunId] = {
                 "state": State.CAN_USE,
                 "start_time": 0,
                 "progress": [0, conf["duration"]]
             }
         else:
             self.useGunEffect[gunId] = {
                 "state": State.NOT_USE,
                 "start_time": 0,
                 "progress": [0, conf["duration"]]
             }
     else:
         data = self.useGunEffect[gunId]
         if data["state"] == State.NOT_USE and data_list[1] >= conf[
                 "fire_count"]:
             data["state"] = State.CAN_USE
         if data["state"] == State.USING or data["state"] == State.PAUSE:
             if float('%.2f' % time.time()) - data["start_time"] + data[
                     "progress"][0] < data["progress"][1]:
                 data["progress"][0] += float(
                     '%.2f' % time.time()) - data["start_time"]
                 data["progress"][0] = min(data["progress"][0],
                                           data["progress"][1])
                 data["start_time"] = float('%.2f' % time.time())
             else:
                 data["state"] = State.END
         if data["state"] == State.END:
             self.useGunEffect[gunId].update({
                 "state":
                 State.END,
                 "start_time":
                 0,
                 "progress": [conf["duration"], conf["duration"]]
             })
     msg.setResult("data", self.useGunEffect[gunId])
     GameMsg.sendMsg(msg, self.table.getBroadcastUids())
     if self.useGunEffect[gunId]["state"] == State.END:
         self.clearUeTimer()
         del self.useGunEffect[gunId]
예제 #22
0
def sendGunListMsg(userId, mode):
    """
    发送火炮列表消息
    """
    clientId = util.getClientId(userId)
    guns = []
    installedGunId = refreshGunId(userId, mode)  # 当前已装备的皮肤炮过期时,默认装备已拥有的最后一个皮肤炮
    userBag = hallitem.itemSystem.loadUserAssets(userId).getUserBag()
    allGuns = getAllGuns(userId, mode)  # 获得所有皮肤炮数据
    lang = util.getLanguage(userId)
    ownGunSkinSkinsKey = GameData.ownGunSkinSkins
    ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID,
                                               ownGunSkinSkinsKey,
                                               [])  # 已拥有的皮肤炮皮肤
    for gunId in config.getAllGunIds(clientId, mode):
        if gunId not in allGuns:
            continue
        gun = {}
        gunLv = allGuns[gunId][INDEX_LEVEL]
        gunExp = allGuns[gunId][INDEX_EXP]
        skinId = allGuns[gunId][INDEX_SKINID]
        gunConf = config.getGunConf(gunId, clientId, gunLv, mode)
        gun["gunId"] = gunId
        gun["name"] = config.getMultiLangTextConf(gunConf["name"], lang=lang)
        gun["unlockDesc"] = gunConf["unlockDesc"]  # 解锁描述
        if gunConf["unlockDesc"]:
            gun["unlockDesc"] = config.getMultiLangTextConf(
                gunConf["unlockDesc"], lang=lang) % gunConf.get(
                    "unlockValue", 0)
        gun["equipDesc"] = gunConf.get("equipDesc")  # 装备描述
        if gunConf["equipDesc"]:
            gun["equipDesc"] = config.getMultiLangTextConf(
                gunConf["equipDesc"], lang=lang) % gunConf.get(
                    "equipValue", 0)
        gun["level"] = gunLv
        gun["exp"] = gunExp - (gunConf["totalExp"] - gunConf["exp"]
                               )  # 炮经验-上一级的经验
        gun["totalExp"] = gunConf["exp"]  # 本级所需经验
        gun["expires"] = -1  # 有效期
        gun["state"] = 1
        gun["mode"] = 0
        gun["skinId"] = skinId if skinId in gunConf["skins"] else gunConf[
            "skins"][0]  # 皮肤炮皮肤
        gun["skins"] = []
        for skinId_ in gunConf["skins"]:
            skinState = SKIN_NOTOPEN
            if skinId_ != -1 and config.getGunSkinConf(skinId_, clientId,
                                                       mode):
                skinState = SKIN_GOT if (skinId_
                                         in ownGunSkinSkins) else SKIN_NOTGOT
            elif skinId_ == 0:
                skinState = SKIN_GOT
            skinData = {"skinId": skinId_, "state": skinState}
            gun["skins"].append(skinData)
        unLock = isUnlock(userId, gunId, gunConf, mode)
        item = userBag.getItemByKindId(gunId)
        if gunConf["skins"][0] in ownGunSkinSkins:  # 永久获得
            if installedGunId == gunId:
                gun["state"] = 0
            if not unLock:  # 未解锁拥有(试用)
                gun["mode"] = 1
        elif item and not item.isDied(int(time.time())):  # 试用
            gun["expires"] = item.expiresTime  # 用道具购买有效期
            if installedGunId == gunId:
                gun["state"] = 0
            if not unLock:  # 未解锁拥有(试用)
                gun["mode"] = 1
        elif gunId == 0:
            if installedGunId == gunId:
                gun["state"] = 0
        else:
            gun["expires"] = 0
            gun["state"] = 2
            if not unLock:
                gun["state"] = 3
        gun["equipState"] = 1 if isCanEquip(userId, gunId, mode) else 0
        guns.append(gun)

    mo = MsgPack()
    mo.setCmd("guns_list")
    mo.setResult("gameId", FISH_GAMEID)
    mo.setResult("userId", userId)
    mo.setResult("gameMode", mode)
    mo.setResult("guns", guns)
    router.sendToUser(mo, userId)