示例#1
0
 def uninit(self):
     self.player = None
     self.rpc = None
     if 0:
         from game.player import player as player_md
         self.player = player_md.Player()
         self.rpc = ClientRpc()
示例#2
0
文件: main.py 项目: soulsharepj/zdzl
 def init_app(self):
     """ 初始化 """
     global aes_encrypt
     from game import aes_encrypt as game_aes_encrypt, ClientRpc
     from game.store.define import GF_CLIENTRPC_AESKEY
     client_rpc_aes_key = model.logon_store.get_config(GF_CLIENTRPC_AESKEY)
     ClientRpc.aes_init(client_rpc_aes_key, pack=1)
     aes_encrypt = game_aes_encrypt
示例#3
0
 def __init__(self, player):
     if 0:
         from game.player import player as player_md
         self.player = player_md.Player()
         self.rpc = ClientRpc()
     self.player = player
     self.active = True
     self.rpc = None
     self._lock = RLock()
示例#4
0
 def _on_client_accept(self, sock, addr):
     """ 处理玩家登陆请求 """
     log.debug(u'client发起连接(%s)', addr)
     _rpc = ClientRpc(sock, addr, self)
     _rpc.call_link_rpc = True
     _rpc.start()
     sleep(120)
     _rpc.stop()  #该链接只用于登录接口,之后断开
示例#5
0
 def _on_client_accept(self, sock, addr):
     """ 处理玩家登陆请求 """
     log.debug(u'client发起连接(%s)', addr)
     _rpc = ClientRpc(sock, addr, self)
     _rpc.call_link_rpc = True
     _rpc.start()
     sleep(120)
     _rpc.stop()#该链接只用于登录接口,之后断开
示例#6
0
 def connect(self, host, port):
     self.rpc = ClientRpc.rpc_client(host, port, self)
     self.rpc.raw_call_func()
     self.rpc.start()
示例#7
0
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
from gevent.event import AsyncResult
from corelib import log
from game import ClientRpc, pack_msg, AbsExport

sys_encoding = os.environ['sys_encoding']
if os.environ.get('CYGWIN', ''):
    sys_encoding = 'utf-8'

import config

AES = 1
if AES:
    ClientRpc.aes_init(config.client_rpc_aes_key, unpack=1)


class Client(AbsExport):
    def __init__(self):
        self.rpc = None
        self.listeners = []
        self.waits = {}

    def add_listener(self, listener):
        if listener in self.listeners:
            return
        self.listeners.append(listener)

    def del_listener(self, listener):
        if listener not in self.listeners:
示例#8
0
 def connect(self, host, port):
     self.rpc = ClientRpc.rpc_client(host, port, self)
     self.rpc.raw_call_func()
     self.rpc.start()
示例#9
0
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
from gevent.event import AsyncResult
from corelib import log
from game import ClientRpc, pack_msg, AbsExport

sys_encoding = os.environ['sys_encoding']
if os.environ.get('CYGWIN', ''):
    sys_encoding = 'utf-8'

import config

AES = 1
if AES:
    ClientRpc.aes_init(config.client_rpc_aes_key, unpack=1)

class Client(AbsExport):
    def __init__(self):
        self.rpc = None
        self.listeners = []
        self.waits = {}

    def add_listener(self, listener):
        if listener in self.listeners:
            return
        self.listeners.append(listener)

    def del_listener(self, listener):
        if listener not in self.listeners:
            return
示例#10
0
    def __init__(self):
        Player._wrefs[id(self)] = self

        self.data = PlayerData()
        self._game = Game.instance
        if self._game is None:
            self._game = Game
            Player.no_game = True

        self.user = None
        self._rpc = None
        self._disable_send = 0
        self._proxy = None
        self.logined = False
        self.save_time = 0
        self._save_lock = RLock()

        #保存其它的运行期对象 player保存时,调用对象方法: obj.save(store)
        self.runtimes = CustomObject()
        #保存角色退出时需要调用清理方法的对象
        self.logout_objs = set([])

        #场景
        self.rpc_scene = None
        #物品列表
        self.bag = Bag(self)
        #待收取物品列表
        self.wait_bag = PlayerWaitBag(self)
        #配将
        self.roles = PlayerRoles(self)
        #任务信息
        self.task = PlayerTask(self)
        #玩家属性
        self.play_attr = PlayerAttr(self)
        #玩家阵型
        self.positions = PlayerPositions(self)
        #玩家打坐
        self.sit = PlayerSit(self)
        #玩家地图信息
        self.maps = PlayerMap(self)
        #邮件
        self.mail = PlayerMail(self)
        #buff
        self.buffs = PlayerBuff(self)
        #vip
        self.vip = PlayerVip(self)
        #大喇叭
        self.hron = PlayHornMgr(self)
        #玩家成就信息(每日成就, 永久成就)
        self.achievement = PlayerAchievement(self)
        #角色属性
        self.property = PlayerProperty(self)

        #玩家胜利战斗id(仅内存中,不存数据库,为防止作弊)
        self.win_fights = IntBiteMap()
        self.vip_attr = PlayerVipAttr(self)

        #ally = {'aid': 同盟ID, 'n': 同盟名字}
        self.ally = None
        self.other_init()

        if 0:
            from game.scene.scene import Scene
            self.user = User()
            self._rpc = ClientRpc()
            self._game = Game()
            self.rpc_scene = Scene()
