CreateRole.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. ----------------------
  2. -- 创角相关逻辑
  3. ----------------------
  4. local Config = require("Config")
  5. local PlayerNamesExcel = require("excel.playerNames")
  6. local CommonDB = require("common.CommonDB")
  7. local Lang = require("common.Lang")
  8. local FilterUtil = require("common.FilterUtil")
  9. local Log = require("common.Log")
  10. local LogDefine = require("common.LogDefine")
  11. local CommonDefine = require("common.CommonDefine")
  12. local Msg = require("core.Msg")
  13. local ObjHuman = require("core.ObjHuman")
  14. local RoleDBLogic = require("role.RoleDBLogic")
  15. local RoleHeadLogic = require("role.RoleHeadLogic")
  16. local Broadcast = require("broadcast.Broadcast")
  17. local RoleExcel = require("excel.role")
  18. local HeroExcel = require("excel.hero")
  19. local ReportManager = require("platform.ReportManager")
  20. local HeroLogic = require("hero.HeroLogic")
  21. local RelationGiftLogic = require("present.RelationGiftLogic")
  22. local CombatDefine = require("combat.CombatDefine")
  23. local CombatPosLogic = require("combat.CombatPosLogic")
  24. local SysParameter = require("common.SysParameter")
  25. local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
  26. local MailExcel = require("excel.mail")
  27. local MailManager = require("mail.MailManager")
  28. local TriggerLogic = require("trigger.TriggerLogic")
  29. local TriggerDefine = require("trigger.TriggerDefine")
  30. local RoleStorageBox = require("roleSystem.RoleStorageBox")
  31. local DataCache = require("core.DataCache")
  32. local ROLE_NAME_LEN_MAX = 21
  33. local ROLE_NAME_LEN_MIN = 5
  34. local OP_RET_SUCC = 1
  35. local OP_RET_FAIL = 0
  36. local GodsAreaNS
  37. local AnotherWorldBattleNS
  38. -- 特定渠道用户创角时发送的邮件ID
  39. local NEW_ROLE_MAIL_ID = 7023
  40. -- 特定渠道列表
  41. local TARGET_CHANNEL_ARRAY = {1, 9}
  42. -- 用于公会渠道创角时发送奖励邮件的邮件Id
  43. local CHANNEL_GUILD_MAIL_ID = 7037
  44. -- 公会渠道创角奖励
  45. local channel_guild_createRole_rewards = {{102,8888}, {124,20}, {1208,2}, {111,1000000}, {112,1000}, {101,2000000}, {510,4}}
  46. local function sendMail(human, mailId, items)
  47. local mailCfg = MailExcel.mail[mailId]
  48. if not mailCfg then
  49. return
  50. end
  51. MailManager.add(MailManager.SYSTEM, human.db._id, mailCfg.title, mailCfg.content, items, mailCfg.senderName or "GM")
  52. end
  53. -- 生成一个11位的全局不重复的数字组成的id
  54. -- 规则 前6位服务器index 后五位自增id
  55. function genIdentity()
  56. local firstStr= Config.SVR_INDEX
  57. local nowMax = CommonDB.getIdentityMax()
  58. nowMax = nowMax + 1
  59. CommonDB.setIdentityMax(nowMax)
  60. return firstStr .. "" .. nowMax
  61. end
  62. function getFakeIdentityMax()
  63. local firstStr= Config.SVR_INDEX
  64. local id = CommonDB.getFakeIdentityMax()
  65. return firstStr .. string.format("%05d", id)
  66. end
  67. local function checkRoleName(roleName, default)
  68. --如果roleName是nil 游戏名不能为空
  69. if not roleName then
  70. return false, Lang.CREATE_ROLE_FAIL_NAME_NIL
  71. end
  72. local nameLen = string.len(roleName)
  73. --如果游戏名长度小于游戏名最小长度 角色名过短
  74. if nameLen < ROLE_NAME_LEN_MIN then
  75. return false, Lang.CREATE_ROLE_FAIL_NAME_LEN1
  76. end
  77. --如果游戏名长度大于游戏名最小长度 角色名过长
  78. if nameLen > ROLE_NAME_LEN_MAX then
  79. return false, Lang.CREATE_ROLE_FAIL_NAME_LEN2
  80. end
  81. if default == nil then
  82. --如果游戏名中包含非法字符 角色名中有非法字符
  83. if roleName ~= FilterUtil.filterName(roleName) then
  84. return false, Lang.CREATE_ROLE_FAIL_NAME_SHIELD
  85. end
  86. end
  87. --角色名已经存在
  88. if RoleDBLogic.isNameExistInDB(roleName) then
  89. return false, Lang.CREATE_ROLE_FAIL_NAME_DUPLICATE
  90. end
  91. return true
  92. end
  93. function creatFakeDb(account, serverTag)
  94. local db = RoleDBLogic.createDefaultRole(account, serverTag)
  95. local identity = genIdentity()
  96. db.identity = identity
  97. db.name = account
  98. return db
  99. end
  100. -- 创角时针对渠道的额外处理
  101. local function channelHandle(human)
  102. -- 特定渠道用户创角时发送的邮件
  103. if table.find(TARGET_CHANNEL_ARRAY, human.phpChanelID) then
  104. sendMail(human, NEW_ROLE_MAIL_ID)
  105. end
  106. -- 公会渠道创角时发送奖励邮件
  107. if human.phpChanelID == CommonDefine.CHANNEL_TAG_GUILD1 or human.phpChanelID == CommonDefine.CHANNEL_TAG_GUILD2 then
  108. sendMail(human, CHANNEL_GUILD_MAIL_ID, channel_guild_createRole_rewards)
  109. end
  110. end
  111. function createNewRole(human)
  112. if _G.is_middle == true then
  113. return
  114. end
  115. -- if human.db or RoleDBLogic.isAccountExistInDB(human.account, human.serverTag) then
  116. -- assert(nil)
  117. -- return
  118. -- end
  119. if human.db or RoleDBLogic.isNewUniqueTagExistInDB(human.phpChanelID, human.account, human.serverTag) then
  120. assert(nil)
  121. return
  122. end
  123. human.db = RoleDBLogic.createDefaultRole(human.phpChanelID, human.account, human.serverTag)
  124. -- 保存数据
  125. human.db.name = human.account
  126. local identity = genIdentity()
  127. human.db.identity = identity
  128. -- 测试 临时增加,用于防沉迷测试
  129. human.db.age = 20
  130. ----------
  131. -- 给角色的月光包盒中添加一定数量的道具
  132. RoleStorageBox.FillStorageBox(human)
  133. RelationGiftLogic.relationCreate(human)
  134. ObjHuman.initHuman(human)
  135. ObjHuman.save(human)
  136. ObjHuman.onLogin(human, true)
  137. createRoleSettingUp(human)
  138. DataCache.Insert_PlayerUuidList(human.db._id, human.db.lv)
  139. channelHandle(human)
  140. ReportManager.register(human)
  141. end
  142. -- 改名操作结果
  143. CHANGE_NAME_RET_FAIL = 0 -- 失败
  144. CHANGE_NAME_RET_OK = 1 -- 成功,首次改名
  145. CHANGE_NAME_RET_OK2 = 2 -- 成功,非首次改名
  146. CHANGE_NAME_COST = 200
  147. function changeName(human, roleName)
  148. local msgRet = Msg.gc.GC_ROLE_CHANGE_NAME
  149. msgRet.ret = CHANGE_NAME_RET_FAIL
  150. local isOk, tip = checkRoleName(roleName)
  151. if not isOk then
  152. msgRet.tip = tip
  153. Msg.send(msgRet, human.fd)
  154. return
  155. end
  156. if not human.db.changeNameCnt then
  157. human.db.changeNameCnt = 1
  158. else
  159. if human.db.zuanshi < CHANGE_NAME_COST then
  160. msgRet.tip = Lang.COMMON_NO_ZUANSHI
  161. Msg.send(msgRet, human.fd)
  162. return
  163. end
  164. human.db.changeNameCnt = human.db.changeNameCnt + 1
  165. ObjHuman.decZuanshi(human, -CHANGE_NAME_COST, "change_name")
  166. end
  167. ObjHuman.onlineHuman[human.db.name] = nil
  168. ObjHuman.onlineHuman[roleName] = human
  169. human.db.name = roleName
  170. ObjHuman.save(human)
  171. msgRet.ret = CHANGE_NAME_RET_OK
  172. if human.db.changeNameCnt > 1 then
  173. msgRet.ret = CHANGE_NAME_RET_OK2
  174. end
  175. msgRet.tip = "ok"
  176. Msg.send(msgRet, human.fd)
  177. TriggerLogic.PublishEvent(TriggerDefine.CHANGE_NAME, human.db._id, 1)
  178. GodsAreaNS = GodsAreaNS or require("godsArea.GodsAreaNS")
  179. GodsAreaNS.UpdateShowData(human, 1)
  180. AnotherWorldBattleNS = AnotherWorldBattleNS or require("anotherWorldBattle.AnotherWorldBattleNS")
  181. AnotherWorldBattleNS.PlayerChangeName(human)
  182. if human.db.changeNameCnt == 1 then
  183. -- Log.write(Log.LOGID_OSS_REGISTER, human.db._id, human.db.account, human.db.name, human.ip,human.pf or "",human.appid, human.db.changeNameCnt)
  184. -- Log.write(Log.LOGID_OSS_CREATELOSS,human.db.account, human.db.name, LogDefine.HUMAN_LOST.CREATE_NAME_FINISH, human.db.ip,human.pf or "",human.appid, human.phpChanelID)
  185. -- ReportManager.create(human)
  186. -- Log.write(Log.LOGID_OSS_LOGIN, human.db._id, human.db.account, human.db.name, human.db.lv, human.db.ip)
  187. Log.write(Log.LOGID_OSS_REGISTER, human.db._id, human.db.newUniqueTag, human.db.name, human.ip,human.pf or "",human.appid, human.db.changeNameCnt)
  188. Log.write(Log.LOGID_OSS_CREATELOSS,human.db.newUniqueTag, human.db.name, LogDefine.HUMAN_LOST.CREATE_NAME_FINISH, human.db.ip,human.pf or "",human.appid, human.phpChanelID)
  189. ReportManager.create(human)
  190. Log.write(Log.LOGID_OSS_LOGIN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, human.db.ip)
  191. end
  192. end
  193. -- 改名查询
  194. function changeNameQuery(human)
  195. local msgRet = Msg.gc.GC_ROLE_CHANGE_NAME_QUERY
  196. if human.db.changeNameCnt == nil then
  197. msgRet.price = 0
  198. --Log.write(Log.LOGID_OSS_CREATELOSS,human.db.account, human.db.name, LogDefine.HUMAN_LOST.SHOW_NAME_PANEL, human.db.ip,human.pf or "",human.appid, human.phpChanelID)
  199. Log.write(Log.LOGID_OSS_CREATELOSS,human.db.newUniqueTag, human.db.name, LogDefine.HUMAN_LOST.SHOW_NAME_PANEL, human.db.ip,human.pf or "",human.appid, human.phpChanelID)
  200. else
  201. msgRet.price = CHANGE_NAME_COST
  202. end
  203. Msg.send(msgRet,human.fd)
  204. end
  205. function randomName(human, sex)
  206. local msgRet = Msg.gc.GC_ROLE_RANDOM_NAME
  207. msgRet.sex = sex
  208. msgRet.name = getRandomName(sex)
  209. Msg.send(msgRet, human.fd)
  210. end
  211. function getRandomName(sex)
  212. if not sex then
  213. sex = math.random(1, 2)
  214. end
  215. local random1 = math.random(1, #PlayerNamesExcel.xing)
  216. if sex == 1 then
  217. local random2 = math.random(1, #PlayerNamesExcel.name)
  218. return PlayerNamesExcel.xing[random1].xing..PlayerNamesExcel.name[random2].name
  219. else
  220. local random2 = math.random(1, #PlayerNamesExcel.name2)
  221. return PlayerNamesExcel.xing[random1].xing..PlayerNamesExcel.name2[random2].name
  222. end
  223. end
  224. -- 创角时修改角色信息
  225. function createRoleChangeInfo(human,name,sex,firendCode)
  226. local msgRet = Msg.gc.GC_ROLE_CREATE_ROLE_CHANGE_MSG
  227. local isOk = checkRoleName(name)
  228. if isOk == false then
  229. msgRet.ret = 1
  230. Msg.send(msgRet,human.fd)
  231. return
  232. end
  233. -- 创角
  234. if not human.db.changeNameCnt then
  235. human.db.changeNameCnt = 0
  236. else
  237. if human.db.zuanshi < CHANGE_NAME_COST then
  238. msgRet.ret = 1
  239. Msg.send(msgRet, human.fd)
  240. return
  241. end
  242. human.db.changeNameCnt = human.db.changeNameCnt + 1
  243. ObjHuman.decZuanshi(human, -CHANGE_NAME_COST, "change_name")
  244. end
  245. ObjHuman.onlineHuman[human.db.name] = nil
  246. ObjHuman.onlineHuman[name] = human
  247. human.db.name = name
  248. human.db.sex = sex
  249. RoleHeadLogic.setHead(human, sex, RoleHeadLogic.HEAD_TYPE_1)
  250. ObjHuman.save(human)
  251. ChatPaoMaLogic.loginTips(human)
  252. -- 好友推荐 todo
  253. RelationGiftLogic.relationBind(human, firendCode)
  254. msgRet.ret = 0
  255. Msg.send(msgRet,human.fd)
  256. -- 记录流失日志
  257. if human.db.changeNameCnt == 0 then
  258. -- Log.write(Log.LOGID_OSS_REGISTER, human.db._id, human.db.account, human.db.name, human.ip,human.pf or "",human.appid, human.db.changeNameCnt)
  259. -- Log.write(Log.LOGID_OSS_CREATELOSS,human.db.account, human.db.name, LogDefine.HUMAN_LOST.CREATE_NAME_FINISH, human.db.ip,human.pf or "",human.appid, human.phpChanelID)
  260. -- ReportManager.create(human)
  261. -- Log.write(Log.LOGID_OSS_LOGIN, human.db._id, human.db.account, human.db.name, human.db.lv, human.db.ip)
  262. Log.write(Log.LOGID_OSS_REGISTER, human.db._id, human.db.newUniqueTag, human.db.name, human.ip,human.pf or "",human.appid, human.db.changeNameCnt)
  263. Log.write(Log.LOGID_OSS_CREATELOSS,human.db.newUniqueTag, human.db.name, LogDefine.HUMAN_LOST.CREATE_NAME_FINISH, human.db.ip,human.pf or "",human.appid, human.phpChanelID)
  264. ReportManager.create(human)
  265. Log.write(Log.LOGID_OSS_LOGIN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, human.db.ip)
  266. end
  267. end
  268. function createRoleSettingUp(human)
  269. -- 赠送新英雄 上阵
  270. local heroId = SysParameter.getSysParameter(SysParameter.PARAMETER_8)
  271. if heroId and heroId ~= 0 then
  272. local bagIndex, uuid = HeroLogic.addHero(human, heroId,nil, 1, "create_role")
  273. if bagIndex and uuid and type(uuid) == "string" then
  274. local msg = {}
  275. msg.type = CombatDefine.COMBAT_TYPE1
  276. msg.formation = 1
  277. msg.heroList = "0,"..uuid
  278. msg.helpList = ""
  279. msg.jibanList = ""
  280. CombatPosLogic.updatePos(human, msg)
  281. end
  282. end
  283. end
  284. RANDOM_HEAD_ID_TABLE = nil
  285. function getRandomHead()
  286. if RANDOM_HEAD_ID_TABLE == nil then
  287. RANDOM_HEAD_ID_TABLE = {}
  288. for k, v in pairs(RoleExcel.head) do
  289. RANDOM_HEAD_ID_TABLE[#RANDOM_HEAD_ID_TABLE + 1] = k
  290. end
  291. end
  292. local index = math.random(1, #RANDOM_HEAD_ID_TABLE)
  293. return RANDOM_HEAD_ID_TABLE[index]
  294. end
  295. RANDOM_HEADFRAME_ID_TABLE = nil
  296. function getRandomHeadFrame()
  297. if RANDOM_HEADFRAME_ID_TABLE == nil then
  298. RANDOM_HEADFRAME_ID_TABLE = {}
  299. for k, v in pairs(RoleExcel.headFrame) do
  300. RANDOM_HEADFRAME_ID_TABLE[#RANDOM_HEADFRAME_ID_TABLE + 1] = k
  301. end
  302. end
  303. local index = math.random(1, #RANDOM_HEADFRAME_ID_TABLE)
  304. return RANDOM_HEADFRAME_ID_TABLE[index]
  305. end
  306. RANDOM_BODY_ID_TABLE = nil
  307. function getRandomBody()
  308. if RANDOM_BODY_ID_TABLE == nil then
  309. RANDOM_BODY_ID_TABLE = {}
  310. for id, v in pairs(HeroExcel.hero) do
  311. if id > 100000 and id < 600000 and v.grade >= 2 and RoleExcel.body[id] then
  312. RANDOM_BODY_ID_TABLE[#RANDOM_BODY_ID_TABLE + 1] = id
  313. end
  314. end
  315. end
  316. local index = math.random(1, #RANDOM_BODY_ID_TABLE)
  317. return RANDOM_BODY_ID_TABLE[index]
  318. end