local skynet = require "skynet" local oo = require "Class" local json =require "json" local log = require "Log" local dataType = require "DataType" local redisKeyUrl = require "RedisKeyUrl" local pb = require "pb" local serverId = tonumber(skynet.getenv "serverId") local Player = oo.class() Player.maxLevelLimt = 85 --初始化玩家数据 function Player:ctor( userId , playerData) self.userId = userId self.account = playerData.basicInfo.accountName self.basicInfo = playerData.basicInfo self.gameData = playerData.gameData local nowTime = skynet.GetTime() --生成临时数据 self.tmpData = {} self.tmpData.lastUpgradeTime = 0 --上一次升级时间 self.tmpData.cacheExp = 0 --缓存经验 self.tmpData.partner = {} self.tmpData.partner.alreadyQueryUser = {} --已经查询的玩家 self.tmpData.group = {} self.tmpData.group.alreadyQueryList = {} --已经查询的家园列表 self.tmpData.intoTime = nowTime self.tmpData.lastOnlineTime = nowTime --上一次在线时间 self.tmpData.sendStorePackIds = {} --记录商城发奖表现失败的数据 self.tmpData.msgHistory = {} --消息历史 self.tmpData.officialPayDatas = {} --记录官网充值处理失败的数据{用于客户端提示} self.tmpData.saveLevel = dataType.SaveLevel_No --保存级别 self.tmpData.unUsedGoods = {} --未使用的物品缓存 end --添加所有未使用的物品缓存 function Player:AddAllUnUsedGoods( goodsType , goodsInfo ) if not self.tmpData.unUsedGoods[ goodsType ] then self.tmpData.unUsedGoods[ goodsType ] = {} end self.tmpData.unUsedGoods[ goodsType ].goodsInfo = goodsInfo end --获取所有未使用的物品缓存 function Player:GetAllUnUsedGoods( goodsType , goodsInfo ) if not self.tmpData.unUsedGoods[ goodsType ] or not self.tmpData.unUsedGoods[ goodsType ].goodsInfo then return nil end return self.tmpData.unUsedGoods[ goodsType ].goodsInfo end --重置所有未使用的物品缓存 function Player:ResetAllUnUsedGoods() self.tmpData.unUsedGoods = {} end --增加未使用的物品缓存 function Player:AddOneUnUsedGoods( goodsType , goodsId , count ) if not self.tmpData.unUsedGoods[ goodsType ] or not self.tmpData.unUsedGoods[ goodsType ].goodsInfo then return nil end local goodsInfo = self.tmpData.unUsedGoods[ goodsType ].goodsInfo local isExist = false for k, v in pairs( goodsInfo ) do if goodsType == v.type and goodsId == v.id then goodsInfo[ k ].count = goodsInfo[ k ].count + count isExist = true break end end if not isExist then local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( self , "Furniture" , goodsId ) if cfgFurniture.shopType ~= skynet.server.doubleSpace.ShopTypeNo then --双人空间的家具不能计算在里面 table.insert( goodsInfo , { type = goodsType , id = goodsId , count = count , gainTime = skynet.GetTime() }) end end end --移除一个未使用的物品缓存 function Player:RemoveOneUnUsedGoods( goodsType , goodsId , count ) if not self.tmpData.unUsedGoods[ goodsType ] or not self.tmpData.unUsedGoods[ goodsType ].goodsInfo then return nil end local goodsInfo = self.tmpData.unUsedGoods[ goodsType ].goodsInfo for k, v in pairs( goodsInfo ) do if goodsType == v.type and goodsId == v.id then goodsInfo[ k ].count = goodsInfo[ k ].count - count if goodsInfo[ k ].count <= 0 then table.remove( goodsInfo , k) end break end end end --添加消息历史 function Player:AddMsgHistory( cmd , nowTime ) --如果没有该命令的消息历史,或者距离上次发送时间超过3秒,则更新时间 if not self.tmpData.msgHistory[ cmd ] then self.tmpData.msgHistory[ cmd ] = {} self.tmpData.msgHistory[ cmd ].nowTime = nowTime self.tmpData.msgHistory[ cmd ].isInit = true end local msgHistory = self.tmpData.msgHistory[ cmd ] if nowTime - msgHistory.nowTime > 3 then msgHistory.nowTime = nowTime msgHistory.isInit = true end end --是否消息过快 function Player:IsMsgTooFast( cmd ) --存在命令,并且距离上次发送时间小于等于3秒,就表示消息过快 local msgHistory = self.tmpData.msgHistory[ cmd ] if msgHistory.isInit then msgHistory.isInit = false return false end if not msgHistory.isInit and skynet.GetTime() - msgHistory.nowTime <= 3 then return true end return false end --内部包数据,线上不能用 function Player:InnerData( player ) for i = 1, 80, 1 do player:AddExpCount( 10000 , true , true ) end player.gameData.coin = 100000 player.gameData.clovers = 100000 player.gameData.volute = 100000 local data = { commandField={ [1]={ articlesNumber=5, articlesType="Furniture", }, [2]={ articlesNumber=1, articlesType="Decoration", }, [3]={ articlesNumber=1, articlesType="Clothes", }, [4]={ articlesNumber=1, articlesType="PetClothes", }, [5]={ articlesNumber=1, articlesType="Flowerpot", }, }, cmdType=true, } skynet.server.gm:WebGoods(player , data ) --[[ local needLevel = 60 local level = player.gameData.level for i = 1, needLevel - level, 1 do player:AddExpCount(100000, true, true) end local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "LevelTask") --任务配置 for k, v in pairs( cfgTask ) do if not player.gameData.levelTask[ v.id ] then --and (44 == v.id or 46 == v.id) then player.gameData.levelTask[ v.id ] = {} player.gameData.levelTask[ v.id ].id = v.id player.gameData.levelTask[ v.id ].type = v.taskType --任务类型 player.gameData.levelTask[ v.id ].target = v.taskTarget --任务目标 player.gameData.levelTask[ v.id ].progress =v.value --当前进度 player.gameData.levelTask[ v.id ].status =2 --是否完成 player.gameData.levelTask[ v.id ].historyId = {} else player.gameData.levelTask[ v.id ].progress =v.value --当前进度 player.gameData.levelTask[ v.id ].status =2 --是否完成 end end local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "DailyTask") --任务配置 for k, v in pairs( player.gameData.dailyTask.item ) do v.progress = 100 v.status = 2 end local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "AchievementTask") --任务配置 local achieveTask = player.gameData.achieveTask for k, v in pairs( cfgTask ) do if not achieveTask[ v.id ] then achieveTask[ v.id ] = {} achieveTask[ v.id ].id = v.id achieveTask[ v.id ].order = v.order achieveTask[ v.id ].type = v.taskType --任务类型 achieveTask[ v.id ].progress =v.value --当前进度 achieveTask[ v.id ].status =2 --是否完成 else achieveTask[ v.id ].progress =v.value --当前进度 achieveTask[ v.id ].status =2 --是否完成 end end --NPC任务 local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCTask") --任务配置 for k, v in pairs( cfgTask ) do if not player.gameData.npcTask[ v.id ] then player.gameData.npcTask[ v.id ] = {} player.gameData.npcTask[ v.id ].id = v.id player.gameData.npcTask[ v.id ].type = v.taskType --任务类型 player.gameData.npcTask[ v.id ].target = v.seedId --任务目标 player.gameData.npcTask[ v.id ].progress =v.value --当前进度 player.gameData.npcTask[ v.id ].status =2 --是否完成 player.gameData.npcTask[ v.id ].historyId = {} else player.gameData.npcTask[ v.id ].progress =v.value --当前进度 player.gameData.npcTask[ v.id ].status =2 --是否完成 end end --图鉴 local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture" ) for k, v in pairs( cfgAllFurniture ) do skynet.server.illustration:Add( player , dataType.GoodsType_Furniture , v.id ) end local cfgAllDecoration = skynet.server.gameConfig:GetPlayerAllCfg( player , "Decoration" ) for k, v in pairs( cfgAllDecoration ) do skynet.server.illustration:Add( player , dataType.GoodsType_Decorate , v.id ) end local cfgAllClothes = skynet.server.gameConfig:GetPlayerAllCfg( player , "Clothes" ) for k, v in pairs( cfgAllClothes ) do skynet.server.illustration:Add( player , dataType.GoodsType_Clothes , v.id ) end local cfgAllPetClothes = skynet.server.gameConfig:GetPlayerAllCfg( player , "PetClothes" ) for k, v in pairs( cfgAllPetClothes ) do skynet.server.illustration:Add( player , dataType.GoodsType_PetClothes , v.id ) end local cfgAllPlant = skynet.server.gameConfig:GetPlayerAllCfg( player , "Plant" ) for k, v in pairs( cfgAllPlant ) do skynet.server.illustration:Add( player , dataType.GoodsType_Plant , v.id ) end ]] end --初始化没有的数据 function Player:InitNoData( player ) if player.gameData.passCheck and player.gameData.passCheck[ 73 ] and not player.gameData.passCheck[ 73 ].historyId then player.gameData.passCheck[ 73 ].historyId = {} end if skynet.server.house:IsBuyHouse( player , 11 ) then skynet.server.levelTask:Modify( player , 3 , 1 ) skynet.server.taskListEvent:Modify( player , 3 , 1 ) end local cfgAllTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "LevelTask") local levelTask = player.gameData.levelTask for k, v in pairs( cfgAllTask ) do if levelTask[ v.id ] and not levelTask[ v.id ].historyId then levelTask[ v.id ].historyId = {} end end local cfgAllTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCTask") --任务配置 local npcTask = player.gameData.npcTask for k, v in pairs( cfgAllTask ) do if npcTask[ v.id ] and not npcTask[ v.id ].historyId then npcTask[ v.id ].historyId = {} end end if player.gameData.shop[ dataType.ShopType_Cuisine ] then if 3 == player.gameData.shop[ dataType.ShopType_Cuisine ].menuLevel then if npcTask[13] and npcTask[13].progress < 3 then player.gameData.npcTask[13].progress = 0 skynet.server.npcTask:Modify( player , 96 , 3 ) skynet.server.taskListEvent:Modify( player , 96 , 3 ) end elseif 4 == player.gameData.shop[ dataType.ShopType_Cuisine ].menuLevel then if npcTask[19] and player.gameData.npcTask[19].progress < 4 then player.gameData.npcTask[19].progress = 0 skynet.server.npcTask:Modify( player , 96 , 4 ) skynet.server.taskListEvent:Modify( player , 96 , 4 ) end end end if player.gameData.shop[dataType.ShopType_PetShop] then local petShop = player.gameData.shop[dataType.ShopType_PetShop] if npcTask[17] and player.gameData.npcTask[17].progress >= 1 and player.gameData.npcTask[17].status == skynet.server.task.TaskStatus_NoComplete or petShop.petStudy[3].studyLvl >= 3 and player.gameData.npcTask[17].status == skynet.server.task.TaskStatus_NoComplete then skynet.server.npcTask:Modify(player, 109, 1) skynet.server.taskListEvent:Modify( player ,109, 1) elseif npcTask[20] and player.gameData.npcTask[20].progress >= 1 and player.gameData.npcTask[20].status == skynet.server.task.TaskStatus_NoComplete or petShop.petStudy[1].studyLvl >= 3 and player.gameData.npcTask[20].status == skynet.server.task.TaskStatus_NoComplete then skynet.server.npcTask:Modify(player, 107, 1) skynet.server.taskListEvent:Modify( player ,107, 1) elseif npcTask[25] and player.gameData.npcTask[25].progress >= 1 and player.gameData.npcTask[25].status == skynet.server.task.TaskStatus_NoComplete or petShop.petStudy[2].studyLvl >= 3 and player.gameData.npcTask[25].status == skynet.server.task.TaskStatus_NoComplete then skynet.server.npcTask:Modify(player, 108, 1) skynet.server.taskListEvent:Modify( player ,108, 1) end end local cfgNPCTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCTask") local npcTask = player.gameData.npcTask for k, v in pairs( cfgNPCTask ) do if npcTask[ v.id ] and not npcTask[ v.id ].historyId then npcTask[ v.id ].historyId = {} end end if not self.gameData.upTime then self.gameData.upTime = skynet.GetTime() end local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") -- 刷新玩家资料书购买次数 if not self.gameData.shop[dataType.ShopType_PetShop] and self.gameData.petShopRefresh == nil or not self.gameData.shop[dataType.ShopType_PetShop] and self.gameData.petShopRefresh == 1 then self.gameData.petShopRefresh = 2 elseif self.gameData.shop[dataType.ShopType_PetShop] and self.gameData.petShopRefresh == nil or self.gameData.shop[dataType.ShopType_PetShop] and self.gameData.petShopRefresh == 1 then self.gameData.petShopRefresh = 2 for k ,v in pairs(self.gameData.shop[dataType.ShopType_PetShop].petShopGoodInfo ) do if next(petStore[v.id].packLimit) ~= nil and petStore[v.id].packLimit[1] == 1 then v.buyTimes = 0 skynet.server.msgTips:Add(self, 84) elseif next(petStore[v.id].packLimit) ~= nil and petStore[v.id].packLimit[1] == 2 then v.buyTimes = 0 skynet.server.msgTips:Add(self, 84) end end end local curShop = self.gameData.shop[ dataType.ShopType_Coffee ] if curShop and not curShop.noNewCoffeeCount then curShop.noNewCoffeeCount = 0 --未抽到新咖啡的数量 end if self.gameData.level >= 10 and not self:IsUnlockSystem(dataType.UnlockSystem_ActivityCarnival) then self:AddUnlockSystem(dataType.UnlockSystem_ActivityCarnival) end local isHaveGoods = player:IsBuyGoods(dataType.GoodsType_Decorate, 262) --是否拥有 if not isHaveGoods then skynet.server.bag:AddGoods( self , dataType.GoodsType_Decorate , 262 , 1) end --检查下后面加的活动是否能解锁 local cfgAllActivity = skynet.server.gameConfig:GetPlayerAllCfg( self , "Activity") for k , v in pairs(cfgAllActivity) do if dataType.ActivityType_DecoWeek == v.activityType and self.gameData.level >= v.level then --装修周 self:AddUnlockSystem( dataType.UnlockSystem_ActivityDecoWeek ) elseif dataType.ActivityType_DreamLife == v.activityType and self.gameData.level >= v.level then --若来向往一日 self:AddUnlockSystem( dataType.UnlockSystem_ActivityDreamLife ) elseif dataType.ActivityType_FlipCard == v.activityType and self.gameData.level >= v.level then --翻翻乐 self:AddUnlockSystem( dataType.UnlockSystem_ActivityFlipCard ) elseif dataType.ActivityType_Puzzle == v.activityType and self.gameData.level >= v.level then --拼图 self:AddUnlockSystem( dataType.UnlockSystem_ActivityPuzzle ) elseif dataType.ActivityType_MatchStuff == v.activityType and self.gameData.level >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityMatchStuff ) elseif dataType.ActivityType_SignPack == v.activityType and self.gameData.level >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivitySignPack ) elseif dataType.ActivityType_SeekTreasure == v.activityType and self.gameData.level >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivitySeekTreasure ) elseif dataType.ActivityType_ActivityLevelPack == v.activityType and self.gameData.level >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityLevelPack ) elseif dataType.ActivityType_ActivityStagePack == v.activityType and self.gameData.level >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityStagePack ) elseif dataType.ActivityType_DailyRiddle == v.activityType and self.gameData.level >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityDailyRiddle ) elseif dataType.ActivityType_SavingPot == v.activityType and self.gameData.level >= v.level then --存钱罐 self:AddUnlockSystem(dataType.UnlockSystem_ActivitySavingPot) elseif dataType.ActivityType_ActivityReplicaStore == v.activityType and self.gameData.level >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityReplicaStore ) elseif dataType.ActivityType_BindBox == v.activityType and self.gameData.level >= v.level then --盲盒 self:AddUnlockSystem(dataType.UnlockSystem_ActivityBindBox) end end --检查园艺铺子是否有新配置 local cfgGarden = skynet.server.gameConfig:GetPlayerAllCfg( self , "Garden") --园艺铺子配置 for k, v in pairs( cfgGarden ) do local count = v.id if not self.gameData.todayGain.gardenInfo[ count ] then self.gameData.todayGain.gardenInfo[count] = {} self.gameData.todayGain.gardenInfo[count].id = count -- 奖励id self.gameData.todayGain.gardenInfo[count].dailyLimit = {v.dailyLimit, 0} -- 兑换限制 例如 {3,1} 3 本日可兑换次数 1 本日已兑换次数 self.gameData.todayGain.gardenInfo[count].contributeValue = v.contributeValue -- 贡献币需求兑换数 self.gameData.todayGain.gardenInfo[count].communityShop = v.communityShop -- 园艺铺子类别 self.gameData.todayGain.gardenInfo[count].unlock = false -- 园艺铺子家具是否解锁 end end if self.gameData.level >= 19 and self.gameData.shop[ dataType.ShopType_GardenShop ] then --没有展示历史,就加一个 local houseRent = player.gameData.houseRent -- 兼容老数据 if not houseRent.showShortHistory then --黄玉平没做保底,所以玩家没有该数据,这里给老玩家加上 houseRent.showShortHistory = {} houseRent.showLongHistory = {} end for k, v in pairs( houseRent.houseInfo ) do if v.houseId then --有些玩家数据,被黄玉平搞成了houseId,这里发现再变回id v.id = v.houseId v.houseId = nil end end end --料理店兼容老玩家数据 if self.gameData.shop[ dataType.ShopType_Cuisine ] and next(self.gameData.shop[ dataType.ShopType_Cuisine ]) ~= nil then if self.gameData.shop[ dataType.ShopType_Cuisine ].mealInfos[1].difficulty == nil then --玩家菜单相关数据赋值 local difficulty = 1 local count = 1 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") --套餐数据 self.gameData.shop[ dataType.ShopType_Cuisine ].mealInfos = {} for k ,v in pairs(cfgSValue.foodShopSetDifficultyNum) do for k1=1,v,1 do self.gameData.shop[ dataType.ShopType_Cuisine ].mealInfos[ count ] = {} self.gameData.shop[ dataType.ShopType_Cuisine ].mealInfos[ count ].id = count --套餐索引 self.gameData.shop[ dataType.ShopType_Cuisine ].mealInfos[ count ].difficulty = difficulty --套餐难度 self.gameData.shop[ dataType.ShopType_Cuisine ].mealInfos[ count ].status = 0 --套餐状态 0 未开启该套餐 1 未完成 2 可以完成 3 已完成 默认未开启该套餐 self.gameData.shop[ dataType.ShopType_Cuisine ].mealInfos[ count ].cuisineInclude = {} --套餐完成包含的菜品 count = count + 1 end difficulty = difficulty + 1 end for k ,v in pairs(self.gameData.shop[ dataType.ShopType_Cuisine ].cuisineInfos) do v.setChoiceCount = 0 end end if self.gameData.shop[ dataType.ShopType_Cuisine ].plotInfos[1].startPlantTime == nil then for i=1,5,1 do self.gameData.shop[ dataType.ShopType_Cuisine ].plotInfos[ i ] = {} self.gameData.shop[ dataType.ShopType_Cuisine ].plotInfos[ i ].id = i --菜地id self.gameData.shop[ dataType.ShopType_Cuisine ].plotInfos[ i ].status = 0 --菜地状态 0未解锁 1未种植 2幼苗 3初枝 4成枝 5成熟 默认未种植 self.gameData.shop[ dataType.ShopType_Cuisine ].plotInfos[ i ].matId = 0 --植物id 初始为0 self.gameData.shop[ dataType.ShopType_Cuisine ].plotInfos[ i ].nextStatusTime = 0 --下个植物状态的时间戳 self.gameData.shop[ dataType.ShopType_Cuisine ].plotInfos[ i ].startPlantTime = 0 --开始种植的时间戳 end end end --设计空间兼容老玩家数据 if self.gameData.design and self.gameData.design.timeCardPoolInfo.id and self.gameData.design.timeCardPoolInfo.last10FurCount == nil then self.gameData.design.timeCardPoolInfo.last10FurCount = 0 self.gameData.design.timeCardPoolInfo.design10Count = 0 end if not self.gameData.design.timeCardPoints then self.gameData.design.timeCardPoints = {} end --审核玩家初始通行证 if self:IsAudit() then self:AddUnlockSystem( dataType.UnlockSystem_PassCheck ) end --兼容老玩家商城积分数据 if self.gameData.storePack then local cfgAll = skynet.server.gameConfig:GetPlayerAllCfg( self , "ValueAccumulate" ) --玩家当前的积分挡位小于配置的积分挡位 if #self.gameData.storePack.pointsInfo < #cfgAll then local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue" ) for k ,v in pairs(cfgAll) do if k > #self.gameData.storePack.pointsInfo then self.gameData.storePack.pointsInfo[ k ] = {} self.gameData.storePack.pointsInfo[ k ].id = v.id self.gameData.storePack.pointsInfo[ k ].isGet = 0 --默认不可领取 end if self.gameData.storePack.rechargeAmount * cfgSValue.valueAccumulatePoint >= v.point and self.gameData.storePack.pointsInfo[ k ].isGet == 0 then self.gameData.storePack.pointsInfo[k].isGet = 1 --修改为可以领取 skynet.server.msgTips:AddNoNotice(self , 49) --同时添加对应红点 end end end end --充值问题 local payAccount = skynet.server.redis:zscore(redisKeyUrl.PayServerAllPlayerPayAccountZSet,self.account) if payAccount then local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue" ) --商城积分修改 self.gameData.storePack.rechargeAmount = payAccount --限时累充积分修改 if next(player.gameData.design.timeCardPoolInfo) ~= nil then for k , v in pairs(player.gameData.design.timeCardPoints) do if v.raffleId == 48 then v.points = payAccount * cfgSValue.valueAccumulatePoint end end end --移除对应数据 skynet.server.redis:zrem(redisKeyUrl.PayServerAllPlayerPayAccountZSet,self.account) end if self.gameData.storePack then local cfgAll = skynet.server.gameConfig:GetPlayerAllCfg( self , "ValueAccumulate" ) --判断是否需要修改玩家对应奖励状态 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue" ) for k ,v in pairs(cfgAll) do if player.gameData.storePack.rechargeAmount * cfgSValue.valueAccumulatePoint >= v.point and player.gameData.storePack.pointsInfo[k].isGet == 0 then player.gameData.storePack.pointsInfo[k].isGet = 1 --修改为可以领取 skynet.server.msgTips:AddNoNotice(player , 49) --同时添加对应红点 end end --限时累充积分修改 if next(player.gameData.design.timeCardPoolInfo) ~= nil then for k , v in pairs(player.gameData.design.timeCardPoints) do if v.raffleId == 48 then --判断积分是否达到可以领取对应的积分奖励 local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , k ) for k1 ,v1 in pairs(cfgLimitedAccum.value) do if v.points >= v1 and v.pointsInfo[k1].isGet == 0 then v.pointsInfo[k1].isGet = 1 --修改为可以领取 skynet.server.msgTips:AddNoNotice(player , 94) --同时添加对应红点 end end end end end end --如果已经购买了,并且未解锁家园,就解锁一下 if not self:GetSwitch( dataType.SwitchType_GainGarden ) and skynet.server.house:IsBuyHouse( self , 11) then self:SetSwitch( dataType.SwitchType_GainGarden , true ) end --个人物品获取时间兼容 if self.gameData.personal.gainGoodsInfo == nil then self.gameData.personal.gainGoodsInfo = {} --之前获取的物品获取时间设置为当前时间 for k , v in pairs(self.gameData.personal.ownHeadIds) do table.insert(self.gameData.personal.gainGoodsInfo , {type = dataType.GoodsType_HeadAndHeadFrame , id = v , count = 1 , gainTime = skynet.GetTime()}) end for k , v in pairs(self.gameData.personal.ownHeadFrameIds) do table.insert(self.gameData.personal.gainGoodsInfo , {type = dataType.GoodsType_HeadAndHeadFrame , id = v , count = 1 , gainTime = skynet.GetTime()}) end end local curShop = player.gameData.shop[ dataType.ShopType_GardenShop ] if curShop and not curShop.specialGoods then player.gameData.shop[ dataType.ShopType_GardenShop ].specialGoods = {} player.gameData.shop[ dataType.ShopType_GardenShop ].generalGoods = {} player.gameData.shop[ dataType.ShopType_GardenShop ].nextRefreshTime = 0 end --人物新增服饰 local clothesData = player.gameData.personal.clothesData if clothesData and not clothesData[ dataType.ClothesType_Earrings ] then clothesData[ dataType.ClothesType_Earrings ] = 0 clothesData[ dataType.ClothesType_Facing ] = 0 end --宠物新增面饰 local petType = skynet.server.pet.PetType_Cat local petInfo =player.gameData.pet [ petType ] if petInfo and not petInfo.facingId then petInfo.facingId= 0 end --同步图鉴新增的积分和花园图鉴信息 if player.gameData.illustration.pointInfo == nil or next(player.gameData.illustration.pointInfo) == nil then skynet.server.illustration:AsycGardenIllstration(self) if player.gameData.illustration.awardInfo ~= nil and next(player.gameData.illustration.awardInfo) ~= nil then skynet.server.illustration:AsycPointReward(self) end end --修复旧账号扭蛋图鉴功能bug if not player.gameData.illustration.fixGashapon then skynet.server.illustration:FixGashaponData(self) end --兼容之前的功能,防止exp 小于 0 if self.gameData.exp < 0 then self.gameData.exp = 0 end --修复扭蛋图鉴红点问题 --if not player:GetSwitch( dataType.SwitchType_IllustrationRedDot ) then skynet.server.illustration:FixGashaponRedDot(self) --player:SetSwitch( dataType.SwitchType_IllustrationRedDot , true ) --end --修复兑换码扩容游标问题 if not player:GetSwitch( dataType.SwitchType_RedeemCursor ) then skynet.server.redeem:FixRedeemCursor(self) player:SetSwitch( dataType.SwitchType_RedeemCursor , true ) end --修复125,126任务 由于先增加了等级到80级,后有的成就任务,导致一些玩家80级了就无法再解锁该任务。 skynet.server.achieveTask:RepairTaskType125And126( self ) --125号流泉枫植物图鉴是后面加的,玩家可能存在该植物,如果有就点亮一下图鉴 if not player:GetSwitch( dataType.SwitchType_IsCheck125PlantIllustration ) then local plantId = 125 --流泉枫植物ID local plantCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Plant , plantId ) if plantCount > 0 then --如果存在该植物,就点亮一下图鉴 local isAchieve,illustrationId = skynet.server.illustration:IsNewAchieve( player , skynet.server.illustration.IllustrationType_Plant ) if isAchieve then --有点亮,就加个红点 local msgId = 18 skynet.server.msgTips:Reset( player, msgId ) skynet.server.msgTips:Add( player , msgId ) end end player:SetSwitch( dataType.SwitchType_IsCheck125PlantIllustration , true ) end --修复1.5版本310~368的商店ID if not self:GetSwitch( dataType.SwitchType_Repair310To368StoreId ) then if self.gameData.level >= 6 then local storePackInfo = self.gameData.storePack.storePackInfo for k , v in pairs( storePackInfo ) do local storeId = v.storeId if storeId and storeId >= 310 and storeId <= 368 then storePackInfo[ k ] = nil end end end self:SetSwitch( dataType.SwitchType_Repair310To368StoreId , true ) end --124号舒享喵浴套装图鉴是后面加的,玩家可能存在该植物,如果有就点亮一下图鉴 if not player:GetSwitch( dataType.SwitchType_IsCheck124PetIllustration ) then local clothesId1 = 85 --秋浴猫束带ID local clothesId2 = 86 --泡泡浴花ID local clothesId3 = 87 --猫猫浴袍ID local clothesCount1 = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_PetClothes , clothesId1 ) local clothesCount2 = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_PetClothes , clothesId2 ) local clothesCount3 = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_PetClothes , clothesId3 ) if clothesCount1 > 0 or clothesCount2 > 0 or clothesCount3 > 0 then --如果存在该植物,就点亮一下图鉴 local isAchieve,illustrationId = skynet.server. illustration:IsNewAchieve( player , skynet.server.illustration.IllustrationType_PetClothes ) if isAchieve then --有点亮,就加个红点 local msgId = 118 skynet.server.msgTips:Reset( player, msgId ) skynet.server.msgTips:Add( player , msgId ) end end player:SetSwitch( dataType.SwitchType_IsCheck124PetIllustration , true ) end end --测试账号 function Player:InitTestAccount( isFirstInit ) --[[ testWeekA1 ~ testWeekA50 充值金额为30元、上周累积游戏时长400分钟、投稿交互次数40次 testWeekB1 ~ testWeekB50 充值金额为30元、上周累积游戏时长400分钟 testWeekC1 ~ testWeekC50 充值金额为30元、投稿交互次数40次 testWeekD1 ~ testWeekD50 上周累积游戏时长400分钟、投稿交互次数40次 testWeekE1 ~ testWeekE50 充值金额为30元 testWeekF1 ~ testWeekF50 上周累积游戏时长400分钟 testWeekG1 ~ testWeekG50 投稿交互次数40次 testWeekH1 ~ testWeekH50 都是0 ]] local account = self.basicInfo.accountName account = string.lower(account) local partnerId = self.gameData.partner.id local isTest = false if string.find( account , "testweeka") then --充值金额为30元、上周累积游戏时长400分钟、投稿交互次数40次 skynet.server.personal:SetDetail( partnerId , "rechargeAmount" , 30 , "lastWeekGameTime" , 400 * 60 , "decoWeekOpenShowCount" , 40 ) isTest = true elseif string.find( account , "testweekb") then --充值金额为30元、上周累积游戏时长400分钟 skynet.server.personal:SetDetail( partnerId , "rechargeAmount" , 30 , "lastWeekGameTime" , 400 * 60) isTest = true elseif string.find( account , "testweekc") then --充值金额为30元、投稿交互次数40次 skynet.server.personal:SetDetail( partnerId , "rechargeAmount" , 30 , "decoWeekOpenShowCount" , 40 ) isTest = true elseif string.find( account , "testweekd") then --上周累积游戏时长400分钟、投稿交互次数40次 skynet.server.personal:SetDetail( partnerId , "lastWeekGameTime" , 400 * 60 , "decoWeekOpenShowCount" , 40 ) isTest = true elseif string.find( account , "testweeke") then --充值金额为30元 skynet.server.personal:SetDetail( partnerId , "rechargeAmount" , 30 ) isTest = true elseif string.find( account , "testweekf") then --上周累积游戏时长400分钟 skynet.server.personal:SetDetail( partnerId , "lastWeekGameTime" , 400 * 60 ) isTest = true elseif string.find( account , "testweekg") then --投稿交互次数40次 skynet.server.personal:SetDetail( partnerId , "decoWeekOpenShowCount" , 40 ) isTest = true elseif string.find( account , "testweekh") then --都是0 skynet.server.personal:SetDetail( partnerId , "rechargeAmount" , 0 , "lastWeekGameTime" , 0 , "decoWeekOpenShowCount" , 0 ) isTest = true end --测试号直接升级 if isTest and isFirstInit then for i = 1, 20, 1 do self:AddExpCount( 10000 , true , true ) end end end --初始化没有的Redis数据 function Player:InitNoRedisData( player , curDetail ) local myPartnerId = player.gameData.partner.id if not curDetail.rechargeAmount then --V3版周赛需要的兼容数据 skynet.server.personal:SetDetail( myPartnerId , "rechargeAmount", player.gameData.storePack.rechargeAmount , "lastWeekGameTime" , 0 , "decoWeekOpenShowCount" , 0) end --人物新增服饰 if not curDetail.clothesData9 then skynet.server.personal:SetDetail( myPartnerId , "clothesData9", 0 , "clothesData10" , 0) end end --检测特殊字符 function Player:CheckSpecialChar( player ) function Do() local nickName = player.gameData.nickName --玩家昵称 if skynet.server.common:IsExistSpecialChar( nickName ) then player.gameData.nickName = "未命名" end --检测昵称是否有特殊字符 for k1, v1 in pairs( player.gameData.pet ) do if skynet.server.common:IsExistSpecialChar( v1.nickName ) then v1.nickName = "未命名" end end --检测方案名称是否有特殊字符 for k1, v1 in pairs( player.gameData.house ) do for k2, v2 in pairs( v1.scheme ) do if skynet.server.common:IsExistSpecialChar( v2.name ) then v2.name = "未命名" end end end return true end local isDo,callData = pcall( Do ) if not isDo then log.error("Player:CheckSpecialChar 内部错误",callData) end end --初始化 function Player:Init( c2sData ) local addr = c2sData.addr local platform = c2sData.data.platform --切割出对应的渠道 local channel = c2sData.data.channel if channel then local result = skynet.server.common:SplitByNumber(channel) channel = result[#result] if self.basicInfo.channel == nil or self.basicInfo.channel == "" then self.basicInfo.channel = channel end end local curHardwareCode = tostring(c2sData.data.hardwareCode) local nowTime = skynet.GetTime() if self.basicInfo.gameCgi == nil or self.basicInfo.gameCgi == "" then self.basicInfo.gameCgi = c2sData.data.gameCgi end --if self.basicInfo.system == nil or self.basicInfo.system == "" then self.basicInfo.system = c2sData.data.system --end self.basicInfo.appVersion = c2sData.data.version self:InitNoData( self ) --检测玩家是否有特殊字符 self:CheckSpecialChar( self ) --所有一级需要解锁的都放这里 if 1 == self.gameData.level then --解锁家具 if not self:IsUnlockSystem( dataType.UnlockSystem_Furniture ) then self:AddUnlockSystem( dataType.UnlockSystem_Furniture ) end --礼物 if not self:IsUnlockSystem( dataType.UnlockSystem_Gift ) then self:AddUnlockSystem( dataType.UnlockSystem_Gift ) end --挂机 if not self:IsUnlockSystem( dataType.UnlockSystem_Hang ) then self:AddUnlockSystem( dataType.UnlockSystem_Hang ) end --等级任务解锁 if not self:IsUnlockSystem( dataType.UnlockSystem_LevelTask ) then self:AddUnlockSystem( dataType.UnlockSystem_LevelTask ) --解锁时添加对应红点 skynet.server.msgTips:Add(self , 93) end end --初始化每个功能的登陆数据 for key, value in pairs(skynet.server) do if not string.find(key, "httpSocket") and not string.find(key, "tcpSocket") and not string.find(key, "webSocket") and not string.find(key, "mongo") and not string.find(key, "redis") and value["LoginInitData"] then function Do() value:LoginInitData( self ) return true end local isSuc,err = pcall(Do) if not isSuc then local account = self.basicInfo.accountName log.info("登陆功能模块有报错", account , key , err) end end end --活动管理在最后执行 skynet.server.activityManage:LoginChangeData(self) skynet.server.activity:ActivityExpiredSendMail(self) skynet.server.store:SendIconPackToUser(self) --修正下成就任务 skynet.server.achieveTask:RepairTaskType43(self) self:InitShop() --初始化商店 skynet.server.playerRecord:Add( self.userId , dataType.RecordType_1 , 0 , serverId , platform , skynet.server.common:GetStrTime(nowTime) , addr , curHardwareCode , c2sData.data.version) if self:IsNewUser() then self:InitPlayerData() --新用户初始化 else --对personal的detail进行转换 skynet.server.migrateData:DetailData( self.gameData.partner.id ) end --新的一天 if not skynet.server.common:IsSameDay(self.basicInfo.lastLoginTime , nowTime ) then self:ResetTodayData() end --发送玩家月卡信息 需要在新的一天下面再进行发送 skynet.server.store:SendMonthCardInfoToUser(self) --新的一周 if skynet.server.common:IsNewWeek(self.basicInfo.lastLoginTime) then self:ResetWeekData() end --新的一月 if skynet.server.common:IsNewMonth(self.basicInfo.lastLoginTime) then self:ResetMonthData() end --发送豪华月卡信息 skynet.server.luxuryCard:SendLuxuryCardInfoToUser(self) local isCompensate = self.basicInfo.isCompensate local curLevel = self.gameData.level local inviteCount = self.gameData.inviteCount if inviteCount and curLevel >= 3 and inviteCount > 1 and false == isCompensate then self.basicInfo.isCompensate = true local award = {} if 2 == inviteCount then table.insert( award , { type = dataType.GoodsType_Furniture , id = 732 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Furniture , id = 720 , count = 1 }) elseif inviteCount >= 3 then table.insert( award , { type = dataType.GoodsType_Furniture , id = 732 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Furniture , id = 720 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 222 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 223 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 224 , count = 1 }) end local title = "说好的官网邀请奖励来咯~" local content = "亲爱的小蜗:\ 非常感谢你对蜗居一直以来的关注与支持!因为你的盛情邀请,悠悠镇迎来了越来越多的小蜗,小镇变得更热闹啦!为表感谢,随信献上邀请奖励一份,记得及时领取哦~\ 如在游戏过程中遇到任何问题或想要提出游戏建议,欢迎在游戏左上角头像处点击小齿轮中的【联系客服】提交你的问题哦!" skynet.server.mail:AddNewMail( self , skynet.server.mail.MailType_Award , title , content , award) end --self:InnerData( self ) cp需要关闭 --self:InitTestAccount( true ) self.basicInfo.lastGameTime = nowTime self.basicInfo.lastLoginTime = nowTime self.basicInfo.appVersion = c2sData.data.version end --赠送默认家具到房间 function Player:InitPlayerData() --设置界面关注有礼 skynet.server.msgTips:Add( self , 20 ) skynet.server.msgTips:Add( self , 21 ) skynet.server.msgTips:Add( self , 22 ) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue") self.gameData.coin = cfgSValue.initCoin self.gameData.clovers = cfgSValue.initMapCoin --self.gameData.coin = 10000 --self.gameData.clovers = 10000 self.gameData.volute = cfgSValue.initVoluteCoin self.gameData.level = 1 self.gameData.exp = 0 self.gameData.bag = {} self.gameData.bagCount = {} self.gameData.used.logisticsInfo = {} --存在装修商店数据就处理一下 local shopType = dataType.ShopType_Decorate if self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ].door = {} self.gameData.shop[ shopType ].nextRefreshTime = 0 self.gameData.shop[ shopType ].firstRefresh = true skynet.server.decorateShop:RefreshShop( self , shopType ) end --赠送一个免费的物流 table.insert( self.gameData.used.logisticsInfo , { goodsId = 53 , npcNameId = 2 , copyId = 2 , goodsStatus = skynet.server.used.GoodsStatus_AlreadyReach , reachTime = 0 , deliverTime = 0 } ) skynet.server.bag:AddGoods( self , dataType.GoodsType_Furniture , 1 , 1) skynet.server.bag:AddGoods( self , dataType.GoodsType_Furniture , 10 , 1) skynet.server.bag:AddGoods( self , dataType.GoodsType_Decorate , 262 , 1) --赠送默认衣服 local cfgDefalutClothes = cfgSValue.DefalutClothes for k, v in pairs( cfgDefalutClothes ) do skynet.server.bag:AddGoods( self , dataType.GoodsType_Clothes , v , 1) end --赠送房间 local houseId = 4 self.gameData.curHouseID = houseId skynet.server.house:Add( self , houseId, {} , false ) --获取当前房间当前方案 --local schemeInfo = skynet.server.house:GetCurScheme( self ) --schemeInfo.decorate = skynet.server.house:InitDecorate( self , houseId ) --个人和宠物的装扮 skynet.server.personal:InitData( self ) self.gameData.design.basicFreeTime = skynet.GetTime() self.gameData.design.advancedFreeTime = skynet.GetTime() self.basicInfo.isNewPlayer = false end --初始化商店 function Player:InitShop() local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue") for k, v in pairs( self.gameData.unlockSystem ) do if dataType.UnlockSystem_Furniture == v then --家具和摆件,装修,套间 --刷新通用商店 for shopType = dataType.ShopType_Furniture, dataType.ShopType_Cinnabar, 1 do if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} self.gameData.shop[ shopType ].type = shopType self.gameData.shop[ shopType ].isBuySpecialGoods = false --当前商店是否购买了特殊物品 self.gameData.shop[ shopType ].specialGoods = {} self.gameData.shop[ shopType ].generalGoods = {} self.gameData.shop[ shopType ].nextRefreshTime = 0 self.gameData.shop[ shopType ].consumeCoin = 0 --在这里消息的金币 self.gameData.shop[ shopType ].historySpecialGoods = {} --历史刷出来的特殊家具 self.gameData.shop[ shopType ].historyGeneralGoods = {} --历史刷出来的普通家具 skynet.server.generalShop:RefreshShop( self , shopType ) else --时间超过了,刷新新的一批 if skynet.GetTime() >= self.gameData.shop[ shopType ].nextRefreshTime then skynet.server.generalShop:RefreshShop( self , shopType ) end end end --装修间 local shopType = dataType.ShopType_Decorate if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} self.gameData.shop[ shopType ].type = shopType self.gameData.shop[ shopType ].wallPaper = {} self.gameData.shop[ shopType ].floor = {} self.gameData.shop[ shopType ].door = {} self.gameData.shop[ shopType ].bar = {} self.gameData.shop[ shopType ].stair = {} self.gameData.shop[ shopType ].handrail = {} self.gameData.shop[ shopType ].nextRefreshTime = 0 self.gameData.shop[ shopType ].firstRefresh = true self.gameData.shop[ shopType ].unlockDecorateType = {} --解锁的装修类型 skynet.server.decorateShop:AddUnlockType( self , dataType.DecorateType_WallPaper) skynet.server.decorateShop:AddUnlockType( self , dataType.DecorateType_Floor) skynet.server.decorateShop:RefreshShop( self , shopType ) else --时间超过了,刷新新的一批 if skynet.GetTime() >= self.gameData.shop[ shopType ].nextRefreshTime then skynet.server.decorateShop:RefreshShop( self , shopType ) end end elseif dataType.UnlockSystem_Used == v then --闲菜 skynet.server.used:CheckRefreshGoods( self ) elseif dataType.UnlockSystem_Clothing == v then --服装 local shopType = dataType.ShopType_Clothes if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} self.gameData.shop[ shopType ].type = shopType self.gameData.shop[ shopType ].headWear = {} --头饰 self.gameData.shop[ shopType ].clothes = {} --衣服 self.gameData.shop[ shopType ].trousers = {} --裤子 self.gameData.shop[ shopType ].shoes = {} --鞋子 self.gameData.shop[ shopType ].buyGoods = {} self.gameData.shop[ shopType ].nextRefreshTime = 0 self.gameData.shop[ shopType ].historyGoods = {} for i = 1, dataType.ClothesType_Max, 1 do self.gameData.shop[ shopType ].historyGoods[ i ] = {} end skynet.server.clothesShop:RefreshShop( self , shopType ) else --时间超过了,刷新新的一批 if skynet.GetTime() >= self.gameData.shop[ shopType ].nextRefreshTime then skynet.server.clothesShop:RefreshShop( self , shopType ) end end elseif dataType.UnlockSystem_Plant == v then local shopType = dataType.ShopType_Seed --种子商店 if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} self.gameData.shop[ shopType ].type = shopType self.gameData.shop[ shopType ].isBuySpecialGoods = false --当前商店是否购买了特殊物品 self.gameData.shop[ shopType ].specialGoods = {} self.gameData.shop[ shopType ].generalGoods = {} self.gameData.shop[ shopType ].nextRefreshTime = 0 self.gameData.shop[ shopType ].isFirstRefresh = true self.gameData.shop[ shopType ].consumeCoin = 0 --在这里消息的金币 skynet.server.generalShop:RefreshShop( self , shopType ) else --时间超过了,刷新新的一批 if skynet.GetTime() >= self.gameData.shop[ shopType ].nextRefreshTime then skynet.server.generalShop:RefreshShop( self , shopType ) end end shopType = dataType.ShopType_Plant if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} self.gameData.shop[ shopType ].type = shopType --初始化货架数量 self.gameData.shop[ shopType ].shopShelf = {} --货架 for i = 1, skynet.server.plantShop.MaxShelfCount , 1 do self.gameData.shop[ shopType ].shopShelf[ i ] = { shelfId = i , goodsId = 0 , isSell = false , sellTime = 0 } end self.gameData.shop[ shopType ].sellCount = 0 end elseif dataType.UnlockSystem_Map == v then elseif dataType.UnlockSystem_FlowerShop == v then --花店解锁 local shopType = dataType.ShopType_Flower --花店 if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} self.gameData.shop[ shopType ].type = shopType self.gameData.shop[ shopType ].bagSeedId = 0 --福袋里刷到的种子 self.gameData.shop[ shopType ].furnitureId =0 --鲜花展示区刷到的家具 self.gameData.shop[ shopType ].recycleId = 0 --高价回收ID, 所有的植物都可以被随到 self.gameData.shop[ shopType ].shelfSeeds = {} --货架上的3个种子 self.gameData.shop[ shopType ].shelfFlowerpot = {} --货架上的2个花盆 self.gameData.shop[ shopType ].shelfFurniture = {} --货架上的2个家具 self.gameData.shop[ shopType ].nextRefreshTime = 0 self.gameData.shop[ shopType ].consumeCoin = 0 --在这里消息的金币 skynet.server.flowerShop:DailyRefresh( self ) end elseif dataType.UnlockSystem_CoffeeShop == v then --咖啡店解锁 local shopType = dataType.ShopType_Coffee --咖啡店 if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} self.gameData.shop[ shopType ].supplierBoxes = {} --咖啡豆,糖,奶的供货盒子 self.gameData.shop[ shopType ].grids = {} --只显示上面有东西的咖啡格子 self.gameData.shop[ shopType ].currency = {} --最高级咖啡豆,糖奶的数量 self.gameData.shop[ shopType ].coffees = {} --已经解锁的咖啡ID self.gameData.shop[ shopType ].rewards = {} --奖励 self.gameData.shop[ shopType ].mergeCount = 0 --合成次数 self.gameData.shop[ shopType ].mergeMaxLevel = {0,0,0} --咖啡豆,糖,奶当前合成最高等级 self.gameData.shop[ shopType ].noNewCoffeeCount = 0 --未抽到新咖啡的数量 local cfgCoffeeMakingPara = cfgSValue.coffeeMakingPara local replenishCount = cfgCoffeeMakingPara[1] --激活了豪华月卡,数量增加 if skynet.server.luxuryCard:IsActivate( self ) then replenishCount = replenishCount * cfgSValue.luxuryCardCoffeeClickModulus end --初始化领取材料 table.insert( self.gameData.shop[ shopType ].supplierBoxes , { type = dataType.CoffeeShopGoodsType_CoffeeBean , count = replenishCount , nextRefreshTime = 0 , adTimes = 0} ) table.insert( self.gameData.shop[ shopType ].supplierBoxes , { type = dataType.CoffeeShopGoodsType_Sugar , count = replenishCount , nextRefreshTime = 0 , adTimes = 0} ) table.insert( self.gameData.shop[ shopType ].supplierBoxes , { type = dataType.CoffeeShopGoodsType_Milk , count = replenishCount , nextRefreshTime = 0 , adTimes = 0} ) --初始化格子 for i = 1, 30, 1 do table.insert( self.gameData.shop[ shopType ].grids , { index = i , type = dataType.CoffeeShopGoodsType_Empty , level = 0 } ) end --初始化3种货币 for i = 1, 3, 1 do table.insert( self.gameData.shop[ shopType ].currency , 1 ) end local cfgIllustationsReward = cfgSValue.coffeeIllustationReward local idStart = 1 for k, v in pairs( cfgIllustationsReward ) do local reward = skynet.server.common:Split( v , "_" ) table.insert( self.gameData.shop[ shopType ].rewards , { id = idStart, status = dataType.Status_NoGain }) idStart = idStart + 1 end skynet.server.coffeeShop:CheckMsgTips( self ) end elseif dataType.UnlockSystem_StyleRoom == v then --造型间解锁 local shopType = dataType.ShopType_Style --造型间 if not self.gameData.shop[ shopType ] then self.gameData.shop[ shopType ] = {} local curShop = self.gameData.shop[ shopType ] curShop.type = shopType curShop.grids = skynet.server.styleShop:GenerateGrid( self ) --格子信息 curShop.energy = {} --能量数值 curShop.energy.energy = skynet.server.styleShop:GetMaxRestoreEnergy( self ) curShop.energy.nextRefillTime = 0 curShop.money ={} --货币资源 curShop.money.resource1 = 0 --卷发棒 curShop.money.resource2 = 0 --粉底刷 curShop.money.resource3 = 0 --梳子 curShop.curStyleId = 1 --当前设计的ID curShop.gainRewards = {} --领取的造型奖励,其实就是造型id curShop.attemptCount = 0 --设计次数 curShop.randHistoryList = {} --随机历史列表 skynet.server.msgTips:Add( self , 74) end elseif dataType.UnlockSystem_FishShop == v then -- 判断该玩家渔店是否解锁 local shopType = dataType.ShopType_Fish -- 渔店 if not self.gameData.shop[ shopType ] then skynet.server.fishShop:InitData(self,shopType) end elseif dataType.UnlockSystem_CuisineShop == v then -- 判断该玩家料理店是否解锁 local shopType = dataType.ShopType_Cuisine -- 料理店 if not self.gameData.shop[ shopType ] then skynet.server.cuisineShop:InitData(self,shopType) end elseif dataType.UnlockSystem_PetShop == v then -- 判断该玩家宠物店是否解锁 local shopType = dataType.ShopType_PetShop -- 宠物店 if not self.gameData.shop[ shopType ] then skynet.server.petShop:InitData(self,shopType) skynet.server.pet:Package( self , dataType.PetType_Cat ) --搬到晨曦小筑解锁猫咪 skynet.server.bag:AddGoods(self, dataType.GoodsType_PetSkin, 1, 1) local cfgPetAnim = skynet.server.gameConfig:GetPlayerAllCfg(self, "PetAnim") -- 解锁宠物动作 for k, v in ipairs(cfgPetAnim) do if 0 == v.getType then skynet.server.bag:AddGoods(self, dataType.GoodsType_PetAction, v.id, 1) end end end --宠物衣服 shopType = dataType.ShopType_PetClothes skynet.server.petClothesShop:InitData(self,shopType) elseif dataType.UnlockSystem_HouseRent == v then -- 判断该玩家恋家置业是否解锁 local shopType = dataType.ShopType_GardenShop -- 青青园艺 if not self.gameData.shop[ shopType ] then --self.gameData.shop[ shopType ] = {} -- 青青园艺初始化 skynet.server.houseRent:InitData(self,shopType) end elseif dataType.UnlockSystem_ActivityLabyrinth == v then --迷宫活动解锁 local activityType = dataType.ActivityType_Labyrinth --迷宫 if not self.gameData.activity[ activityType ] then --skynet.server.activityLabyrinth:InitData(self,activityType) end elseif dataType.UnlockSystem_ActivityCarnival == v then --嘉年华活动解锁 local activityType = dataType.ActivityType_Carnival --嘉年华 if not self.gameData.activity[ activityType ] then skynet.server.activityCarnival:InitData(self,activityType) end elseif dataType.UnlockSystem_ActivityDreamLife == v then --若来活动解锁 local activityType = dataType.ActivityType_DreamLife --若来 if not self.gameData.activity[ activityType ] then skynet.server.activityDreamLife:InitData(self,activityType) end elseif dataType.UnlockSystem_ActivityFlipCard == v then --翻翻乐解锁 local activityType = dataType.ActivityType_FlipCard --翻翻乐 if not self.gameData.activity[ activityType ] then skynet.server.activityFlipCard:InitData(self,activityType) end elseif dataType.UnlockSystem_ActivityPuzzle == v then --拼图解锁 local activityType = dataType.ActivityType_Puzzle --拼图 if not self.gameData.activity[ activityType ] then skynet.server.activityPuzzle:InitData(self,activityType) end elseif dataType.UnlockSystem_ActivitySavingPot == v then --存钱罐解锁 local activityType = dataType.ActivityType_SavingPot --存钱罐 if not self.gameData.activity[ activityType ] then skynet.server.activitySavingPot:InitData(self,activityType) end elseif dataType.UnlockSystem_ActivityBindBox == v then --盲盒解锁 local activityType = dataType.ActivityType_BindBox --盲盒 if not self.gameData.activity[ activityType ] then skynet.server.activityBindBox:InitData(self) end end end end --新的一天 function Player:ResetTodayData() local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue") --新的一天,清理今日数据 for k, v in pairs(self.gameData.todayGain) do if "table" == type(v) then self.gameData.todayGain[ k ] = {} elseif "boolean" == type(v) then self.gameData.todayGain[ k ] = false else self.gameData.todayGain[ k ] = 0 end end --通行证每日任务数据置0 for k, v in pairs( self.gameData.passCheck.tasks ) do if skynet.server.passCheck.TaskType_Daily == v.type then v.progress = 0 end end if self.gameData.level>=cfgSValue.storeUnlockLvl then --商城每日礼包购买次数重置 for k ,v in pairs(self.gameData.storePack.storePackInfo) do if v and v.packLimit ~=nil and v.packLimit[1]==1 then v.buyTimes=0 end end --月卡相关数据修改 确保至少减去一天 local count = skynet.server.common:GetTimeGap(self.basicInfo.lastGameTime) self.gameData.storePack.monthCard.day = self.gameData.storePack.monthCard.day - math.max(count,1) if self.gameData.storePack.monthCard.buyStatus and self.gameData.storePack.monthCard.day >= 0 then self.gameData.storePack.monthCard.getStatus = false --添加相应红点 skynet.server.msgTips:AddNoNotice(self , 63) elseif self.gameData.storePack.monthCard.buyStatus and self.gameData.storePack.monthCard.day < 0 then --月卡过期 self.gameData.storePack.monthCard.day = -1 self.gameData.storePack.monthCard.buyStatus = false self.gameData.storePack.monthCard.getStatus = true --消除对应权益 skynet.server.store:MonthCardPower( self ) end --商城每日拍屏礼包重置 for k ,v in pairs(self.gameData.storePack.popupPackInfo) do if v.type == skynet.server.store.PopUpPack_Day and v.id ~= 61 and v.status ~= 0 then v.status = 1 elseif v.id == 61 and not self.gameData.storePack.monthCard.buyStatus then --月卡拍屏单独处理 没有购买才进行拍屏 v.status = 1 end --在线玩家跨天时过期的拍屏礼包发送消息给客户端 if v.id ~= 61 and v.status ~= 0 then local tmpEndTime = skynet.server.gameConfig:GetPlayerCurCfg( self , "StorePack" , v.id).endTime if tmpEndTime and "" ~= tmpEndTime then local endTime = skynet.server.common:GetTime( tmpEndTime ) if skynet.GetTime() > endTime then local data = {} data.popUpStoreInfo = {storeId = v.id , buyTimes = 0 , failureTime = 0 , redDot = false } skynet.server.gameServer:SendMsgToUser( self.userId , "CMD_S2C_StoreIconPopUp" , data ) end end end end --豪华月卡过期检测 skynet.server.luxuryCard:CheckOutOfTime( skynet.GetTime() , self ) --发送豪华月卡信息 skynet.server.luxuryCard:SendLuxuryCardInfoToUser(self) --发送普通月卡信息 skynet.server.store:SendMonthCardInfoToUser(self) end --友圈互动每天默认未互动 for k, v in pairs( self.gameData.friend ) do v.isInteract = false end --每日第一次登录刷新常规签到和新人签到 skynet.server.signIn:InitData( self ) if next(self.gameData.playerLand.signInInfo) ~= nil then skynet.server.playerLand:LoginChangeData( self ) end --刷新每日奖励任务 skynet.server.dailyTask:Refresh( self ) skynet.server.msgTips:Reset(self , 75) skynet.server.msgTips:Add(self , 75) skynet.server.flowerShop:RefreshShop( self , dataType.ShopType_Flower ) --清空我与其它玩家的过期消息 local outOfTime = ( cfgSValue.friendChatSave ) * 3600 --好友聊天内容有效期 local myPlayerId = self.gameData.partner.id --家园签到重置 local curDetail = skynet.server.personal:GetDetail( myPlayerId ) --获取身份信息 if curDetail and "" ~= curDetail.groupId then skynet.server.personal:SetDetail( myPlayerId , "groupSignInType" , 0 ) skynet.server.groupRank:CheckRankStatus( self , curDetail.groupId ) --刷新下排行榜状态 end if cfgSValue.communityUnlockLvl <= self.gameData.level then -- 园艺铺子初始化 skynet.server.groupGardenShop:InitData(self) end --记录玩家每日登录时的等级 self.gameData.todayGain.level = self.gameData.level --限时卡池的签到活动 每日刷新 if self.gameData.design.timeCardPoolInfo.id then if self.gameData.design.timeCardPoolInfo.timeSignInCount < cfgSValue.raffleLimitRewardDays then self.gameData.design.timeCardPoolInfo.timeSignInCount = self.gameData.design.timeCardPoolInfo.timeSignInCount + 1 for k , v in pairs(self.gameData.design.timeCardPoolInfo.timeSignIn) do if v.day == self.gameData.design.timeCardPoolInfo.timeSignInCount and v.status == 0 then --解锁对应限时卡池签到奖励 并添加相应红点 v.status = 1 skynet.server.msgTips:AddNoNotice(self , 69) end end end end --迷宫活动 每日增加指南针 if self.gameData.activity[ dataType.ActivityType_Labyrinth ] and next(self.gameData.activity[ dataType.ActivityType_Labyrinth ]) ~= nil then if self.gameData.activity[ dataType.ActivityType_Labyrinth ].compassCount < 2 then --将指南针的数量补充至2 self.gameData.activity[ dataType.ActivityType_Labyrinth ].compassCount = 2 end end --签到活动 if self.gameData.activity[ dataType.ActivityType_SignActivity ] and next(self.gameData.activity[ dataType.ActivityType_SignActivity ]) ~= nil then skynet.server.activitySign:LoginInitData( self ) end -- 嘉年华活动 if self.gameData.activity[ dataType.ActivityType_Carnival ] and next(self.gameData.activity[ dataType.ActivityType_Carnival ]) ~= nil then skynet.server.activityCarnival:LoginInitData( self ) end --每日初始若来任务 if self.gameData.activity[ dataType.ActivityType_DreamLife ] and next(self.gameData.activity[ dataType.ActivityType_DreamLife ]) ~= nil then skynet.server.activityDreamLife:InitTask( self ) end --周赛投票券发放 if self.gameData.activity[ dataType.ActivityType_DecoWeek ] and next(self.gameData.activity[ dataType.ActivityType_DecoWeek ]) ~= nil then skynet.server.activityDecoWeek:GetFreeVote( self ) end --存钱罐 if self:IsUnlockSystem( dataType.UnlockSystem_ActivitySavingPot ) then skynet.server.activitySavingPot:LoginInitData(self)--需要替换 end --盲盒 if self:IsUnlockSystem( dataType.UnlockSystem_ActivityBindBox ) then skynet.server.activityBindBox:ResetDailyData(self) end local unlockCondition = skynet.server.map:GetUnlockCondition( self , 7 ) local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") -- 宠物商店每日礼包购买次数重置 if self.gameData.level >= unlockCondition[2] then for k ,v in pairs(self.gameData.shop[dataType.ShopType_PetShop].petShopGoodInfo ) do if next(petStore[v.id].packLimit) ~= nil and petStore[v.id].packLimit[1] == 1 then v.packLimit = petStore[v.id].packLimit v.buyTimes = 0 skynet.server.msgTips:Add(self, 84) end end end log.debug("玩家清理今日数据" , self.userId) end --新的一周 function Player:ResetWeekData() --商城每周礼包购买次数重置 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue") if self.gameData.level >= cfgSValue.storeUnlockLvl then for k ,v in pairs(self.gameData.storePack.storePackInfo) do if v and v.packLimit ~= nil and v.packLimit[1] == 2 then v.buyTimes=0 end end end local unlockCondition = skynet.server.map:GetUnlockCondition( self , 7 ) local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") -- 宠物商店每周礼包购买次数重置 if self.gameData.level >= unlockCondition[2] then for k ,v in pairs(self.gameData.shop[dataType.ShopType_PetShop].petShopGoodInfo ) do if next(petStore[v.id].packLimit) ~= nil and petStore[v.id].packLimit[1] == 2 then v.packLimit[1] = petStore[v.id].packLimit[1] v.buyTimes = 0 skynet.server.msgTips:Add(self, 84) end end end end --新的一月 function Player:ResetMonthData() --新的一天,清理今日数据 for k, v in pairs(self.gameData.monthGain) do if "table" == type(v) then self.gameData.monthGain[ k ] = {} elseif "boolean" == type(v) then self.gameData.monthGain[ k ] = false else self.gameData.monthGain[ k ] = 0 end end --商城每月礼包购买次数重置 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue") if self.gameData.level >= cfgSValue.storeUnlockLvl then for k ,v in pairs(self.gameData.storePack.storePackInfo) do if v and v.packLimit and v.packLimit[1] == 4 then v.buyTimes = 0 end end end --发送豪华月卡信息 skynet.server.luxuryCard:SendLuxuryCardInfoToUser(self) end --货币变化 function Player:MoneyChange( moneyType , count , eventId ) eventId = eventId or 0 local data = {} data.money = {} data.eventId = eventId if dataType.MoneyType_No == moneyType then elseif pb.enum("EnumGoodsType","Coin") == moneyType then if self.gameData.coin + count < 0 then log.warning("金币数量不足,无法扣除") return false end self.gameData.coin = self.gameData.coin + count self:AddTodayData("coin" , count) data.money = { type = pb.enum("EnumGoodsType","Coin") , count = self.gameData.coin } skynet.server.playerRecord:Add( self.userId , dataType.RecordType_50 , eventId , self.gameData.coin - count, count , self.gameData.coin ) if count < 0 then skynet.server.achieveTask:Modify( self , 42 , math.abs(count)) skynet.server.taskListEvent:Modify( self , 42 , math.abs(count)) end elseif pb.enum("EnumGoodsType","Clovers") == moneyType then if self.gameData.clovers + count < 0 then log.warning("三叶币数量不足,无法扣除") return false end self.gameData.clovers = self.gameData.clovers + count self:AddTodayData("clovers" , count) data.money = { type = pb.enum("EnumGoodsType","Clovers") , count = self.gameData.clovers } skynet.server.playerRecord:Add( self.userId , dataType.RecordType_51 , eventId , self.gameData.clovers - count, count , self.gameData.clovers ) elseif dataType.MoneyType_Volute == moneyType then if self.gameData.volute + count < 0 then log.warning("蜗壳数量不足,无法扣除") return false end self.gameData.volute = self.gameData.volute + count self:AddTodayData("volute" , count) --存钱罐累计消费变化 skynet.server.activitySavingPot:ChangeVoluteCost( self , count ) data.money = { type = pb.enum("EnumGoodsType","VoluteCoin") , count = self.gameData.volute } skynet.server.playerRecord:Add( self.userId , dataType.RecordType_52 , eventId , self.gameData.volute - count, count , self.gameData.volute ) elseif dataType.MoneyType_ContributeCoin == moneyType then if self.gameData.contributeCoin + count < 0 then log.warning("贡献币数量不足,无法扣除") return false end self.gameData.contributeCoin = self.gameData.contributeCoin + count self:AddTodayData("contributeCoin" , count) data.money = { type = pb.enum("EnumGoodsType","ContributeCoin") , count = self.gameData.contributeCoin } skynet.server.playerRecord:Add( self.userId , dataType.RecordType_53 , eventId , self.gameData.contributeCoin - count, count , self.gameData.contributeCoin ) elseif pb.enum("EnumGoodsType","Fragment") == moneyType then--灵感积分 if self.gameData.design.fragmentNum == nil then self.gameData.design.fragmentNum = 0 end if self.gameData.design.fragmentNum + count < 0 then log.warning("灵感积分不足,无法扣除") return false end self.gameData.design.fragmentNum = self.gameData.design.fragmentNum + count self:AddTodayData("fragment" , count) data.money = { type = pb.enum("EnumGoodsType","Fragment") , count = self.gameData.design.fragmentNum } skynet.server.playerRecord:Add( self.userId , dataType.RecordType_54 , eventId , self.gameData.design.fragmentNum - count, count , self.gameData.design.fragmentNum ) if count < 0 then--任务 -- skynet.server.achieveTask:Modify( self , 42 , math.abs(count)) -- skynet.server.taskListEvent:Modify( self , 42 , math.abs(count)) end else log.warning("不存在该类型的货币") return false end --log.info(string.format("玩家 %d 货币类型 %d 数量 %d" , self.userId , moneyType , count)) skynet.server.gameServer:SendMsgToUser( self.userId , "CMD_S2C_MoneyChange" , data ) return true end --货币变化 消息 function Player:MoneyChangeMsg() --[[ local data = {} data.coin = self.gameData.coin data.clovers = self.gameData.clovers data.volute = self.gameData.volute data.loveCoin = self.gameData.loveCoin data.praiseCoin = self.gameData.praiseCoin skynet.server.gameServer:SendMsgToUser( self.userId , "CMD_S2C_MoneyChange" , data ) ]] end --增加经验数量 isForce强制给经验,不管是不是新人 isGM是否为GM命令 function Player:AddExpCount( count , isForce , isGm ) isForce = isForce or false isGm = isGm or false if not isForce and self.basicInfo.isNewPlayer then return false end count = count or 0 if count <= 0 then return end --超过80级就不增加经验 if self.gameData.level >= self.maxLevelLimt then return true end if self.gameData.level < 8 and skynet.GetTime() - self.tmpData.lastUpgradeTime <= 1 and not isGm then --由于多种加经验方式,如果连续升级,客户端会有问题,所以1秒内只能加一次经验,多的经验缓存起来,下一次发放。仅限8级以下才会限制 self.tmpData.cacheExp = self.tmpData.cacheExp + count return false else if self.tmpData.cacheExp > 0 then --有缓存经验,发放给玩家 count = count + self.tmpData.cacheExp self.tmpData.cacheExp = 0 end end self.gameData.exp = self.gameData.exp + count self:AddTodayData("exp" , count) skynet.server.playerRecord:Add( self.userId , dataType.RecordType_61 , 0 , self.gameData.exp - count, count , self.gameData.exp ) self:CheckUpgrade( isGm ) local data = {} data.level = self.gameData.level data.exp = self.gameData.exp skynet.server.gameServer:SendMsgToUser( self.userId , "CMD_S2C_Upgrade" , data ) return true end --根据类型增加经验 function Player:AddExpForType( mainType , subType , count ) if self.basicInfo.isNewPlayer then return false end --指定等级就不增加经验 if self.gameData.level >= self.maxLevelLimt then return false end subType = subType or 0 --缺省参数默认为0 count = count or 1 local expValue = 0 local cfgAllExpNormal = skynet.server.gameConfig:GetPlayerAllCfg( self , "ExpNormal") for k, v in pairs( cfgAllExpNormal ) do if mainType == v.expIncrease and subType == v.subType then expValue = v.expValue end end --未找到相关的配置 if 0 == expValue then return false end expValue = expValue * count if skynet.GetTime() - self.tmpData.lastUpgradeTime <= 2 then --由于多种加经验方式,如果连续升级,客户端会有问题,所以2秒内只能加一次经验,多的经验缓存起来,下一次发放 self.tmpData.cacheExp = self.tmpData.cacheExp + expValue return false else if self.tmpData.cacheExp > 0 then --有缓存经验,发放给玩家 expValue = expValue + self.tmpData.cacheExp self.tmpData.cacheExp = 0 end end self.gameData.exp = self.gameData.exp + expValue self:AddTodayData("exp" , expValue) skynet.server.playerRecord:Add( self.userId , dataType.RecordType_61 , 0 , self.gameData.exp - expValue, expValue , self.gameData.exp ) self:CheckUpgrade( false ) local data = {} data.level = self.gameData.level data.exp = self.gameData.exp skynet.server.gameServer:SendMsgToUser( self.userId , "CMD_S2C_Upgrade" , data ) return true end --增加今日数据 function Player:AddTodayData( name ,count ) if self.gameData.todayGain[ name ] and count > 0 then self.gameData.todayGain[ name ] = self.gameData.todayGain[ name ] + count log.debug(string.format("玩家 %d 今日数据 %s 新增 %d", self.userId , name , count )) end end --检查是否升级 function Player:CheckUpgrade( isGm ) local cfgLevel = skynet.server.gameConfig:GetPlayerCurCfg( self , "Level" , self.gameData.level ) if self.gameData.exp >= cfgLevel.requireExp then --升级 self.tmpData.lastUpgradeTime = skynet.GetTime() self.gameData.level = self.gameData.level + 1 self.gameData.upTime = skynet.GetTime() self.gameData.exp = self.gameData.exp - cfgLevel.requireExp if self.gameData.level > self.maxLevelLimt then self.gameData.level = self.maxLevelLimt end skynet.server.personal:SetDetail( self.gameData.partner.id , "level" , self.gameData.level ) --用新等级再获取下奖励 cfgLevel = skynet.server.gameConfig:GetPlayerCurCfg( self , "Level" , self.gameData.level ) self:AddTodayData("Level" , 1) log.debug(string.format("玩家 %d 升级 最新等级 %d 最新经验 %d", self.userId , self.gameData.level , self.gameData.exp)) skynet.server.playerRecord:Add( self.userId , dataType.RecordType_60 , 0 , self.gameData.level - 1, 1 , self.gameData.level ) skynet.server.playerRecord:Add( self.userId , dataType.RecordType_61 , 0 , self.gameData.exp - cfgLevel.requireExp, cfgLevel.requireExp , self.gameData.exp ) --升级奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_83") self:GiveReward( cfgLevel.reward , eventId) --解锁系统 self:CheckUnlockSystem() --初始化下商店信息 self:InitShop() skynet.server.achieveTask:CheckNew( self ) skynet.server.npcTask:CheckNew( self ) skynet.server.passCheck:CheckNew( self ) skynet.server.map:CheckUnlcokLoc( self) skynet.server.friend:CheckUnlockNpc( self ) skynet.server.friend:CheckNewMsg( self ) skynet.server.house:CheckNew( self ) skynet.server.pet:CheckNew( self ) self:CompensateOldIOS() skynet.server.activityDecoWeek:UnlockSystemFunc( self ) --每次只升一级,如果升级后还大于就不再升 local cfgNewLevel = skynet.server.gameConfig:GetPlayerCurCfg( self , "Level" , self.gameData.level ) if self.gameData.exp >= cfgNewLevel.requireExp then self.tmpData.cacheExp = self.gameData.exp - ( cfgNewLevel.requireExp - 10 ) self.gameData.exp = cfgNewLevel.requireExp - 10 end --每次升级后刷新玩家可显示UI local data = {} data.activityInfos = skynet.server.activity:GetAllActivityInfo( self ) skynet.server.gameServer:SendMsgToUser( self.userId , "CMD_S2C_UpdateShowUI" , data ) else return end end --添加解锁系统 function Player:AddUnlockSystem( unlockType ) if not self:IsUnlockSystem( unlockType ) then table.insert( self.gameData.unlockSystem , unlockType ) end end --检查是否解锁系统 function Player:CheckUnlockSystem() local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( self , "SValue") local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg( self , "Activity") local curLevel = self.gameData.level if cfgSValue.SellAPPUnlockLvl == self.gameData.level then --闲菜 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_Used ) skynet.server.bag:AddGoods( self , dataType.GoodsType_Furniture , 197 , 1) --破箱子 end if cfgSValue.ClothingAPPUnlockLvl == self.gameData.level then --服装 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_Clothing ) end if cfgSValue.PlantAPPUnlockLvl == self.gameData.level then --植物 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_Plant ) end if cfgSValue.MoveAPPUnlockLvl == self.gameData.level then --搬家 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_MoveHome ) end if cfgSValue.ChatAPPUnlockLvl == self.gameData.level then --友圈 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_Friend ) end if cfgSValue.storeUnlockLvl == self.gameData.level then --商城 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_Store ) --九级初始化商店 if next(self.gameData.storePack.storePackInfo)==nil then skynet.server.store:InitData( self) end end if cfgSValue.MapAPPUnlockLvl == self.gameData.level then --地图 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_Map ) end local unlockCondition = skynet.server.map:GetUnlockCondition( self , 2 ) if unlockCondition and unlockCondition[ 2 ]== self.gameData.level then --花店 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_FlowerShop ) end unlockCondition = skynet.server.map:GetUnlockCondition( self , 3 ) if unlockCondition and unlockCondition[ 2 ]== self.gameData.level then --咖啡店 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_CoffeeShop ) end unlockCondition = skynet.server.map:GetUnlockCondition( self , 4 ) if unlockCondition and unlockCondition[ 2 ] == self.gameData.level then --造型间 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_StyleRoom ) end unlockCondition = skynet.server.map:GetUnlockCondition( self , 5 ) --渔店 if unlockCondition and unlockCondition[ 2 ] == self.gameData.level then table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_FishShop ) end unlockCondition = skynet.server.map:GetUnlockCondition( self , 6 ) --料理店 if unlockCondition and unlockCondition[ 2 ] == self.gameData.level then table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_CuisineShop ) end unlockCondition = skynet.server.map:GetUnlockCondition( self , 7 ) --宠物店 if unlockCondition and unlockCondition[ 2 ] == self.gameData.level then table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_PetShop ) end unlockCondition = skynet.server.map:GetUnlockCondition( self , 8 ) --恋家置业 if unlockCondition and unlockCondition[ 2 ] == self.gameData.level then table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_HouseRent ) end if self.gameData.shop[dataType.ShopType_PetShop] then local cfgPetSkin = skynet.server.gameConfig:GetPlayerAllCfg(self, "PetSkin") -- 解锁宠物皮肤 for k, v in ipairs(cfgPetSkin) do if v.unlockLvl ~= 0 and v.unlockLvl ~= '' and self.gameData.level == v.unlockLvl then skynet.server.bag:AddGoods(self, dataType.GoodsType_PetSkin, v.id, 1) end end end if cfgSValue.drawUnlockLvl == self.gameData.level then --设计间 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_DesignHouse ) --self:GiveReward( 292 ) --skynet.server.design:InitData( self ) --初始化相关数据 end if cfgSValue.passCheckUnlockLvl == self.gameData.level then --通行证 self:AddUnlockSystem( dataType.UnlockSystem_PassCheck ) end if cfgSValue.dailyTaskUnlockLvl == self.gameData.level then self:AddUnlockSystem( dataType.UnlockSystem_DailyTask ) --刷新每日奖励任务 skynet.server.dailyTask:Refresh( self ) --解锁时添加对应红点 skynet.server.msgTips:Add(self , 90) end if cfgSValue.achTaskUnlockLvl == self.gameData.level then self:AddUnlockSystem( dataType.UnlockSystem_AchieveTask ) --解锁时添加对应红点 skynet.server.msgTips:Add(self , 92) end if cfgSValue.npcTaskUnlockLvl == self.gameData.level then self:AddUnlockSystem( dataType.UnlockSystem_NpcTask ) --解锁时添加对应红点 skynet.server.msgTips:Add(self , 91) end if cfgSValue.signInUnlockLvl == self.gameData.level then --常规签到 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_SignIn ) if next(self.gameData.signIn.signInInfo)==nil then skynet.server.signIn:InitData(self) end end if cfgSValue.playerLandUnlockLvl == self.gameData.level then --新人签到 --新人签到数据初始化 skynet.server.playerLand:InitData( self ) end if cfgSValue.partnerUnlockLvl == self.gameData.level then self:AddUnlockSystem( dataType.UnlockSystem_Partner ) --开启好友功能,好友可以进自己房间,所以这里将数据落下地,不然玩家可能获取不了房间数据 skynet.server.accountCenter:SavePlayerToMysql( self ) end if cfgSValue.communityUnlockLvl == self.gameData.level then --家园 self:AddUnlockSystem( dataType.UnlockSystem_Group ) -- 园艺铺子初始化 skynet.server.groupGardenShop:InitData(self) end if cfgSValue.colorUnlockLvl == self.gameData.level then --巧手工坊 table.insert( self.gameData.unlockSystem , dataType.UnlockSystem_workshop ) skynet.server.dyeworkshop:InitData( self) skynet.server.furnitureWorkShop:InitData( self) end if cfgSValue.schemeUnlockLvl == self.gameData.level then --装修方案 self:AddUnlockSystem( dataType.UnlockSystem_HouseScheme ) end for k , v in pairs(cfgActivity) do if dataType.ActivityType_Labyrinth == v.activityType and curLevel >= v.level then --活动迷宫 self:AddUnlockSystem( dataType.UnlockSystem_ActivityLabyrinth ) elseif dataType.ActivityType_DecoWeek == v.activityType and curLevel >= v.level then --装修周 self:AddUnlockSystem( dataType.UnlockSystem_ActivityDecoWeek ) elseif dataType.ActivityType_MatchStuff == v.activityType and curLevel >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityMatchStuff ) elseif dataType.ActivityType_NewPlayerRaffle == v.activityType and curLevel == v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityNewPlayerRaffle ) elseif dataType.ActivityType_SignPack == v.activityType and curLevel >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivitySignPack ) elseif dataType.ActivityType_SeekTreasure == v.activityType and curLevel >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivitySeekTreasure ) elseif dataType.ActivityType_ActivityLevelPack == v.activityType and curLevel >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityLevelPack ) elseif dataType.ActivityType_ActivityStagePack == v.activityType and curLevel >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityStagePack ) elseif dataType.ActivityType_DailyRiddle == v.activityType and curLevel >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityDailyRiddle ) elseif dataType.ActivityType_ActivityReplicaStore == v.activityType and curLevel >= v.level then self:AddUnlockSystem( dataType.UnlockSystem_ActivityReplicaStore ) end end if cfgSValue.coupleHouseUnlockLvl == self.gameData.level then --双人空间解锁 self:AddUnlockSystem( dataType.UnlockSystem_DoubleSpace ) skynet.server.doubleSpace:InitData( self ) end if cfgSValue.activityUnlockLvl == self.gameData.level then --活动管理面板解锁 skynet.server.activityManage:LoginChangeData( self , false) end for k , v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_Carnival and v.level == self.gameData.level then --活动嘉年华 self:AddUnlockSystem( dataType.UnlockSystem_ActivityCarnival ) break end end for k , v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_DreamLife and v.level == self.gameData.level then --活动若来 self:AddUnlockSystem( dataType.UnlockSystem_ActivityDreamLife ) break end end for k , v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_FlipCard and v.level == self.gameData.level then --活动翻翻乐 self:AddUnlockSystem( dataType.UnlockSystem_ActivityFlipCard ) break end end for k , v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_Puzzle and v.level == self.gameData.level then --活动拼图 self:AddUnlockSystem( dataType.UnlockSystem_ActivityPuzzle ) break end end for k , v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_SavingPot and v.level == self.gameData.level then --存钱罐 self:AddUnlockSystem( dataType.UnlockSystem_ActivitySavingPot ) break end end for k , v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_BindBox and v.level == self.gameData.level then --盲盒 self:AddUnlockSystem( dataType.UnlockSystem_ActivityBindBox ) break end end if cfgSValue.miniProgramSubscribeLvl == self.gameData.level then --微信订阅 self:AddUnlockSystem( dataType.UnlockSystem_Subscription ) end local newPlayerTriggerPack = cfgSValue.newPlayerTriggerPack if newPlayerTriggerPack[ 2 ] == self.gameData.level then local triggerId = skynet.server.store.TriggerPack_NewPlayerClothes skynet.server.store:TriggerPack( self , triggerId ) end end --是否解锁系统 function Player:IsUnlockSystem( type ) for k, v in pairs( self.gameData.unlockSystem ) do if type == v then return true end end return false end --玩家是否存在该商品 function Player:IsBuyGoods( goodsType , goodsId ) for k, v in pairs( self.gameData.bag ) do if goodsType == v.type and goodsId == v.id then return true end end return false end --发奖励 function Player:GiveReward( rewardId , eventId , count ) if 0 == rewardId then return end --记录要进行转换奖励的原物品信息 local conversionInfo = {} --记录最终获得的物品信息 local finalRewardInfo = {} count = count or 1 log.debug("开始发送奖励",rewardId , eventId ,count ) local cfgReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , rewardId ) if not cfgReward then log.warning("未找到相关的奖励 ID",rewardId) return end if cfgReward.coin > 0 then self:MoneyChange( dataType.MoneyType_Coin , cfgReward.coin * count , eventId) table.insert(finalRewardInfo,{goodsType = dataType.MoneyType_Coin , id = 0 , count = cfgReward.coin * count }) --log.info(string.format("玩家 %d 发放金币 %d" , self.userId,cfgReward.coin * count )) end if cfgReward.mapCoin > 0 then self:MoneyChange( dataType.MoneyType_Map , cfgReward.mapCoin * count , eventId) table.insert(finalRewardInfo,{goodsType = dataType.MoneyType_Map , id = 0 , count = cfgReward.mapCoin * count }) --log.info(string.format("玩家 %d 发放地图币 %d" , self.userId,cfgReward.mapCoin * count )) end if cfgReward.voluteCoin > 0 then self:MoneyChange( dataType.MoneyType_Volute , cfgReward.voluteCoin * count , eventId) table.insert(finalRewardInfo,{goodsType = dataType.MoneyType_Volute , id = 0 , count = cfgReward.voluteCoin * count }) --log.info(string.format("玩家 %d 发放蜗壳 %d" , self.userId,cfgReward.voluteCoin * count)) end --场景物品 for k, v in pairs( cfgReward.sceneObject ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if 1 == arr[1] then skynet.server.bag:AddGoods( self , dataType.GoodsType_Furniture , arr[2] , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Furniture , id = arr[2] , count = count }) log.debug(string.format("玩家 %d 发放家具 %d" , self.userId, arr[2] )) elseif 2 == arr[1] then local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_Decorate) if give and replaceRewardId ~= rewardId then local goodsInfo = skynet.server.bag:GetGoodsInfo(self , dataType.GoodsType_Decorate , arr[2]) if goodsInfo.gainTime then table.insert(conversionInfo,{type = dataType.GoodsType_Decorate , id = arr[2] , count = count ,gainTime = goodsInfo.gainTime}) end local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.bag:AddGoods( self , dataType.GoodsType_Decorate , arr[2] , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Decorate , id = arr[2] , count = count }) log.debug(string.format("玩家 %d 发放装修 %d" , self.userId, arr[2] )) end elseif 3 == arr[1] then skynet.server.bag:AddGoods( self , dataType.GoodsType_Garden , arr[2] , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Garden , id = arr[2] , count = count }) log.debug(string.format("玩家 %d 发放家园物品 %d" , self.userId, arr[2] )) end end --服饰物品 for k, v in pairs( cfgReward.appearanceObject ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if 1 == arr[1] then local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_Clothes) if give and replaceRewardId ~= rewardId then local goodsInfo = skynet.server.bag:GetGoodsInfo(self , dataType.GoodsType_Clothes , arr[2]) if goodsInfo.gainTime then table.insert(conversionInfo,{type = dataType.GoodsType_Clothes , id = arr[2] , count = count ,gainTime = goodsInfo.gainTime}) end local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.bag:AddGoods( self , dataType.GoodsType_Clothes , arr[2] , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Clothes , id = arr[2] , count = count }) end elseif 2 == arr[1] then local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_PetClothes) if give and replaceRewardId ~= rewardId then local goodsInfo = skynet.server.bag:GetGoodsInfo(self , dataType.GoodsType_PetClothes , arr[2]) if goodsInfo.gainTime then table.insert(conversionInfo,{type = dataType.GoodsType_PetClothes , id = arr[2] , count = count ,gainTime = goodsInfo.gainTime}) end local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.bag:AddGoods( self , dataType.GoodsType_PetClothes , arr[2] , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_PetClothes , id = arr[2] , count = count }) end end end --套装物品 for k, v in pairs( cfgReward.suitObject ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if 1 == arr[1] then --家具 local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( self , "Furniture") for k, v in pairs( cfgAllFurniture ) do if arr[2] == v.suitType then skynet.server.bag:AddGoods( self , dataType.GoodsType_Furniture , v.id , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Furniture , id = v.id , count = count }) end end --装修 local cfgAllDecoration = skynet.server.gameConfig:GetPlayerAllCfg( self , "Decoration") for k, v in pairs( cfgAllDecoration ) do if arr[2] == v.suitType then local give,replaceRewardId = self:RewardConversion(v.id , dataType.GoodsType_Decorate) if give and replaceRewardId ~= rewardId then local goodsInfo = skynet.server.bag:GetGoodsInfo(self , dataType.GoodsType_Decorate , v.id) if goodsInfo.gainTime then table.insert(conversionInfo,{type = dataType.GoodsType_Decorate , id = v.id , count = count ,gainTime = goodsInfo.gainTime}) end local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.bag:AddGoods( self , dataType.GoodsType_Decorate , v.id , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Decorate , id = v.id , count = count }) log.debug(string.format("玩家 %d 发放装修 %d" , self.userId, v.id )) end end end log.debug(string.format("玩家 %d 发放家具套装 %d" , self.userId, arr[2] )) elseif 2 == arr[1] then local cfgClothesSuit = skynet.server.gameConfig:GetPlayerAllCfg( self , "ClothesSuit") --获取配置文件ClothesSuit中的数据 local cfgAllClothes = skynet.server.gameConfig:GetPlayerAllCfg( self , "Clothes") --人物 local cfgPetClothes = skynet.server.gameConfig:GetPlayerAllCfg( self , "PetClothes") --宠物 local type = nil for k ,v in pairs(cfgClothesSuit) do if v.id==arr[2] then --获取该套装类型 type = v.type end end if type == 1 then for k, v in pairs( cfgAllClothes ) do if arr[2] == v.suitId then local give,replaceRewardId = self:RewardConversion(v.id , dataType.GoodsType_Clothes) if give and replaceRewardId ~= rewardId then local goodsInfo = skynet.server.bag:GetGoodsInfo(self , dataType.GoodsType_Clothes , v.id) if goodsInfo.gainTime then table.insert(conversionInfo,{type = dataType.GoodsType_Clothes , id = v.id , count = count ,gainTime = goodsInfo.gainTime}) end local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.bag:AddGoods( self , dataType.GoodsType_Clothes , v.id , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Clothes , id = v.id , count = count }) end end end log.debug(string.format("玩家 %d 发放衣服套装 %d" , self.userId, arr[2] * count)) elseif type == 2 then --获取动物服装对应的套装物品 for k ,v in pairs( cfgPetClothes ) do if arr[2] == v.suitId then local give,replaceRewardId = self:RewardConversion(v.id , dataType.GoodsType_PetClothes) if give and replaceRewardId ~= rewardId then local goodsInfo = skynet.server.bag:GetGoodsInfo(self , dataType.GoodsType_PetClothes , v.id) if goodsInfo.gainTime then table.insert(conversionInfo,{type = dataType.GoodsType_PetClothes , id = v.id , count = count ,gainTime = goodsInfo.gainTime}) end local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.bag:AddGoods( self , dataType.GoodsType_PetClothes , v.id , count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_PetClothes , id = v.id , count = count }) end end end log.debug(string.format("玩家 %d 发放宠物套装 %d" , self.userId, arr[2] * count)) end end end --道具类型 for k, v in pairs( cfgReward.ticket ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) skynet.server.bag:AddGoods( self , dataType.GoodsType_Prop , arr[1] , arr[2] * count ) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Prop , id = arr[1] , count = arr[2] * count }) log.debug(string.format("玩家 %d 发放道具 %d 数量 %d" , self.userId, arr[1], arr[2] * count )) end --种子 for k, v in pairs( cfgReward.seed ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) skynet.server.bag:AddGoods( self , dataType.GoodsType_Seed , arr[1] , arr[2] * count) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_Seed , id = arr[1] , count = arr[2] * count }) log.debug(string.format("玩家 %d 发放种子%d 数量 %d" , self.userId, arr[1], arr[2] * count)) end --个人物品 for k, v in pairs( cfgReward.stuff ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if dataType.HeadType_Head == arr[1] then --增加玩家头像 local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_HeadAndHeadFrame) if give and replaceRewardId ~= rewardId then local gainTime = 0 for k1 , v1 in pairs(self.gameData.personal.gainGoodsInfo) do if v1.type == dataType.GoodsType_HeadAndHeadFrame and v1.id == arr[2] then gainTime = v1.gainTime break end end table.insert(conversionInfo,{type = dataType.GoodsType_HeadAndHeadFrame , id = arr[2] , count = count , gainTime = gainTime}) local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.personal:ChangeGainInfo(self , dataType.GoodsType_HeadAndHeadFrame , arr[2] , dataType.HeadType_Head , skynet.server.personal.AddGoods) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_HeadAndHeadFrame , id = arr[2] , count = 1 }) end elseif dataType.HeadType_Frame == arr[1] then --增加玩家头像框 local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_HeadAndHeadFrame) if give and replaceRewardId ~= rewardId then local gainTime = 0 for k1 , v1 in pairs(self.gameData.personal.gainGoodsInfo) do if v1.type == dataType.GoodsType_HeadAndHeadFrame and v1.id == arr[2] then gainTime = v1.gainTime break end end table.insert(conversionInfo,{type = dataType.GoodsType_HeadAndHeadFrame , id = arr[2] , count = count , gainTime = gainTime}) local _,replaceReward = self:GiveReward(replaceRewardId , eventId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(finalRewardInfo,replaceInfo) end end else skynet.server.personal:ChangeGainInfo(self , dataType.GoodsType_HeadAndHeadFrame , arr[2] , dataType.HeadType_Frame , skynet.server.personal.AddGoods) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_HeadAndHeadFrame , id = arr[2] , count = 1 }) end end end --食材 for k, v in pairs( cfgReward.cuisineMaterial ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) skynet.server.bag:AddGoods( self , dataType.GoodsType_CuisineMaterial , arr[1] , arr[2] * count) table.insert(finalRewardInfo,{goodsType = dataType.GoodsType_CuisineMaterial , id = arr[1] , count = arr[2] * count }) log.debug(string.format("玩家 %d 发放食材%d 数量 %d" , self.userId, arr[1], arr[2] * count)) end return conversionInfo , finalRewardInfo end --发奖励并批指定NPC好感度 function Player:GiveRewardNpc( rewardId , npcId , eventId ) --发放其它奖励 self:GiveReward( rewardId , eventId) --增加指定NPC好感度 local cfgReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , rewardId ) if cfgReward.relationValue > 0 then local curNpc = self.gameData.friend[ npcId ] if curNpc then skynet.server.friend:AddFavorability( self , curNpc , cfgReward.relationValue) log.debug(string.format("玩家 %d 增加好感度 %d" , self.userId,cfgReward.relationValue )) end end end --选择一个发奖励 function Player:SelectOneReward( rewardId , rewardIndex , eventId) local data = {} local cfgReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , rewardId ) if cfgReward.coin > 0 and rewardIndex == dataType.MoneyType_Coin then self:MoneyChange( dataType.MoneyType_Coin , cfgReward.coin , eventId) data = { type = dataType.MoneyType_Coin , count = cfgReward.coin } end if cfgReward.mapCoin > 0 and rewardIndex == dataType.MoneyType_Map then self:MoneyChange( dataType.MoneyType_Map , cfgReward.mapCoin , eventId) data = { type = dataType.MoneyType_Map , count = cfgReward.mapCoin } end if cfgReward.voluteCoin > 0 and rewardIndex == dataType.MoneyType_Volute then self:MoneyChange( dataType.MoneyType_Volute , cfgReward.voluteCoin, eventId) data = { type = dataType.MoneyType_Volute , count = cfgReward.voluteCoin } end return data end --获取一次性标记 function Player:GetOnceSign( key ) return self.gameData.onceSign[ key ] end --设置一次性标记 function Player:SetOnceSign( key , value ) self.gameData.onceSign[ key ]= value end --是否为新用户 function Player:IsNewUser() if self.basicInfo.isNewPlayer then return true end return false end --[[增加登陆历史 function Player:AddLoginHistory( player , platform) local data = player.basicInfo.loginHistory data.curIndex = data.curIndex + 1 --最多保存100条 if data.curIndex > 100 then data.curIndex = 1 end data.history[ data.curIndex ] = { serverId = serverId , platform = platform , time = skynet.server.common:GetStrTime(skynet.GetTime())} end ]] --设置开关 function Player:SetSwitch( id , isOpen ) if id <= 0 or "boolean" ~= type( isOpen ) then return false end local switches = self.gameData.switches switches[ id ] = isOpen return true end --获取当前开关 function Player:GetSwitch( id ) if id <= 0 or nil == self.gameData.switches[ id ] then return false end return self.gameData.switches[ id ] end --是否为审核玩家 true为审核玩家 function Player:IsAudit() return self.basicInfo.isAudit end --是否为老苹果用户 true为老苹果用户 function Player:IsOldIOS() return self.basicInfo.isOldIOS end --补偿老苹果用户相关,除了房子单独处理 function Player:CompensateOldIOS() local level = self.gameData.level if self:IsOldIOS() then local oldData = self.gameData.oldData local oldPayCount = self.gameData.oldPayCount or 0 local inviteCount = self.gameData.inviteCount or 0 local mobile = self.basicInfo.mobile if 2 == level then if oldPayCount > 0 then local volute = 0 --补偿蜗壳币 if oldPayCount <= 2000 then --玩家被补偿蜗壳币= 充值金额*20 volute = oldPayCount * 20 elseif oldPayCount > 2000 then --玩家被补偿蜗壳币= (充值金额-2000)*10+2000*20 volute = ((oldPayCount - 2000) * 10 + 40000) end local title = "测试充值返利来咯~" local content = "亲爱的小蜗:\ 非常感谢您在【宅家避暑】和【秋日随心】的Android删档测试期间的陪伴与支持!在此献上您在充值返利活动中所获得的蜗壳币,有效期为30天,请及时查收,避免邮件过期哟~\ \ 具体返利规则如下:\ 根据您在删档测试中的充值总金额,将按照1元=10蜗壳币的标准进行倍率返还\ ①累计充值金额≤2000元的,可获得200%的蜗壳币返还。\ ②累计充值金额>2000元的,2000元以内的部分可获得200%的蜗壳币返还,超出2000元的部分,按照100%的比例进行蜗壳币返还。\ 如有疑问,您可以点击主界面左上角的头像,依次点击右下角的小齿轮-「联系客服」进行咨询。\ \ 最后,由衷地感谢您一直以来对《我的休闲时光》的支持,如在游戏体验过程中想要提出任何意见或建议欢迎在「联系客服」处告诉我们,我们将持续认真倾听每一位小蜗的意见与建议,努力为大家打造更美好的悠悠镇~" local award = {} table.insert( award , { type = 0 , id = dataType.GoodsType_Volute , count = volute }) skynet.server.mail:AddNewMail( self , skynet.server.mail.MailType_Award , title , content , award) end if inviteCount > 0 then local award = {} if inviteCount >= 1 then table.insert( award , { type = dataType.GoodsType_Furniture , id = 732 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Furniture , id = 720 , count = 1 }) end if inviteCount >= 3 and inviteCount <= 4 then table.insert( award , { type = dataType.GoodsType_Clothes , id = 222 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 223 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 224 , count = 1 }) end if inviteCount >= 5 then table.insert( award , { type = dataType.GoodsType_Furniture , id = 729 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Furniture , id = 725 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 222 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 223 , count = 1 }) table.insert( award , { type = dataType.GoodsType_Clothes , id = 224 , count = 1 }) end self.basicInfo.isCompensate = true local title = "说好的官网邀请奖励来咯~" local content = "亲爱的小蜗:\ 非常感谢你对蜗居一直以来的关注与支持!因为你的盛情邀请,悠悠镇迎来了越来越多的小蜗,小镇变得更热闹啦!为表感谢,随信献上邀请奖励一份,记得及时领取哦~\ 如在游戏过程中遇到任何问题或想要提出游戏建议,欢迎在游戏左上角头像处点击小齿轮中的【联系客服】提交你的问题哦!" skynet.server.mail:AddNewMail( self , skynet.server.mail.MailType_Award , title , content , award) end end --补偿存档 if oldData and oldData.coin then if 5 == level then local addCoin = oldData.coin if addCoin >= 0 then local eventId = pb.enum("EnumMoneyChangeEventID","EventID_110") self:MoneyChange( dataType.MoneyType_Coin , addCoin , eventId ) end --家具 for k, v in pairs( oldData.furnitures ) do skynet.server.bag:AddGoodsNoExp( self , dataType.GoodsType_Furniture , v.id , v.count , true ) end --装修 for k, v in pairs( oldData.decorations ) do skynet.server.bag:AddGoodsNoExp( self , dataType.GoodsType_Decorate , v.id , v.count , true) end --人物服装 for k, v in pairs( oldData.clothes ) do skynet.server.bag:AddGoodsNoExp( self , dataType.GoodsType_Clothes , v.id , v.count , true) end --宠物服装 for k, v in pairs( oldData.petClothes ) do skynet.server.bag:AddGoodsNoExp( self , dataType.GoodsType_PetClothes , v.id , v.count , true) end --发放复古四叶套间 local award = {} local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( self , "Furniture") local cfgAllDecoration = skynet.server.gameConfig:GetPlayerAllCfg( self , "Decoration") --找出复古四叶的家具 local suitId = 13 --初始套件的ID for k, v in pairs( cfgAllFurniture ) do if suitId == v.suitType then table.insert( award , { type = dataType.GoodsType_Furniture , id = v.id , count = 1}) end end --找出复古四叶的装修 for k, v in pairs( cfgAllDecoration ) do if suitId == v.suitType then table.insert( award , { type = dataType.GoodsType_Decorate , id = v.id , count = 1}) end end --种子 for k, v in pairs( oldData.seeds ) do skynet.server.bag:AddGoodsNoExp( self , dataType.GoodsType_Seed , v.id , v.count, true) end --植物 for k, v in pairs( oldData.plants ) do skynet.server.bag:AddGoodsNoExp( self , dataType.GoodsType_Plant , v.id , v.count , true) end local title = "初测iOS小蜗的专属补偿" local content = "亲爱的小蜗:\ 在22年的那个秋天,很高兴能与各位小蜗在最初的蜗居里相遇。\ 而在随后的八个月里,因为有你们的支持与陪伴,这个小小蜗居才能让更多小蜗关注到,并逐渐成长为如今的模样。\ 随着开发的不断推进,内容不断扩充,为了给大家带来更好的游戏体验,我们优化修改了部分游戏货币:将之前测试中的货币【四叶草】删除,并加入了其他货币进行补充。\ 但在与大家的交流中,我们了解到许多小蜗在之前的测试中积累了不少四叶草,而由于以上的修改,我们无法同步该数据至正式服,真的非常非常抱歉!QAQ(秃头技术滑跪道歉.jpg)\ 为了补偿参与了第一次iOS测试版的大家,美术小姐姐连夜设计了一套专属套间「复古四叶」献给大家。\ 希望在接下来的蜗居依旧能有你们的陪伴,我们将会持续倾听大家的意见与建议,努力优化游戏内容,争取建造一个更美好的蜗居呀~" skynet.server.mail:AddNewMail( self , skynet.server.mail.MailType_Award , title , content , award) else if oldData.house then for k, v in pairs( oldData.house ) do local houseId = v.id --玩家是还未拥有该房子 , 等级达到了该房子解锁的时间,就把房子赠送s if not skynet.server.house:IsBuyHouse( self , houseId ) then local cfgCurHouse = skynet.server.gameConfig:GetPlayerCurCfg( self , "House" ,houseId ) if cfgCurHouse and level >= cfgCurHouse.level then --免费赠送该房子 skynet.server.house:Add( self , houseId, {} , true ) end end end end end end end end --如果玩家有对应的服装 则换成对应的蜗壳币进行发放 function Player:RewardConversion( id , goodsType) local ownCount = skynet.server.bag:GetGoodsCount(self , goodsType , id) if ownCount == 0 and goodsType ~= dataType.GoodsType_HeadAndHeadFrame then --背包物品可以通过数量判断 return false else if goodsType == dataType.GoodsType_Clothes then local cfgOneClothes = skynet.server.gameConfig:GetPlayerCurCfg( self , "Clothes" , id) --防止死循环 local cfgOneReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , cfgOneClothes.replaceReward) if not cfgOneReward or (next(cfgOneReward.appearanceObject) ~= nil or next(cfgOneReward.suitObject) ~= nil) then return false end return true,cfgOneClothes.replaceReward elseif goodsType == dataType.GoodsType_PetClothes then local cfgOnePetClothes = skynet.server.gameConfig:GetPlayerCurCfg( self , "PetClothes" , id) local cfgOneReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , cfgOnePetClothes.replaceReward) if not cfgOneReward or (next(cfgOneReward.appearanceObject) ~= nil or next(cfgOneReward.suitObject) ~= nil) then return false end return true,cfgOnePetClothes.replaceReward elseif goodsType == dataType.GoodsType_Decorate then local cfgOneDecorate = skynet.server.gameConfig:GetPlayerCurCfg( self , "Decoration" , id) local cfgOneReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , cfgOneDecorate.replaceReward) if not cfgOneReward or (next(cfgOneReward.sceneObject) ~= nil or next(cfgOneReward.suitObject) ~= nil) then return false end return true,cfgOneDecorate.replaceReward elseif goodsType == dataType.GoodsType_HeadAndHeadFrame then --个人物品处理方式不同 local cfgOneHead = skynet.server.gameConfig:GetPlayerCurCfg( self , "Head" , id) local cfgOneReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , cfgOneHead.replaceReward) if not cfgOneReward or next(cfgOneReward.stuff) ~= nil then return false end if cfgOneHead.type == dataType.HeadType_Head then for k , v in pairs(self.gameData.personal.ownHeadIds) do if v == id then return true,cfgOneHead.replaceReward end end elseif cfgOneHead.type == dataType.HeadType_Frame then for k , v in pairs(self.gameData.personal.ownHeadFrameIds) do if v == id then return true,cfgOneHead.replaceReward end end end return false end end end --替换奖励判断 function Player:RewardShow( rewardId , count ) local cfgReward = skynet.server.gameConfig:GetPlayerCurCfg( self , "Reward" , rewardId ) if not cfgReward then return end --奖励集合 local data = {} count = count or 1 if cfgReward.coin > 0 then table.insert(data,{goodsType = dataType.MoneyType_Coin , id = 0 , count = cfgReward.coin * count }) end if cfgReward.mapCoin > 0 then table.insert(data,{goodsType = dataType.MoneyType_Map , id = 0 , count = cfgReward.mapCoin * count }) end if cfgReward.voluteCoin > 0 then table.insert(data,{goodsType = dataType.MoneyType_Volute , id = 0 , count = cfgReward.voluteCoin * count }) end --场景物品 for k, v in pairs( cfgReward.sceneObject ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if 1 == arr[1] then table.insert(data,{goodsType = dataType.GoodsType_Furniture , id = arr[2] , count = count }) elseif 2 == arr[1] then local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_Decorate) if give and replaceRewardId ~= rewardId then local replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_Decorate , id = arr[2] , count = count }) end elseif 3 == arr[1] then table.insert(data,{goodsType = dataType.GoodsType_Garden , id = arr[2] , count = count }) end end --服饰物品 for k, v in pairs( cfgReward.appearanceObject ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if 1 == arr[1] then local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_Clothes) if give and replaceRewardId ~= rewardId then local replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_Clothes , id = arr[2] , count = count }) end elseif 2 == arr[1] then local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_PetClothes) if give and replaceRewardId ~= rewardId then local replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_PetClothes , id = arr[2] , count = count }) end end end --套装物品 for k, v in pairs( cfgReward.suitObject ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if 1 == arr[1] then --家具 local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( self , "Furniture") for k, v in pairs( cfgAllFurniture ) do if arr[2] == v.suitType then table.insert(data,{goodsType = dataType.GoodsType_Furniture , id = v.id , count = count }) end end --装修 local cfgAllDecoration = skynet.server.gameConfig:GetPlayerAllCfg( self , "Decoration") for k, v in pairs( cfgAllDecoration ) do if arr[2] == v.suitType then local give,replaceRewardId = self:RewardConversion(v.id , dataType.GoodsType_Decorate) if give and replaceRewardId ~= rewardId then local replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_Decorate , id = v.id , count = count }) end end end elseif 2 == arr[1] then local cfgClothesSuit = skynet.server.gameConfig:GetPlayerAllCfg( self , "ClothesSuit") --获取配置文件ClothesSuit中的数据 local cfgAllClothes = skynet.server.gameConfig:GetPlayerAllCfg( self , "Clothes") --人物 local cfgPetClothes = skynet.server.gameConfig:GetPlayerAllCfg( self , "PetClothes") --宠物 local type = nil for k ,v in pairs(cfgClothesSuit) do if v.id==arr[2] then --获取该套装类型 type = v.type end end if type == 1 then for k, v in pairs( cfgAllClothes ) do if arr[2] == v.suitId then local give,replaceRewardId = self:RewardConversion(v.id , dataType.GoodsType_Clothes) if give and replaceRewardId ~= rewardId then local replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_Clothes , id = v.id , count = count }) end end end elseif type == 2 then --获取动物服装对应的套装物品 for k ,v in pairs( cfgPetClothes ) do if arr[2] == v.suitId then local give,replaceRewardId = self:RewardConversion(v.id , dataType.GoodsType_PetClothes) if give and replaceRewardId ~= rewardId then local replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_PetClothes , id = v.id , count = count }) end end end end end end --道具类型 for k, v in pairs( cfgReward.ticket ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) table.insert(data,{goodsType = dataType.GoodsType_Prop , id = arr[1] , count = arr[2] * count }) end --种子 for k, v in pairs( cfgReward.seed ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) table.insert(data,{goodsType = dataType.GoodsType_Seed , id = arr[1] , count = arr[2] * count }) end --个人物品 for k, v in pairs( cfgReward.stuff ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if dataType.HeadType_Head == arr[1] then --增加玩家头像 local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_HeadAndHeadFrame) if give and replaceRewardId ~= rewardId then local replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_HeadAndHeadFrame , id = arr[2] , count = 1 }) end elseif dataType.HeadType_Frame == arr[1] then --增加玩家头像框 local give,replaceRewardId = self:RewardConversion(arr[2] , dataType.GoodsType_HeadAndHeadFrame) if give and replaceRewardId ~= rewardId then local _,replaceReward = self:RewardShow(replaceRewardId , count) if replaceReward ~= nil and next(replaceReward) ~= nil then for i, replaceInfo in pairs( replaceReward ) do table.insert(data,replaceInfo) end end else table.insert(data,{goodsType = dataType.GoodsType_HeadAndHeadFrame , id = arr[2] , count = 1 }) end end end --食材 for k, v in pairs( cfgReward.cuisineMaterial ) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) table.insert(data,{goodsType = dataType.GoodsType_CuisineMaterial , id = arr[1] , count = arr[2] * count }) end return data end --计算游戏时间 function Player:CalcGameTime( nowTime ) local gameTime = nowTime - self.tmpData.intoTime self.basicInfo.allGameTime = self.basicInfo.allGameTime + gameTime self.gameData.todayGain.todayGameTime = self.gameData.todayGain.todayGameTime + gameTime self:AddLastWeekGameTime( nowTime ,gameTime ) self.tmpData.intoTime = nowTime end --添加上一周的游戏时间(秒) function Player:AddLastWeekGameTime( nowTime , addTime ) local preStartTime,preEndTime = skynet.server.common:GetPreSomeDay( 7 ) --获取7天前的时间戳 local lastWeekGameTime = self.basicInfo.lastWeekGameTime local isExist = false for k, v in pairs( lastWeekGameTime ) do if v.recordTime >= preEndTime then --记录时间已经超过7天,删除 table.remove(lastWeekGameTime, k) elseif skynet.server.common:IsSameDay( nowTime , v.recordTime ) then --累加到今天的游戏时间 v.count = v.count + addTime isExist = true break end end if not isExist then --今天不存在时间,就加进去 table.insert( lastWeekGameTime , { recordTime = nowTime , count = addTime } ) end --更新一下上一周的游戏时间到个人信息 local newGameTime = 0 for k, v in pairs( lastWeekGameTime ) do newGameTime = newGameTime + v.count end skynet.server.personal:SetDetail( "lastWeekGameTime" , newGameTime ) end --添加保存等级 isForceSave 是否强制保存 function Player:AddSaveLevel( saveLevel , isForceSave ) isForceSave = isForceSave or false if dataType.SaveLevel_Pay == self.tmpData.saveLevel and not isForceSave then --如果玩家此时的保存等级为SaveLevel_Pay,其余的保存等级不用处理 return end self.tmpData.saveLevel = saveLevel end return Player