示例#11
0
class Player(actions.PlayerActionMixin):
    _wrefs = weakref.WeakValueDictionary()
    Data = PlayerData
    no_game = False

    @classmethod
    def new_player(cls, player_dict):
        """ 新建玩家,初始化数据 """
        p = cls()
        p.data.update(player_dict)
        p.save(full=False)
        return p

    @classmethod
    def load_player(cls, pid):
        """ 根据pid,加载创建player对象,必须在逻辑进程执行 """
        p = cls()
        if not p.data.load_from_pid(pid):
            return
        p.load_p()
        return p

    @classmethod
    def del_player(cls, pid, data=None):
        """ 删除玩家数据 """
        if data is None:
            data = Game.rpc_store.load(TN_PLAYER, pid)
        if data is None:
            return False
        player = cls()
        player.data.update(data)
        player.load()
        player.clear()
        Game.rpc_store.delete(TN_PLAYER, player.data.id)
        Game.rpc_player_mgr.del_player(pid)
        return True

    def __init__(self):
        Player._wrefs[id(self)] = self

        self.data = PlayerData()
        self._game = Game.instance
        if self._game is None:
            self._game = Game
            Player.no_game = True

        self.user = None
        self._rpc = None
        self._disable_send = 0
        self._proxy = None
        self.logined = False
        self.save_time = 0
        self._save_lock = RLock()

        #保存其它的运行期对象 player保存时,调用对象方法: obj.save(store)
        self.runtimes = CustomObject()
        #保存角色退出时需要调用清理方法的对象
        self.logout_objs = set([])

        #场景
        self.rpc_scene = None
        #物品列表
        self.bag = Bag(self)
        #待收取物品列表
        self.wait_bag = PlayerWaitBag(self)
        #配将
        self.roles = PlayerRoles(self)
        #任务信息
        self.task = PlayerTask(self)
        #玩家属性
        self.play_attr = PlayerAttr(self)
        #玩家阵型
        self.positions = PlayerPositions(self)
        #玩家打坐
        self.sit = PlayerSit(self)
        #玩家地图信息
        self.maps = PlayerMap(self)
        #邮件
        self.mail = PlayerMail(self)
        #buff
        self.buffs = PlayerBuff(self)
        #vip
        self.vip = PlayerVip(self)
        #大喇叭
        self.hron = PlayHornMgr(self)
        #玩家成就信息(每日成就, 永久成就)
        self.achievement = PlayerAchievement(self)
        #角色属性
        self.property = PlayerProperty(self)

        #玩家胜利战斗id(仅内存中,不存数据库,为防止作弊)
        self.win_fights = IntBiteMap()
        self.vip_attr = PlayerVipAttr(self)

        #ally = {'aid': 同盟ID, 'n': 同盟名字}
        self.ally = None
        self.other_init()

        if 0:
            from game.scene.scene import Scene
            self.user = User()
            self._rpc = ClientRpc()
            self._game = Game()
            self.rpc_scene = Scene()

    def init(self):
        if not self.is_guide:
            self.property.update_CBE()

    def uninit(self):
        """ 清理数据,防止内存泄露 """

        #log.debug('player(%s)uninit', self.data.id)
        def _uninit(obj):
            try:
                if hasattr(obj, 'uninit'):
                    obj.uninit()
                else:
                    obj.player = None
                    obj._player = None
            except:
                log.log_except()

        self.message_clear()
        _uninit(self.bag)
        del self.bag
        _uninit(self.wait_bag)
        del self.wait_bag
        _uninit(self.roles)
        del self.roles
        _uninit(self.task)
        del self.task
        _uninit(self.play_attr)
        del self.play_attr
        _uninit(self.positions)
        del self.positions
        _uninit(self.sit)
        del self.sit
        _uninit(self.maps)
        del self.maps
        _uninit(self.mail)
        del self.mail
        _uninit(self.buffs)
        del self.buffs
        _uninit(self.vip)
        del self.vip
        _uninit(self.hron)
        del self.hron
        _uninit(self.achievement)
        del self.achievement
        _uninit(self.property)
        del self.property
        del self.win_fights
        _uninit(self.vip_attr)
        del self.vip_attr
        self._game = None
        self._runtimes_exec('', _uninit)

    def _rpc_proxy_(self):
        """ 返回对应的代理对象 """
        if self._proxy is None:
            self._proxy = self.user.mgr.get_player_proxy(self.data.id)
        return self._proxy

    def set_rpc(self, rpc):
        self._rpc = rpc
        self._handler = PlayerRpcHandler(self)
        self._handler.init_by_rpc(rpc)

    @property
    def gm(self):
        try:
            return self._gm
        except AttributeError:
            self._gm = self._game.gm_mgr.get_gm(self)
            return self._gm

    @property
    def is_gm(self):
        return UserData.is_gm(self.data.uid)

    @property
    def is_close(self):
        return self._rpc is None

    @property
    def is_guide(self):
        return self.data.chapter <= 1

    @contextmanager
    def with_disable_msg(self):
        self._disable_send = 1
        try:
            yield
        finally:
            self._disable_send = 0

    def _gm_cmd(self, cmds):
        if not isinstance(cmds, (tuple, list)):
            cmds = [cmds]
        gm = self._game.gm_mgr.get_gm(self, forced=True)
        with self.with_disable_log():
            with self.with_disable_msg():
                data = self.data.to_dict()
                for cmd in cmds:
                    gm.execute(cmd % data, log_except=True, log_gm=False)
        return gm

    def on_close(self):
        """ 断线处理 """
        log.info(u'player(%s) on_close', self.data.name)
        if self.user:
            self.user.logout()
        #TODO: 断线延迟释放,允许重连等优化

    def debug_kick(self):
        """测试T非测试玩家下线"""
        log.info(u'pid:(%s),during_debug_time(%s)', self.data.id,
                 self.data.name)
        self.user.logout()

    def to_dict(self):
        return self.data.to_dict()

    def _runtimes_exec(self, name, func):
        for obj in self.runtimes.__dict__.values():
            if name and not hasattr(obj, name):
                continue
            try:
                func(obj)
            except:
                log.log_except()

    def reward_params(self):
        """ 获取奖励用参数 """
        return dict(level=self.data.level)

    def _init_guide(self):
        """ 初始化为初章数据 """
        if self._game.rpc_status_mgr.get(GUIDE_PASS):
            self.task.chapter_complete()
            return

        cmd = self._game.setting_mgr.setdefault(GUIDE_PLAYER_CMD,
                                                GUIDE_PLAYER_CMD_V)
        self._gm_cmd(cmd)

    def reg_logout(self, obj):
        """注册玩家下线调用的数据清理obj"""
        self.logout_objs.add(obj)

    def unreg_logout(self, obj):
        if obj in self.logout_objs:
            self.logout_objs.remove(obj)

    def login(self, user):
        """ 登录 """
        log.debug('player(%s-%s) login, sns(%s)', self.data.id, self.data.name,
                  user.sns_type)
        self.logon_time = int(time.time())
        self.log_normal(PL_LOGIN, u=self.data.uid, ip=self._rpc.addr[0])
        self.user = user
        self.save_time = int(time.time())
        self.load()
        if self.is_guide:
            self._init_guide()
        self.logined = True
        self.init()
        self.safe_pub(MSG_LOGON)

    def _logout(self):
        self.sit.close()
        for obj in self.logout_objs:
            if not hasattr(obj, 'player_logout'):
                continue
            try:
                obj.player_logout(self.data.id)
            except Exception:
                log.log_except()

    def logout(self):
        """ 登出 """
        log.debug('player(%s-%s) logout', self.data.id, self.data.name)
        self._handler.close_handler()
        self.log_normal(PL_LOGOUT)
        try:
            self._logout()
        except:
            log.log_except(u'player(%s) logout error', self.data.name)
        logout_time = int(time.time())
        self.data.tTotal += logout_time - self.logon_time
        self.data.tLogin = self.logon_time
        self.data.tLogout = int(time.time())
        self.save()
        self._runtimes_exec('logout', lambda obj: obj.logout(self))
        self.logined = False
        self.user.player_logout()
        self.uninit()

    def leave(self):
        """ 退出player """
        self.logout()

    def send_msg(self, msg):
        """ 发送由pack_msg生成的消息 """
        if self._disable_send or self._rpc is None:
            return
        self._rpc.send(msg)

    def get_ip(self):
        if self._rpc is None:
            return
        return self._rpc.addr[0]

    def get_init_msg(self):
        """ 发送玩家初始化数据 """
        resp_f = 'init'
        CBE = {
            FN_P_ATTR_CBE: self.play_attr.CBE,
            FN_P_ATTR_CBES: self.play_attr.CBES
        }
        d = dict(
            player=self.to_dict(),
            roles=self.roles.to_dict(),
            ilist=self.bag.to_dict(),
            iwait=self.wait_bag.to_dict(),
            task=self.task.to_dict(),
            position=self.positions.to_dict(),
            cliAttr=self.play_attr.client_to_dict(),
            map=self.maps.to_dict(),
            mail=self.mail.to_dict(),
            buff=self.buffs.to_dict(),
            vip=self.vip_attr.to_dict(),
            CBE=CBE,
            #reward = self._game.reward_mgr2.reward_init_msg(self)
        )
        if self.ally:
            d['ally'] = self.ally
        return pack_msg(resp_f, 1, data=d)

    def base_load(self):
        """ 加载玩家数据 """
        self.play_attr.load()
        self.roles.load()
        self.bag.load()
        self.wait_bag.load()
        self.task.load()
        self.positions.load()
        self.maps.load()
        self.buffs.load()
        self.mail.load()
        self.vip.load()
        self.hron.load()
        self.achievement.load()
        self.vip_attr.load()
        self.ally = self._game.rpc_ally_mgr.to_dict(self.data.id)

    def load(self):
        """ 加载玩家数据 """
        self.base_load()
        self.sit.load()

    def load_p(self):
        """ 玩家不在线时,其他模块使用(如机器人) """
        self.base_load()

    def save(self, full=True):
        """ 保存玩家数据, """
        #未完成初章,初章的数据是特殊的保存会污染其它功能,需要调整
        if self.is_guide:
            self.data.level = 1
        self._game.rpc_store.save(TN_PLAYER, self.to_dict())
        if not full:
            return
        with self._save_lock:
            self.save_time = int(time.time())
            self.roles.save()
            self.bag.save()
            self.wait_bag.save()
            self.task.save()
            self.positions.save()
            self.maps.save()
            self.sit.save()
            self.buffs.save()
            self.mail.save()
            self.achievement.save()
            store = self._game.rpc_store
            self._runtimes_exec('save', lambda obj: obj.save(store))
            if not self.is_guide:
                self.property.update_CBE()
            #玩家属性应最后保存(别的模块有玩家属性点更新)
            log.debug('player(%s)_attr-save', self.data.name)
            self.play_attr.save()

    def clear_attr_car(self):
        """ 清楚玩家坐骑属性 """
        self.data.car = 0
        self.update_scene_info({IF_IDX_CAR: 0})

    def clear(self, all=True, dels=tuple()):
        """ 清理玩家所有数据 """
        if dels:
            all = False
        if all or 'role' in dels:
            self.roles.clear()
        if all or 'bag' in dels:
            self.bag.clear()
        if all or 'wait_bag' in dels:
            self.wait_bag.clear()
        if all or 'task' in dels:
            self.task.clear()
        if all or 'positions' in dels:
            self.positions.clear()
        if all or 'play_attr' in dels:
            self.play_attr.clear()
        if all or 'maps' in dels:
            self.maps.clear()
        if all or 'buffs' in dels:
            self.buffs.clear()
        if all or 'mail' in dels:
            self.mail.clear()
        if all or 'deep' in dels:
            self._game.deep_mgr.clear(self)
        if all or 'achievement' in dels:
            self.achievement.clear()

    def update_state(self, state):
        """ 更新状态 """
        self.data.state = state
        self.update_scene_info({IF_IDX_STATE: state})

    def get_coin2(self, use_bind=1):
        """ 获取元宝数 """
        return self.data.coin2 + self.data.coin3 if use_bind else self.data.coin2

    def enough_coin(self, aCoin1, aCoin2=0, use_bind=True):
        """ 消耗的钱币是否够 """
        return 0 <= aCoin1 <= self.data.coin1 and \
                0 <= aCoin2 <= self.get_coin2(use_bind=use_bind)

    def enough_coin_ex(self, aCoin1, aCoin2=0, aCoin3=0):
        """ 消耗的钱币是否够 """
        if aCoin2 and aCoin3:
            return False
        use_bind = bool(aCoin3)
        yb = aCoin3 if use_bind else aCoin2
        return 0 <= aCoin1 <= self.data.coin1 and\
               0 <= yb <= self.get_coin2(use_bind=use_bind)

    def cost_coin_ex(self, aCoin1=0, aCoin2=0, aCoin3=0, log_type=None):
        """ 花费 """
        if aCoin2 and aCoin3:
            return False
        use_bind = bool(aCoin3)
        yb = aCoin3 if use_bind else aCoin2
        return self.cost_coin(aCoin1=aCoin1,
                              aCoin2=yb,
                              use_bind=use_bind,
                              log_type=log_type)

    def cost_coin(self, aCoin1=0, aCoin2=0, use_bind=True, log_type=None):
        """ 花费钱币(aCoin1:银币,aCoin2:元宝, use_bind:是否使用绑定元宝 """
        if not self.enough_coin(aCoin1, aCoin2=aCoin2, use_bind=use_bind):
            return False
        c2, c3 = 0, 0
        if aCoin1:
            self.data.coin1 -= aCoin1
        if aCoin2:
            if use_bind:
                #先消耗绑定元宝再消耗元宝
                if self.data.coin3 < aCoin2:
                    c3 = self.data.coin3
                    c2 = aCoin2 - c3
                    self.data.coin2 -= c2
                    self.data.coin3 = 0
                else:
                    c3 = aCoin2
                    self.data.coin3 -= aCoin2
            else:
                c2 = aCoin2
                self.data.coin2 -= aCoin2
            self.safe_pub(MSG_COST_COIN3, aCoin2)
            self.save(full=False)
        if log_type:
            self.log_coin(log_type, aCoin1, c2, c3)
        return True

    def add_coin(self,
                 aCoin1=0,
                 aCoin2=0,
                 aCoin3=0,
                 is_set=False,
                 vip=False,
                 log_type=None):
        """ 添加钱币(银币\元宝\绑元宝) """
        if is_set:
            self.data.coin1 = aCoin1
            self.data.coin2 = aCoin2
            self.data.coin3 = aCoin3
            if vip:
                self.data.vipCoin = aCoin2
        else:
            if aCoin1:
                self.data.coin1 += aCoin1
            if aCoin2:
                self.data.coin2 += aCoin2
            if aCoin3:
                self.data.coin3 += aCoin3
            if vip:
                self.data.vipCoin += aCoin2
        if aCoin2 or aCoin3:
            self.save(full=False)
        if log_type:
            self.log_coin(log_type, aCoin1, aCoin2, aCoin3)
        return True

    def is_max_level(self, level=None):
        """ 是否达到最大等级 """
        if level is None:
            level = self.data.level
        return level >= self._game.setting_mgr.setdefault(
            PLAYER_LEVEL_MAX, 9999)

    def add_exp(self, aExp):
        """ 添加经验
            返回:0 失败 1 成功 2 升级
        """
        if aExp < 0:
            return 0
        tReturn = 1
        tNewExp = self.data.exp + aExp
        if self.is_max_level():
            tNextExpLevel = self._game.res_mgr.exps_by_level.get(
                self.data.level + 1)
            if tNextExpLevel:
                if tNewExp < tNextExpLevel.exp:
                    self.data.exp = tNewExp
                else:
                    self.data.exp = tNextExpLevel.exp - 1
            return tReturn

        #进行升级级检查
        tNewLevel = self.data.level
        tNextLevel = self.data.level
        while True:
            tNextLevel += 1
            tNextExpLevel = self._game.res_mgr.exps_by_level.get(tNextLevel)
            if not tNextExpLevel:
                return 0
            if tNewExp >= tNextExpLevel.exp:
                #升一级
                tNewLevel += 1
                tNewExp -= tNextExpLevel.exp
                continue
            break
        if tNewLevel > self.data.level:
            self.data.exp = tNewExp
            self.upgrade(tNewLevel)
            tReturn = 2
        else:
            self.data.exp = tNewExp
        #self.save(full=False)
        return tReturn

    def upgrade(self, level, pub=True):
        """ 玩家升级 """
        if not self.is_guide and self.is_max_level(level - 1):
            return
        old_lv = self.data.level
        self.data.level = level
        self.log_normal(PL_UPGRADE, lv=level)
        #升级主动推
        if self.logined:
            self.up_level()
        if pub:
            #跨等级升级,发送多次消息
            for lv in xrange(old_lv + 1, level + 1):
                self.pub(MSG_UPGRADE, lv)

    def up_level(self):
        """ 升级主动推给客户端 """
        resp_f = 'upLevel'
        self.send_msg(pack_msg(resp_f, 1, data={'player':
                                                self.data.to_dict()}))
        self.update_scene_info({IF_IDX_LEVEL: self.data.level})

    def add_site_time(self, site_time):
        """ 添加打坐时间经验 """
        site_exp = self._game.res_mgr.get_site_exp(self.data.level)
        return self.add_exp(int(site_exp * site_time))

    def add_train(self, aTrain, msg=1, log_type=None):
        """ 添加练历 """
        if aTrain <= 0:
            return
        old_train = self.data.train
        self.data.train += aTrain
        if old_train / 1000 != self.data.train / 1000:
            self.pub(MSG_TRAIN)
        if msg:
            self.pub(MSG_ADDTRAIN, aTrain)
        if log_type:
            self.log_train(log_type, aTrain)
        return True

    def cost_train(self, aTrain, log_type=None):
        """ 消耗练历 """
        if aTrain <= 0 or aTrain > self.data.train:
            return
        self.data.train -= aTrain
        if log_type:
            self.log_train(log_type, aTrain)
        #self.save(full=False)
        return True

    def pack_msg_data(self,
                      coin=False,
                      exp=False,
                      train=False,
                      items=None,
                      equips=None,
                      fates=None,
                      cars=None,
                      roles=None,
                      waits=None,
                      buffs=None,
                      mails=None,
                      gem=None,
                      del_iids=None,
                      del_eids=None,
                      del_fids=None,
                      del_cids=None,
                      del_wids=None,
                      del_bids=None,
                      del_mids=None,
                      del_gids=None,
                      send=0):
        """ 打包物品更新结构 """
        data = self.data
        rs = dict()
        if coin:
            rs['coin1'] = data.coin1
            rs['coin2'] = data.coin2
            rs['coin3'] = data.coin3
        if exp:
            rs['exp'] = data.exp
        if train:
            rs['train'] = data.train
        if items:
            rs['item'] = [i.to_dict() for i in items]
        if equips:
            rs['equip'] = [i.to_dict() for i in equips]
        if fates:
            rs['fate'] = [i.to_dict() for i in fates]
        if gem:
            rs['gem'] = [i.to_dict() for i in gem]
        if cars:
            rs['car'] = [i.to_dict() for i in cars]
        if waits:
            rs['wait'] = [i.to_dict() for i in waits]
        if buffs:
            rs['buff'] = [i.to_dict() for i in buffs]
        if roles:
            rs['role'] = [i.to_dict() for i in roles]
        if mails:
            rs['mail'] = [i.to_dict() for i in mails]
        if del_iids:
            rs['delIids'] = tuple(del_iids)
        if del_eids:
            rs['delEids'] = tuple(del_eids)
        if del_fids:
            rs['delFids'] = tuple(del_fids)
        if del_cids:
            rs['delCids'] = tuple(del_cids)
        if del_wids:
            rs['delWids'] = tuple(del_wids)
        if del_bids:
            rs['delBids'] = tuple(del_bids)
        if del_mids:
            rs['delMids'] = tuple(del_mids)
        if del_gids:
            rs['delGids'] = tuple(del_gids)
        if send:
            self.send_msg(pack_msg('update', 1, data=rs))
        return rs

    def send_update_msg(self, msg_data, rs=1):
        if rs:
            self.send_msg(pack_msg('update', rs, data=msg_data))
        else:
            self.send_msg(pack_msg('update', rs, err=msg_data))

    def init_all_runtimes(self):
        """初始化所有动态模块"""
        self._game.bftask_mgr.init_player_bftask(self)
        self._game.deep_mgr.init_player(self)
        self._game.fete_mgr.init_player_fete(self)
        self._game.fish_mgr.init_player(self)
        self._game.ctree_mgr.bind_player(self)
        self._game.hfate_mgr.init_player_hitfate(self)
        self._game.mining_mgr.init_player(self)
        self._game.reward_mgr2.init_player(self)
        self._game.shop_mgr.init_player_shop(self)
        self._game.social_mgr.init_player(self)
        self._game.tbox_mgr.init_player_tbox(self)

    def copy_from(self, player):
        pid, uid, name = self.data.id, self.data.uid, self.data.name
        self.data.copy_from(player.data)
        self.data.update(dict(id=pid, uid=uid, name=name))

        items = self.bag.copy_from(player.bag)
        self.roles.copy_from(player.roles, items)
        self.play_attr.copy_from(player.play_attr)
        witems = self.wait_bag.copy_from(player.wait_bag)
        self.task.copy_from(player.task)
        self.positions.copy_from(player.positions, player.data.posId)
        self.maps.copy_from(player.maps)
        self.sit.copy_from(player.sit)
        self.buffs.copy_from(player.buffs)
        self.mail.copy_from(player.mail, witems)
        self.vip.copy_from(player.vip)
        self.achievement.copy_from(player.achievement)

        #拷贝动态模块
        self.init_all_runtimes()
        player.init_all_runtimes()
        self._runtimes_exec('copy_from', lambda obj: obj.copy_from(player))

    def copy_player(self, pid):
        """ 完全复制玩家数据 """
        p = self.load_player(pid)
        if not p:
            return 0
        self.copy_from(p)
        return 1

    def look(self):
        """ 返回查看,战斗用信息 """
        CBE = {
            FN_P_ATTR_CBE: self.play_attr.CBE,
            FN_P_ATTR_CBES: self.play_attr.CBES
        }
        info = dict(
            player=self.data.to_dict(),
            roles=self.roles.to_dict(used=1),
            ilist=self.bag.to_dict(used=1),
            position=self.positions.to_dict(used=1),
            CBE=CBE,
        )
        return info

    def team_look(self, rids):
        """返回组队战斗用信息"""
        CBE = {
            FN_P_ATTR_CBE: self.play_attr.CBE,
            FN_P_ATTR_CBES: self.play_attr.CBES
        }
        roles = self.roles.roles_to_dict(rids)
        ilist = self.roles.roles_bag_to_dict(rids)
        info = dict(
            player=self.data.to_dict(),
            roles=roles,
            ilist=ilist,
            CBE=CBE,
        )
        return info

    def fight_win(self, fid):
        """主线战斗胜利"""
        fid = int(fid)
        if fid in self.win_fights:
            return
        rid = self._game.res_mgr.get_fight_rid(fid)
        if not rid:
            return
        rw = self._game.reward_mgr.get(rid)
        if rw is None:
            return
        items = rw.reward(params=self.reward_params())
        if items is None:
            return
        if self.bag.can_add_items(items):
            self.set_win_fight(fid)
            bag_items = self.bag.add_items(items, log_type=COIN_ADD_FIGHT_WIN)
            return bag_items.pack_msg(coin=True)

    def set_win_fight(self, fid):
        self.win_fights.insert(fid)
        self.play_attr.set(PLAYER_ATTR_WIN_FIGHTS, self.win_fights.to_base64())

    def load_win_fight(self):
        win_fights = self.play_attr.attr.get(PLAYER_ATTR_WIN_FIGHTS)
        if win_fights:
            self.win_fights.from_base64(win_fights)

    def get_main_role_eid(self):
        """获取主将装备(用于组队战斗显示)"""
        rid = self.data.rid
        role = self.roles.get_role_by_rid(rid)
        return rid, role.body_equip_id

    def get_ally_tbox_data(self):
        return self.play_attr.get(FN_P_ATTR_ALLYTBOX, dict(bids=[], t=0, cr=0))

    def set_ally_tbox_data(self, data):
        self.play_attr.set(FN_P_ATTR_ALLYTBOX, data)

    def gm_finish_achi(self, t, aid):
        self.achievement.gm_finish(t, aid)
示例#12
0
 def start(self, mgr, sock, addr):
     self.mgr = mgr
     self.sock = sock
     self.addr = addr
     self._rpc = ClientRpc(self.sock, self.addr, self)
     self._rpc.start()
示例#13
0
class User(GameObj, AbsExport):
    """ 账号 """
    TABLE_NAME = TN_USER
    DATA_CLS = UserData
    INIT_TIMEOUT = 60
    LOGON_TIMEOUT = 60 * 5  #登录、新建角色

    def __init__(self, adict=None):
        if 0:
            from game.player.player_mgr import SubPlayerMgr
            self.mgr = SubPlayerMgr()
            self.player = Player()
        super(User, self).__init__(adict=adict)
        self.inited = 0
        self._init_waiter = Event()
        self.key = None
        self.player = None
        self.logouted = False
        self.player_datas = None
        self.players = {}
        self.sns_type = 0

    def start(self, mgr, sock, addr):
        self.mgr = mgr
        self.sock = sock
        self.addr = addr
        self._rpc = ClientRpc(self.sock, self.addr, self)
        self._rpc.start()

    def stoped(self):
        return self._rpc is None

    def stop(self):
        if self._rpc:
            rpc = self._rpc
            self._rpc = None
            rpc.stop()

    def on_close(self, rpcobj):
        """ 断线处理 """
        self.logout()

    def wait_for_init(self):
        """ 等待初始化和登陆 """
        self._init_waiter.wait(self.INIT_TIMEOUT)
        if not self.inited >= 2:
            self.stop()


##        self._init_waiter.clear()
##        self._init_waiter.wait(self.LOGON_TIMEOUT)
##        if not self.inited == 3:
##            self.stop()

    def send_msg(self, msg):
        """ 发送由pack_msg生成的消息 """
        if self._rpc is None:
            return
        self._rpc.send(msg)

    def logon(self):
        """ 账号登录 """
        uid, sns_type = self.mgr.check_logon(self.data.id, self.key)
        if uid is False:
            return False
        adict = Game.rpc_store.load(TN_USER, uid)
        self.data.update(adict)
        self.mgr.add_user(self)
        self.sns_type = sns_type
        return True

    def logout(self):
        """ 退出账号 """
        if self.logouted:
            return
        self.logouted = True
        if self.player:
            self.player.logout()
        self.mgr.del_user(self)
        self.stop()

    def player_login(self, pid):
        resp_f = 'enter'
        player_data = PlayerData.load(pid)
        player = Player()
        player.data.update(player_data)
        if player.data.id is None:
            log.error('player(%d)player_login load error:%s', pid, player_data)
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)

        if player.is_forbid_login:
            return pack_msg(resp_f, 0, err=errcode.EC_FORBID_LOGON)
        if not self.mgr.add_player(player):
            return pack_msg(resp_f, 0, err=errcode.EC_TIME_UNDUE)
        self.player = player
        try:
            player.set_rpc(self._rpc)
            player.login(self)
            map_id = player.data.mapId if player.data.mapId else 1
            player.scene_enter(map_id, login=True)
            self.mgr.logon_player(player)
            log.debug(u'(%s)玩家(%s)登陆成功', player.data.id, player.data.name)
            player.send_msg(player.get_init_msg())
            spawn(self.mgr.logoned_player, player)
            return pack_msg(resp_f, 1)
        except:
            log.log_except(u'玩家(%s)登陆初始化失败', player.data.id)
            self.player_logout()
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)

    def player_logout(self):
        try:
            self.player_leave()
            if not self.player:
                return
            p = self.player
            self.player = None
            self.mgr.del_player(p)
        except Exception:
            log.log_except()
        self.player = None

    def player_leave(self):
        if self._rpc:
            self._rpc.set_export(self)

    def rc_login1(self, user, key):
        """ client登陆到逻辑进程
        user: user id
        """
        if self.inited:
            return
        resp_f = 'login1'
        self.inited = 1
        log.info(u'账号(%s)登陆', user)
        self.key = key
        self.data.id = user
        if not self.logon():
            log.error(u'账号(%s)登陆错误', user)
            resp = pack_msg(resp_f, 0, err=errcode.EC_LOGIN_ERR)
        else:
            #resp.server_time = int(time.time())
            resp = pack_msg(resp_f, 1)
            self.inited = 2
        spawn_later(1, self._init_waiter.set)
        return resp

    def rc_logout(self):
        resp_f = 'logout'
        self.logout()
        return pack_msg(resp_f, 1)

    @wrap_inited
    def rc_players(self):
        """ 获取角色列表 """
        resp_f = 'players'
        if self.player_datas is None:
            self.player_datas = list(
                Game.rpc_store.query_loads(TN_PLAYER, dict(uid=self.data.id)))
            self.players = dict(
                (v[FN_ID], i) for i, v in enumerate(self.player_datas))
        return pack_msg(resp_f, 1, data=self.player_datas)

    @wrap_inited
    def rc_delete(self, pid):
        """ 删除玩家,注意:数据未备份会永远删除掉 """
        resp_f = 'delete'
        if not self.player_datas:
            return pack_msg(resp_f, 0)
        for data in self.player_datas:
            if data['id'] != pid:
                continue
            self.players.pop(pid, None)
            self.player_datas.remove(data)
            rs = Player.del_player(pid, data=data)
            if rs:
                return pack_msg(resp_f, 1)
            else:
                return pack_msg(resp_f, 0, err=errcode.EC_VALUE)

    @wrap_inited
    def rc_new(self, name, rid):
        """ 新建player """
        resp_f = 'new'
        #log.debug(u'rc_new:%s', name)
        #判断该账号是否超过创建角色的数目
        name = name.strip()
        tPlayerNum = len(
            Game.rpc_store.query_loads(TN_PLAYER, dict(uid=self.data.id)))
        if tPlayerNum > Game.instance.setting_mgr.setdefault(
                USE_PLAYS_MAX, USE_PLAYS_MAX_V):
            return pack_msg(resp_f, 0, err=errcode.EC_USER_MAX)
        if not name or rid not in Game.res_mgr.roles:
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        #敏感词
        if Game.rpc_ban_word_mgr.check_ban_word(name):
            #if Game.setting_mgr.check_ban_word(name):
            return pack_msg(resp_f, 0, err=errcode.EC_NAME_REPEAT)
        #名字长度截取
        player_dict = Game.rpc_player_mgr.new_player(self.data.id, name[:50],
                                                     rid)
        if not player_dict:
            return pack_msg(resp_f, 0, err=errcode.EC_NAME_REPEAT)
        player = Player.new_player(player_dict)
        log.info(u'用户(%s)新建玩家(%s):%s', self.data.name, name, player.data.id)
        data = player.to_dict()
        self.player_datas.append(data)
        self.players[player.data.id] = len(self.player_datas) - 1
        return pack_msg(resp_f, 1, data=data)

    @wrap_inited
    def rc_enter(self, id):
        """ 进入player """
        resp_f = 'enter'
        if not id:
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        if id not in self.players:
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        if Game.rpc_player_mgr.pre_add(id, self.data.id):
            sleep(0.01)
        return self.player_login(id)
示例#14
0
 def init(self, sock, addr):
     self._sock = sock
     self.rpc = ClientRpc(sock, addr, self)
     self.rpc.start()
     _locks[self] = {}
示例#15
0
class PlayerRpcHandler(BasePlayerRpcHander):
    def __init__(self, player):
        if 0:
            from game.player import player as player_md
            self.player = player_md.Player()
            self.rpc = ClientRpc()
        self.player = player
        self.active = True
        self.rpc = None
        self._lock = RLock()

    def uninit(self):
        self.player = None
        self.rpc = None
        if 0:
            from game.player import player as player_md
            self.player = player_md.Player()
            self.rpc = ClientRpc()

    def on_close(self, rpcobj):
        """ 断线处理 """
        sleep(0.05)  #等待其它接口完成
        self.player.on_close()

    _close_i = 0.05
    _close_time = 10  #等待时间
    _close_count = int(_close_time / _close_i)

    def close_handler(self):
        """ player主动调用,先关闭接口,再处理别的,注意不调用会内存泄漏 """
        global _locks
        try:
            self.active = False
            for i in xrange(self._close_count):
                if not _locks[self]:
                    break
                sleep(self._close_i)
        except:
            log.log_except()
        finally:
            _locks.pop(self, None)

    def init(self, sock, addr):
        self._sock = sock
        self.rpc = ClientRpc(sock, addr, self)
        self.rpc.start()
        _locks[self] = {}

    def init_by_rpc(self, rpc):
        self.rpc = rpc
        if rpc:
            rpc.set_export(self)
        _locks[self] = {}

    def stop(self):
        if self.rpc is not None:
            self.rpc.stop()
            self.rpc = None

    def _pack_items(self, items, equips, fates):
        return dict(
            coin1=self.player.data.coin1,
            coin2=self.player.data.coin2,
            coin3=self.player.data.coin3,
            exp=self.player.data.exp,
            train=self.player.data.train,
            items=[i.to_dict() for i in items],
            equips=[i.to_dict() for i in equips],
            fates=[i.to_dict() for i in fates],
        )

    def rc_gm(self, cmd):
        """ 执行gm命令 """
        resp_f = 'gm'
        gm = self.player.gm
        if gm is None:
            return pack_msg(resp_f, 0, err=u'gm auth error!')
        msg = gm.execute(cmd)
        return pack_msg(resp_f, 1, data=dict(msg=msg))

    def rc_isGm(self):
        """ 判断玩家是否gm """
        resp_f = 'isGm'
        gm = self.player.gm is not None
        return pack_msg(resp_f, 1, data=dict(gm=int(gm)))

    def rc_clear_player_data(self, all=True, dels=tuple()):
        """ 清空玩家数据,压力测试用,正常游戏不需要调用这个接口 """
        resp_f = 'clear_player_data'
        #log.warn(u'(%s) rc_clear_player_data', self.player.data.id)
        try:
            self.player.clear(all=all, dels=dels)
            return pack_msg(resp_f, 1)
        except Exception as e:
            return pack_msg(resp_f, 0, err=str(e))

    def rc_valid_gm(self):
        """ 启动gm模块,压力测试用 """
        resp_f = 'valid_gm'
        if not self.player._game.rpc_player_mgr.is_overload():
            return pack_msg(resp_f, 0, err='overload close')
        self.player._gm = self.player._game.gm_mgr.get_gm(self.player,
                                                          forced=True)
        return pack_msg(resp_f, 1)

    def rc_init(self):
        """ 获取初始化信息 """
        resp_f = 'init'
        return self.player.get_init_msg()

    def rc_bindSNS(self, t, sid, session):
        """ 账号绑定 """
        resp_f = 'bindSNS'
        rs, data = self.player._game.rpc_player_mgr.bindSNS(
            self.player.data.uid, t, sid, session)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1)

    def rc_logout(self):
        """ 退出 """
        return self.player.user.rc_logout()

    @_wrap_nolock
    def rc_leave(self):
        """ 退出player """
        resp_f = 'leave'
        self.player.leave()
        return pack_msg(resp_f, 1)

    def rc_lookPlayer(self, pid=None, name=None):
        """ 查看其它玩家信息 """
        resp_f = 'lookPlayer'
        if name:
            querys = dict(name=name)
            dics = self.player._game.rpc_store.query_loads(TN_PLAYER,
                                                           querys=querys)
            if not dics:
                return pack_msg(resp_f, 0, err=errcode.EC_PLAYER_EMPTY)
            pid = dics[0]['id']
        rs, data = self.player._game.player_mgr.look(pid)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_player(self):
        """ 请求玩家信息 """
        resp_f = 'player'
        return pack_msg(resp_f, 1, data=self.player.to_dict())

    def rc_funcsUpdate(self, funcs):
        """ 更新前端用的开启功能按钮列表 """
        resp_f = 'funcsUpdate'
        self.player.data.funcs = funcs
        if config.debug:
            self.player.log_normal(PL_FUNCSUPDATE,
                                   d=funcs,
                                   tid=self.player.task.current_tid)
        return pack_msg(resp_f, 1)

    def rc_CBEUpdate(self, CBE, cbes):
        """ 更新战斗力信息 """
        if self.player.is_guide:
            return
        #CBE改用服务器计算的
        #self.player.play_attr.set(FN_P_ATTR_CBE, CBE)
        #self.player.play_attr.set(FN_P_ATTR_CBES, cbes)

    def rc_roles(self, pid=None):
        """ 请求配将信息 """
        resp_f = 'roles'
        if pid is None:
            return pack_msg(resp_f, 1, data=self.player.roles.to_dict())
        #TODO 获取其它玩家配将信息

    def rc_ilist(self, pid=None):
        """ 请求玩家物品信息 """
        log.debug(u'===rc_ilist===')
        resp_f = 'ilist'
        if pid is None:
            return pack_msg(resp_f, 1, data=self.player.bag.to_dict())

    def rc_iwait(self):
        """ 请求待收取物品列表 """
        resp_f = 'iwait'
        return pack_msg(resp_f, 1, data=self.player.wait_bag.to_dict())

    def rc_waitFetch(self, type, id=None):
        """ 收取物品 """
        resp_f = 'waitFetch'
        rs, data = self.player.wait_bag.fetch(type, id)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        else:
            return pack_msg(resp_f, 0, err=data)

    def rc_useItem(self, id):
        """ 使用物品,获取东西 """
        resp_f = 'useItem'
        rs, data = self.player.use_item(id)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_cliAttr(self, key):
        """ 获取前端属性 """
        resp_f = 'cliAttr'
        value = self.player.play_attr.client_get(key)
        return pack_msg(resp_f, 1, data=value if value is not None else '')
        #return pack_msg(resp_f, 1, data=self.player.play_attr.client_to_dict())

    def rc_cliAttrSet(self, key, value):
        """ 设置前端属性 """
        #log.debug('rc_cliAttrSet(%s, %s)', key, value)
        resp_f = 'cliAttrSet'
        if not key:
            return pack_msg(resp_f, 0)
        self.player.play_attr.client_set(key, value)
        return pack_msg(resp_f, 1)

    def rc_pAttr(self, key):
        """ 获取属性 """
        resp_f = 'pAttr'
        value = self.player.play_attr.get(key)
        return pack_msg(resp_f, 1, data=value if value is not None else '')
        #return pack_msg(resp_f, 1, data=self.player.play_attr.client_to_dict())

    def rc_pAttrSet(self, key, value):
        """ 设置属性 """
        resp_f = 'pAttrSet'
        if not key:
            return pack_msg(resp_f, 0)
        self.player.play_attr.set(key, value)
        return pack_msg(resp_f, 1)

    def rc_task(self, pid=None):
        """ 获取玩家的任务 """
        resp_f = 'task'
        if pid is None:
            return pack_msg(resp_f, 1, data=self.player.task.to_dict())

    def rc_taskUpdate(self, id, step):
        """ 更新玩家任务状态"""
        resp_f = 'taskUpdate'
        return pack_msg(resp_f, 1, data=self.player.task.task_update(id, step))

    def rc_taskActive(self, id):
        """ 激活某任务,无返回 """
        resp_f = 'taskActive'
        task = self.player.task.get_task(id)
        if not task:
            return
        self.player.task.task_active(task)

    def rc_taskComplete(self, id):
        """ 完成任务获取奖励 """
        resp_f = 'taskComplete'
        rs, bag_items = self.player.task.task_complete(id)
        if rs:
            if bag_items:
                data = bag_items.pack_msg(rwitems=True)
            else:
                data = None
            return pack_msg(resp_f, 1, data=data)
        else:
            return pack_msg(resp_f, 0, err=bag_items)

    def rc_chapterComplete(self):
        """ 完成章节 """
        resp_f = 'chapterComplete'
        if self.player.task.chapter_complete():
            return pack_msg(resp_f, 1)
        else:
            return pack_msg(resp_f, 0)

    def rc_bfTaskEnter(self):
        """ 进入兵符任务 """
        resp_f = 'bfTaskEnter'
        rs, data = self.player._game.bftask_mgr.bf_task_enter(self.player)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_bfTaskRe(self, type):
        """ 兵符任务刷新 """
        resp_f = 'bfTaskRe'
        rs, data = self.player._game.bftask_mgr.bf_task_re(self.player, type)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_bfTaskBox(self):
        """ 打开兵符宝箱 """
        resp_f = 'bfTaskBox'
        rs, data = self.player._game.bftask_mgr.bf_task_box(self.player)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_bfTaskGet(self, index):
        """ 接兵符任务 """
        resp_f = 'bfTaskGet'
        rs, data = self.player._game.bftask_mgr.bf_task_get(self.player, index)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_bfTaskFinish(self):
        """ 立即完成的兵符任务 """
        resp_f = 'bfTaskFinish'
        rs, data = self.player._game.bftask_mgr.bf_finish(self.player)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_carExchange(self, cid):
        """ 坐骑兑换 """
        resp_f = 'carExchange'
        rs, data = self.player.car_exchange(cid)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_carDo(self, cid):
        """ 坐骑的操作 """
        resp_f = 'carDo'
        rs, data = self.player.car_do(cid)
        if rs:
            return pack_msg(resp_f, 1)
        return pack_msg(resp_f, 0, err=data)

    def rc_mergeItem(self, desId, count, srcId):
        """ 物品合成 """
        res_f = 'mergeItem'
        rs, data = self.player.merge_item(desId, count, srcId)
        if rs:
            return pack_msg(res_f, 1, data=data)
        return pack_msg(res_f, 0, err=data)

    def rc_wearEq(self, id, rid):
        """ 穿装备
        id: 装备玩家表id
        rid:角色玩家表id
        """
        resp_f = 'wearEq'
        role = self.player.roles.get_role(rid)
        equip, res_equip = self.player.bag.get_equip_ex(id)
        if res_equip is None:
            return pack_msg(resp_f, 0, err=errcode.EC_ITEM_NOFOUND)

        res_eq_set = self.player._game.item_mgr.get_res_eq_set(res_equip.sid)
        if res_eq_set.cond and res_eq_set.lv > self.player.data.level:
            return pack_msg(resp_f, 0, err=errcode.EC_NOLEVEL)
        if not (role and equip):
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        if equip.data.used:
            return pack_msg(resp_f, 0, err=errcode.EC_ROLE_WEARED)
        rs, data = role.wear_equip(self.player, equip, res_equip)
        if rs:
            off_equip, msg = data
            return msg
        return pack_msg(resp_f, 0, err=data)

    def rc_tackOffEq(self, id, rid):
        """ 脱装备 """
        resp_f = 'tackOffEq'
        role = self.player.roles.get_role(rid)
        equip, res_equip = self.player.bag.get_equip_ex(id)
        if not (equip and role):
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        rs, data = role.take_off_equip(self.player, res_equip.part)
        if rs:
            return pack_msg(resp_f, 1, data=dict(uid=id))
        return pack_msg(resp_f, 0, err=data)

    def rc_armUpgrade(self, rid):
        """ 武器升级 """
        resp_f = 'armUpgrade'
        if not rid:
            return pack_msg(resp_f, 0)
        tRole = self.player.roles.roles.get(rid)
        rs, data = self.player.arm_upgrade(tRole)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_armSkill(self, rid, sid):
        """ 激活技能 """
        resp_f = 'armSkill'
        if not rid or not sid:
            return pack_msg(resp_f, 0)
        tRole = self.player.roles.roles.get(rid)
        rs, data = self.player.arm_skill(tRole, sid)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_skillBack(self, rid, type):
        """ 取回技能点 """
        resp_f = 'skillBack'
        if not rid or not type:
            return pack_msg(resp_f, 0)
        tRole = self.player.roles.roles.get(rid)
        rs, data = self.player.skill_back(tRole, type)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_eqStr(self, eid):
        """ 装备强化升级 """
        resp_f = 'eqStr'
        if not eid:
            return pack_msg(resp_f, 0)
        rs, data = self.player.equip_strong(eid)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_eqMove(self, rid, eid1, eid2):
        """ 装备强化转移 """
        resp_f = 'eqMove'
        if not eid1 or not eid2:
            return pack_msg(resp_f, 0)
        tRole = self.player.roles.roles.get(rid)
        rs, data = self.player.equip_move_level(tRole, eid1, eid2)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_chatSend(self, t, m, id=None, name=None):
        """ 玩家发聊天信息 """
        resp_f = 'chatSend'
        rs, data = self.player._game.chat_mgr.chat_send(self.player,
                                                        t,
                                                        m,
                                                        pid=id,
                                                        name=name)
        if rs:
            return pack_msg(resp_f, 1)
        return pack_msg(resp_f, 0, err=data)

    def rc_wearFt(self, id, rid, place):
        """ 穿命格 """
        resp_f = 'wearFt'
        role = self.player.roles.get_role(rid)
        fate, res_fate = self.player.bag.get_fate_ex(id)
        if not (place and fate and role):
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        rs, data = role.wear_fate(self.player, fate, res_fate, place)
        if rs:
            return pack_msg(resp_f, 1, data=dict(id=id, rid=rid))
        return pack_msg(resp_f, 0, err=data)

    def rc_tackOffFt(self, id, rid, place):
        """ 脱命格 """
        resp_f = 'tackOffFt'
        role = self.player.roles.get_role(rid)
        fate = self.player.bag.get_fate(id)
        if not (role and fate):
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        rs, data = role.take_off_fate(self.player, fate, place)
        if rs:
            return pack_msg(resp_f, 1, data=dict(uid=id))
        return pack_msg(resp_f, 0, err=data)

    def rc_mergeFt(self, id1, id2, rid=0):
        """ 命格合并 """
        resp_f = 'mergeFt'
        if not id1 or not id2:
            return pack_msg(resp_f, 0)
        rs, data = self.player.roles.merge_fate(id1, id2, rid)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_mergeAllFt(self):
        """ 命格一键合成"""
        resp_f = 'mergeAllFt'
        rs, data = self.player.roles.merge_all_fate()
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_sellAll(self, equip=None, item=None, fate=None, gem=None):
        """ 批量卖出 """
        resp_f = 'sellAll'
        rs, data = self.player.bag.sell_all(equip, item, fate, gem)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_invite(self, rid):
        """ 招募配将 """
        resp_f = 'invite'
        role, data = self.player.roles.invite(rid)
        if role == False:
            return pack_msg(resp_f, 0, err=data)
        d = role.data
        data['id'] = d.id
        data['rid'] = d.rid
        data['role'] = [role.to_dict()]

        #self.player.pub(MSG_ROLE_INVITE, d.rid, self.player)

        return pack_msg(resp_f, 1, data=data)

    def rc_roleLeave(self, rid):
        """ 离队 """
        resp_f = 'roleLeave'
        role = self.player.roles.get_role(rid)
        if role is None or role.is_main:
            return pack_msg(resp_f, 0, err=errcode.EC_ROLE_NOFOUND)
        role.leave()
        return pack_msg(resp_f, 1, data=dict(rid=role.data.id))

    def rc_roleReturn(self, rid):
        """ 归队 """
        resp_f = 'roleReturn'
        role = self.player.roles.get_role(rid)
        if role is None:
            return pack_msg(resp_f, 0, err=errcode.EC_ROLE_NOFOUND)
        if not self.player.roles.can_come_back():
            return pack_msg(resp_f, 0, err=errcode.EC_NO_RIGHT)
        role.come_back()
        return pack_msg(resp_f, 1, data=dict(rid=role.data.id))

    def rc_inviteState(self, rid):
        """ 获取招募条件状态 """
        #TODO: 获取招募条件状态

    def rc_enterHitFate(self):
        """ 进入猎命获取初始数据 """
        resp_f = 'enterHitFate'
        rs, data = self.player._game.hfate_mgr.enter_hit_fate(self.player)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0)

    def rc_hitFate(self, type, isBatch=0):
        """ 进行猎命 """
        resp_f = 'hitFate'
        rs, data = self.player._game.hfate_mgr.hit_fate(
            self.player, type, isBatch)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_enterFete(self):
        """ 进入祭天获取初始化数据 """
        resp_f = 'enterFete'
        data = self.player._game.fete_mgr.enter_fete(self.player)
        if data:
            return data

    def rc_fete(self, type):
        """ 进行祭天 """
        resp_f = 'fete'
        rs, data = self.player._game.fete_mgr.fete_ing(self.player, type)
        if rs:
            self.player.pub(MSG_FETE_NUM)
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_position(self):
        """ 获取阵型信息 """
        resp_f = 'position'
        return pack_msg(resp_f, 1, data=self.player.positions.to_dict())

    def rc_posStudy(self, pid):
        """ 学习阵型 """
        resp_f = 'posStudy'
        p = self.player.positions.study(pid)
        if p:
            return pack_msg(resp_f,
                            1,
                            data=dict(pid=p.data.id,
                                      coin1=self.player.data.coin1))
        else:
            return pack_msg(resp_f, 0)

    def rc_posUpgrade(self, pid):
        """ 升级阵型 """
        resp_f = 'posUpgrade'
        rs, err = self.player.positions.upgrade(pid)
        if rs:
            return pack_msg(resp_f, 1, data=dict(coin1=self.player.data.coin1))
        else:
            return pack_msg(resp_f, 0, err=err)

    def rc_posActive(self, pid):
        """ 激活阵型 """
        resp_f = 'posActive'
        rs = self.player.positions.active(pid)
        if rs:
            return pack_msg(resp_f, 1)
        else:
            return pack_msg(resp_f, 0)

    def rc_posSet(self, **kw):
        """ 设置阵型 """
        resp_f = 'posSet'
        id = kw['id']
        rs = self.player.positions.set(id, kw)
        if rs:
            return pack_msg(resp_f, 1)
        else:
            return pack_msg(resp_f, 0)

    def rc_startSit(self):
        """ 开始打坐 """
        resp_f = 'startSit'
        rs, data = self.player.sit.start_sit()
        if rs:
            return pack_msg(resp_f, 1)
        return pack_msg(resp_f, 0, err=data)

    def rc_stopSit(self):
        """ 停止打坐 """
        resp_f = 'stopSit'
        rs, data = self.player.sit.stop_sit()
        if rs:
            return pack_msg(resp_f, 1)
        return pack_msg(resp_f, 0, err=data)

    def rc_onlineSitExp(self):
        """ 上线获取打坐信息 """
        resp_f = 'onlineSitExp'
        rs, data = self.player.sit.online_sit()
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_mail(self):
        """ 获取邮件列表 """
        resp_f = 'mail'
        return pack_msg(resp_f, 1, data=self.player.mail.to_dict())

    def rc_mailReceive(self, id):
        """ 收取删除邮件 """
        resp_f = 'mailReceive'
        rs, msg = self.player.mail.receive(id)
        if rs:
            return pack_msg(resp_f, 1, data=msg)
        else:
            return pack_msg(resp_f, 0, err=msg)

    def rc_fishEnter(self):
        """ 进入钓鱼操作获取所有的鱼饵 """
        resp_f = 'fishEnter'
        rs, data = self.player._game.fish_mgr.fish_enter(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_fishUp(self, iid, num, qt=1):
        """ 一次(批量)起杆获得奖励 """
        resp_f = 'fishUp'
        rs, data = self.player._game.fish_mgr.fish_up(self.player, iid, num,
                                                      qt)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    #def rc_fishGiveup(self, iid, t):
    #    """ 放弃钓鱼 """
    #    resp_f = "fishGiveup"
    #    rs, data = self.player._game.fish_mgr.fish_give_up(self.player, iid, t)
    #    if not rs:
    #        return pack_msg(resp_f, 0, err = data)
    #    return pack_msg(resp_f, 1, data = data)

    def rc_foodEnter(self):
        resp_f = 'foodEnter'
        return pack_msg(resp_f,
                        1,
                        data=dict(bTime=self.player.buffs.delay_times))

    def rc_foodEat(self, id, t):
        """ 进食 """
        resp_f = 'foodEat'
        rs, err = self.player.buffs.eat(id, t)
        if not rs:
            return pack_msg(resp_f, 0, err=err)
        return pack_msg(resp_f, 1, data=err)

    def rc_buffDel(self, id):
        """ buff过期,删除buff """
        resp_f = 'buffDel'
        buff = self.player.buffs.get_buff(id)
        if not buff:
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        rs, err = self.player.buffs.del_buff(buff)
        if not rs:
            return pack_msg(resp_f, 0, err=err)
        return pack_msg(resp_f, 1)

    def rc_mineEnter(self):
        resp_f = "mineEnter"
        rs, data = self.player._game.mining_mgr.enter(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_mine(self, type, hit, isbatch, hit3=0, hit5=0):
        """ 请求采矿 """
        resp_f = "mine"
        hit = dict(hit2=hit, hit3=hit3, hit5=hit5)
        rs, data = self.player._game.mining_mgr.mining(self.player, type, hit,
                                                       isbatch)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_deepEnter(self, type):
        """ 进入深渊 """
        resp_f = 'deepEnter'
        rs, data = self.player._game.deep_mgr.enter(self.player, type)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_deepBox(self):
        resp_f = 'deepBox'
        rs, data = self.player._game.deep_mgr.open_box(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_deepFight(self, type):
        resp_f = 'deepFight'
        rs, data = self.player._game.deep_mgr.fight(self.player, type)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_deepAuto(self):
        """ 自动挂机 """
        resp_f = 'deepAuto'
        rs, data = self.player._game.deep_mgr.auto(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        wasteTimes = int(data)
        data = self.player.pack_msg_data(coin=True)
        return pack_msg(resp_f, 1, data=dict(data=data, wasteTimes=wasteTimes))

    def rc_shop(self, t=2):
        """ 神秘商店 """
        resp_f = 'shop'
        rs, data = self.player._game.shop_mgr.enter(self.player, t)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_shopBuy(self, t=2, sid=0):
        """ 神秘商店购买物品 """
        resp_f = 'shopBuy'
        rs, data = self.player._game.shop_mgr.buy(self.player, t, sid)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_dshopBuy(self, id=0, c=0):
        """可购买物品"""
        resp_f = 'dshopBuy'
        rs, data = self.player._game.shop_mgr.dshopBuy(self.player, id, c)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemShop(self):
        """珠宝商店"""
        resp_f = 'gemShop'
        rs, data = self.player._game.shop_mgr.gem_enter(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_resetShop(self):
        """ 重置神秘商店 """
        resp_f = "resetShop"
        rs, data = self.player._game.shop_mgr.resetShop(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_allyEnter(self):
        """ 玩家进入游戏的发送 """
        resp_f = "allyEnter"
        rs, data = self.player._game.rpc_ally_mgr.enter(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_fightReport(self, id):
        """ 获取战报 """
        resp_f = 'fightReport'
        rs, data = self.player._game.rpc_report_mgr.get_url(id)
        if rs:
            return pack_msg(resp_f, 1, data=dict(url=data))
        return pack_msg(resp_f, 0, err=data)

    def rc_rankEnter(self, t, p):
        """ 排行榜 """
        resp_f = 'rankEnter'
        pid = self.player.data.id
        level = self.player.data.level
        if hasattr(self.player.play_attr, 'CBE'):
            p_cbe = self.player.play_attr.CBE
        else:
            p_cbe = 0
        p_data = {'id': pid, 'level': level, 'CBE': p_cbe}
        rs, data = self.player._game.rpc_rank_mgr.enter(p_data, t, p)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_speedUp(self, mul):
        """vip战斗加速mul战斗的倍数"""
        resp_f = 'speedUp'
        rs, data = self.player.vip_attr.speed_up(mul)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_rewardTime(self):
        """ 领取登录时长的奖励 """
        resp_f = 'rewardTime'
        rs, data = self.player._game.reward_mgr2.reward_time(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        #return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 1)

    def rc_rewardActiveEnter(self):
        """ 活动奖励面板打开 """
        resp_f = 'rewardActiveEnter'
        rs, data = self.player._game.reward_mgr2.active_enter(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        #return pack_msg(resp_f, 1, data = data)
        return pack_msg(resp_f, 1)

    def rc_rewardActive(self, t, lv):
        """
        活动奖励的领取 t = 1 充值 2 = 武器升阶 3 = 招募 4 = 激活码奖励
        t=1对lv参数忽略
        """
        resp_f = 'rewardActive'
        rs, data = self.player._game.reward_mgr2.active_fetch(
            self.player, t, lv)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        #return pack_msg(resp_f, 1, data = data)
        return pack_msg(resp_f, 1)

    def rc_rewardCode(self, code):
        """ 兑换码领取 """
        resp_f = 'rewardCode'
        rs, data = self.player._game.reward_mgr2.reward_code(self.player, code)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_goodsList(self):
        """ 获取商品列表 """
        resp_f = 'goodsList'
        rs = self.player._game.rpc_vip_mgr.get_goods(self.player.user.sns_type)
        return pack_msg(resp_f, 1, data=rs)

    def rc_goodsBuy(self, t, gid):
        """ 购买商品 """
        log.debug('[rc_goodsBuy](%s)(%s, %s)', self.player.data.id, t, gid)
        resp_f = 'goodsBuy'
        rs, data = self.player._game.rpc_vip_mgr.buy_goods(
            t, gid, self.player.data.uid, self.player.data.id)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        gorder, price, good_id = data
        return pack_msg(resp_f,
                        1,
                        data=dict(gorder=gorder, price=price, gid=good_id))

    def rc_goodsPay(self, gorder, pid):
        """ 支付成功检查 """
        resp_f = 'goodsPay'
        #log.info('[rc_goodsPay](%s)(%s, %s)', self.player.data.id, gorder, pid)
        rs, data = SNSClient.pay(gorder,
                                 pid)  #, self.player._game.rpc_res_store)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)


#    def rc_goodsPay1(self, t, gid, torder):
#        resp_f = 'goodsPay1'
#        log.info('[rc_goodsPay1](%s, %s)', t, torder)
#        rs, data = self.player._game.rpc_vip_mgr.buy_goods(t, gid,
#            self.player.data.uid, self.player.data.id)
#        if not rs:
#            return pack_msg(resp_f, 0, err=data)
#        pre_pay, gorder, price, good_id = data
#        SNSClient.pay1(t, torder, pre_pay, self.player._game.rpc_res_store)
#        return pack_msg(resp_f, 1, data=data)

    def rc_TeamFight(self, tid):
        """组队战斗"""
        resp_f = 'TeamFight'
        if tid == 1000001 or tid == 1000002:
            data = self.test_rc_TeamFight(tid)
        else:
            data = self.player._game.rpc_team_mgr.get_fight_info(tid)
        if data is None:
            return pack_msg(resp_f, 0, err=errcode.EC_TEAM_NOT_FIND)
        return pack_msg(resp_f, 1, data=data)

    def test_rc_TeamFight(self, tid):
        if tid == 1000001:
            pid1, rid1_1, rid1_2 = 526, 1, 21
            pid2, rid2_1 = 700, 6
            pid3, rid3_1 = self.player.data.id, self.player.data.rid

            p1, p2 = self.player.load_player(pid1), self.player.load_player(
                pid2)
            info1, info2, eid1, eid2 = [], [], [], []
            if p1:
                info1 = p1.team_look([rid1_1, rid1_2])
                _, eid1 = p1.get_main_role_eid()
            if p2:
                info2 = p2.team_look([rid2_1])
                _, eid2 = p2.get_main_role_eid()

            info3 = self.player.team_look([self.player.data.rid])
            _, eid3 = self.player.get_main_role_eid()

            pos = {
                1: {
                    'pid': pid1,
                    'rid': rid1_1,
                    'eid': eid1
                },
                2: {
                    'pid': pid1,
                    'rid': rid1_2
                },
                4: {
                    'pid': pid2,
                    'rid': rid2_1,
                    'eid': eid2
                },
                7: {
                    'pid': pid3,
                    'rid': rid3_1,
                    'eid': eid3
                },
            }  #阵型信息 {index : {pid:0, rid:0} }
            return dict(players=[info1, info2, info3],
                        mb=pos,
                        lid=self.player.data.id)

        if tid == 1000002:
            pid1, rid1_1, rid1_2 = 2905, 1, 26
            pid2, rid2_1, rid2_2 = 3024, 1, 33
            pid3, rid3_1, rid3_2 = 2908, 1, 22

            p1, p2, p3 = self.player.load_player(
                pid1), self.player.load_player(pid2), self.player.load_player(
                    pid3)
            info1, info2, info3, eid1, eid2, eid3 = [], [], [], [], [], []
            if p1:
                info1 = p1.team_look([rid1_1, rid1_2])
                _, eid1 = p1.get_main_role_eid()
            if p2:
                info2 = p2.team_look([rid2_1, rid2_2])
                _, eid2 = p2.get_main_role_eid()
            if p3:
                info3 = p3.team_look([rid3_1, rid3_2])
                _, eid3 = p3.get_main_role_eid()

            pos = {
                1: {
                    'pid': pid1,
                    'rid': rid1_1,
                    'eid': eid1
                },
                2: {
                    'pid': pid1,
                    'rid': rid1_2
                },
                4: {
                    'pid': pid2,
                    'rid': rid2_1,
                    'eid': eid2
                },
                5: {
                    'pid': pid2,
                    'rid': rid2_2
                },
                7: {
                    'pid': pid3,
                    'rid': rid3_1,
                    'eid': eid3
                },
                8: {
                    'pid': pid3,
                    'rid': rid3_2
                },
            }  #阵型信息 {index : {pid:0, rid:0} }
            return dict(players=[info1, info2, info3],
                        mb=pos,
                        lid=self.player.data.id)

    def rc_TeamDisband(self, tid):
        """解散队伍"""
        resp_f = 'TeamDisband'
        rs, err = self.player._game.rpc_team_mgr.disband(tid)
        if not rs:
            return pack_msg(resp_f, 0, err=err)

    def rc_fightWin(self, fid):
        """主线战斗胜利"""
        resp_f = 'fightWin'
        data = self.player.fight_win(fid)
        if data:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=errcode.EC_FIGHT_WIN)

    def rc_achiEnter(self):
        """进入成就系统"""
        resp_f = 'achiEnter'
        data = self.player.achievement.to_dict()
        return pack_msg(resp_f, 1, data=data)

    def rc_achiUpdate(self):
        """更新成就"""
        resp_f = 'achiUpdate'
        data = self.player.achievement

    def rc_achiReward(self, id, t):
        """领取成就奖励"""
        resp_f = 'achiReward'
        rs, data = self.player.achievement.get_reward(id, t)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemInlay(self, eid, gid, index):
        """珠宝镶嵌"""
        resp_f = 'gemInlay'
        rs, data = self.player._game.gem_mgr.inlay(self.player, eid, gid,
                                                   index)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemRemove(self, eid, index):
        """珠宝移除"""
        resp_f = 'gemRemove'
        rs, data = self.player._game.gem_mgr.remove(self.player, eid, index)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemTransform(self, feid, teid):
        """珠宝转移"""
        resp_f = 'gemTransform'
        rs, data = self.player._game.gem_mgr.transform(self.player, feid, teid)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemMineEnter(self):
        """进入珠宝开采"""
        resp_f = 'gemMineEnter'
        data = self.player._game.gem_mgr.enter_mine(self.player)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemMine(self, t, n):
        """珠宝开采"""
        resp_f = 'gemMine'
        rs, data = self.player._game.gem_mgr.mine(self.player, t, n)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemSanding(self, stuff):
        """珠宝打磨"""
        resp_f = 'gemSanding'
        rs, data = self.player._game.gem_mgr.sanding(self.player, stuff)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemCalc(self, gid, stuff):
        """珠宝升级概率"""
        resp_f = 'gemCalc'
        rs, data = self.player._game.gem_mgr.calculate(self.player, gid, stuff)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=dict(succ=data))

    def rc_gemShop(self):
        """读取珠宝商店信息"""
        resp_f = 'gemShop'
        rs, data = self.player._game.shop_mgr.gem_enter(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemUpgrade(self, gid, stuff):
        """珠宝升级"""
        resp_f = 'gemUpgrade'
        rs, data = self.player._game.gem_mgr.upgrade(self.player, gid, stuff)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemShopBuy(self, sid):
        """珠宝商店购买"""
        resp_f = 'gemShopBuy'
        rs, data = self.player._game.shop_mgr.gem_buy(self.player, sid)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemShopAdd(self):
        """珠宝商店窗口增加"""
        resp_f = 'gemShopAdd'
        rs, data = self.player._game.shop_mgr.gem_add(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_gemShopReset(self):
        """珠宝商店重置"""
        resp_f = 'gemShopReset'
        rs, data = self.player._game.shop_mgr.gem_reset(self.player)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_ctreeEnter(self):
        """
        点击进入摇钱树,返回剩余次数
        """
        resp_f = 'ctreeEnter'
        ctree_mgr = self.player._game.ctree_mgr
        rs, data = ctree_mgr.enter(self.player)
        # import logging
        # LG = logging.getLogger()
        # LG.info(str(rs) + ' ---peng--- ' + str(data))
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_ctreeExchange(self):
        """
        处理兑换过程,要用真无宝
        """
        resp_f = 'ctreeExchange'
        ctree_mgr = self.player._game.ctree_mgr
        rs, data = ctree_mgr.exchange(self.player)
        # import logging
        # LG = logging.getLogger()
        # LG.info(str(rs) + ' ---peng--- ' + str(data))
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1, data=data)

    def rc_roleUpEnter(self):
        """ 进入武将升段 """
        resp_f = 'roleUpEnter'
        rs, data = self.player.roles.role_up_enter()
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_roleUpDo(self, rid):
        """ 武将升段 """
        resp_f = 'roleUpDo'
        role = self.player.roles.rid2roles.get(rid)
        if not role:
            return False, errcode.EC_ROLE_NOFOUND
        rs, data = role.role_up_do()
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_roleUpTrain(self, rid, type):
        """ 武将培养 """
        resp_f = 'roleUpTrain'
        rs, data = self.player.roles.role_train_do(rid, type)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_roleUpTrainOk(self, rid):
        """ 武将培养保存 """
        resp_f = 'roleUpTrainOk'
        rs, data = self.player.roles.role_train_ok(rid)
        if rs:
            return pack_msg(resp_f, 1, data=data)
        return pack_msg(resp_f, 0, err=data)

    def rc_changeName(self, n=None):
        """
        玩家改名
        """
        resp_f = 'changeName'
        name = n.strip()
        querys = dict(name=name)
        if not name:
            return pack_msg(resp_f, 0, err=errcode.EC_VALUE)
        _game = self.player._game
        if _game.rpc_player_mgr.get_id_by_name(name):
            return pack_msg(resp_f, 0, err=errcode.EC_NAME_REPEAT)
        if _game.rpc_store.query_loads(TN_PLAYER, querys=querys):
            return pack_msg(resp_f, 0, err=errcode.EC_NAME_REPEAT)
        #敏感词
        if _game.rpc_ban_word_mgr.check_ban_word(name):
            #if _game.setting_mgr.check_ban_word(name):
            return pack_msg(resp_f, 0, err=errcode.EC_FORBID_STRING)
        name = name[:50]
        log.info(u'pid(%s)原名(%s)改为(%s)', self.player.data.id,
                 self.player.data.name, name)
        self.player.data.name = name
        self.player.save(full=False)
        rs, data = _game.rpc_player_mgr.change_name(self.player.data.id, name,
                                                    self.player.data.rid)
        if not rs:
            return pack_msg(resp_f, 0, err=data)
        return pack_msg(resp_f, 1)
示例#16
0
 def __init__(self):
     if 0:
         from game.player import player as player_md
         self.player = player_md.Player()
         self.rpc = ClientRpc()
     raise NotImplementedError