private void Game_QA_Thread(object obj) { while (true) { if (!m_QAStop) { //check time if (IsTaskTime()) { answerResult.Clear(); while (m_QACount < m_MaxQuesNum) { if (m_QACount == 0) { SendWorldWords("三国知识竞答即将开始!请各位玩家做好答题准备,找个安静的地图或者关闭不需要的频道"); Thread.Sleep(10 * 1000); SendWorldWords("最先给出正确答案者获得积分,答题需在军团或者军团互通中,发送且仅发送正确选项,否则答题将会被认为无效而过滤。"); Thread.Sleep(20 * 1000); SendWorldWords("答题开始!"); Thread.Sleep(2 * 1000); } SingleAQHandle(1, m_PlayerDat, m_SanVtSql); } m_IsTaskTime = false; //遍历参与者列表排名 answerResult.Sort(new Comparison <AnswerResult_S>(AnswerResultCompare)); if (answerResult.Count <= 0) { string msg = "很遗憾,本次答题无人优胜!"; LogHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd") + @"答题日志.txt", msg); SendWorldWords(msg); } else { int num = 0; List <AnswerResult_S> ff = new List <AnswerResult_S>(); AnswerResult_S tmp = new AnswerResult_S(); tmp.score = 0; for (int i = 0; i < answerResult.Count; i++) { if (tmp.score == answerResult[i].score) { tmp.name += "," + answerResult[i].name; ff[num - 1] = tmp; } else { tmp = answerResult[i]; ff.Add(tmp); num++; } } int best = ff.Count > 3 ? 3 : ff.Count; for (int i = 0; i < best; i++) { string msg = "第" + (i + 1) + "名 总得分:" + ff[i].score + " 玩家 " + ff[i].name + "。"; LogHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd") + @"答题日志.txt", msg); //公告 SendWorldWords(msg); } for (int i = 0; i < best; i++) { //发放虚宝 CPlayerCtrl.PlayersAttrListClear(); CPlayerCtrl.LoadPlayerInfos(m_PlayerDat, true); var players = ff[i].name.Split(','); foreach (var player in players) { if (!string.IsNullOrEmpty(player)) { string account = CPlayerCtrl.GetAccByName(player); if (m_TaskRewardString.Count > 0) { int vtid1 = 0; int vtid2 = 0; int vtid3 = 0; int vtid4 = 0; int vtid5 = 0; int vtcount1 = 0; int vtcount2 = 0; int vtcount3 = 0; int vtcount4 = 0; int vtcount5 = 0; string[] rewards = m_TaskRewardString[i].Split(';'); //1,木剑,1 for (int ii = 0; ii <= rewards.Length; ii++) { var detials = rewards[ii].Split(','); if (ii == 0) { vtid1 = int.Parse(detials[0]); vtcount1 = int.Parse(detials[2]); } else if (ii == 1) { vtid2 = int.Parse(detials[0]); vtcount2 = int.Parse(detials[2]); } else if (ii == 2) { vtid3 = int.Parse(detials[0]); vtcount3 = int.Parse(detials[2]); } else if (ii == 3) { vtid4 = int.Parse(detials[0]); vtcount4 = int.Parse(detials[2]); } else if (ii == 4) { vtid5 = int.Parse(detials[0]); vtcount5 = int.Parse(detials[2]); } } if (vtid1 != 0 || vtid2 != 0 || vtid3 != 0 || vtid4 != 0 || vtid5 != 0) { bool vtret = CSGHelper.InsertSanvtItem(m_SanVtSql, account , (uint)vtid1, (uint)vtcount1, (uint)vtid2, (uint)vtcount2, (uint)vtid3, (uint)vtcount3, (uint)vtid4, (uint)vtcount4, (uint)vtid5, (uint)vtcount5); if (vtret) { string answerEx = "角色:" + player + " 答题奖励已经发放,请注意查收(虚宝)!"; //日志 LogHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd") + "答题日志.txt", answerEx); } } } else { //发放虚宝 bool vtret = CSGHelper.InsertSanvtItem(m_SanVtSql, account, (uint)m_AnswerVtId, 1, 0, 0, 0, 0, 0, 0, 0, 0); if (vtret) { string answerEx = "角色:" + player + " 答题奖励已经发放,请注意查收(虚宝)!"; //日志 LogHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd") + "答题日志.txt", answerEx); } } } } } //公告 SendWorldWords("排名奖励已经发放,请注意查收(虚宝)!"); answerResult.Clear(); } } else { if (m_SleepCount >= m_AskNormalInterval)//60 * { m_SleepCount = 0; SingleAQHandle(0, m_PlayerDat, m_SanVtSql); } Thread.Sleep(1000); m_SleepCount++; } } else { m_QAARE.WaitOne(); } } }
private void btn_SavePlus_Click(object sender, EventArgs e) { //保证数据库已经连接 if (!sqlConn) { MessageBox.Show("请先链接数据库!"); return; } if (!subDirSet || !mainDirSet) { MessageBox.Show("请先选择主、副档路径!"); return; } if (!sqlPlus) { MessageBox.Show("请合并数据库!"); return; } lbl_SavePlusStatus.Text = "正在合并.."; bool ret = false; //合并player.dat m_MainCPlayerCtrl.LoadPlayerInfos(); m_SubCPlayerCtrl.LoadPlayerInfos(); m_MainCUidCtrl.LoadInfo(); //List<AccAttr> mainList = m_MainCPlayerCtrl.GetPlayersAttrList(); List <AccAttr> subList = m_SubCPlayerCtrl.GetPlayersAttrList(); UInt32 startIndex = 0; UInt32 startUid = 0; UInt32 starAccId = 0; startIndex = m_MainCPlayerCtrl.GetLastIndex(); startUid = m_MainCUidCtrl.GetLastUid(); //最好从数据库获取 starAccId = m_MainCUidCtrl.GetLastAccId(); if (startIndex < 0 || startUid < 0 || starAccId < 0) { lbl_SavePlusStatus.Text = "正在失败.."; MessageBox.Show("发送错误!"); return; } try { foreach (var acc in subList) { AccAttr newAcc = new AccAttr(); newAcc = acc; //重新计算nIndex startIndex = startIndex + 1; newAcc.nIndex = startIndex; //查询当前账户是否已经存在 bool accountExit = false; AccAttr player; accountExit = m_MainCPlayerCtrl.AccountExit(newAcc.Account, out player); if (accountExit) {//如果当前账户已经存在,则添加uid的账户指向 //遍历uid列表,找到该数据,将此nIndex加入对应的角色位 m_MainCUidCtrl.AddSubPlayer(player.nAccId, startIndex); newAcc.nAccId = player.nAccId; } else { //如果不存在 则添加uid 并且acc_id插入数据库 startUid = startUid + 1; starAccId = starAccId + 1; newAcc.nAccId = starAccId; //uid列表添加, 使能第一角色位, uid index + 1, 生成的acc_id对应加入且加入数据库 m_MainCUidCtrl.AddPlayerUid(newAcc.nAccId, startUid, startIndex); //starAccId插入数据库 string sqlLine = ""; string sqlAccount = System.Text.Encoding.ASCII.GetString(newAcc.Account); sqlAccount = sqlAccount.Replace("\0", ""); sqlLine = @"set identity_insert " + txt_MainSqlAccount.Text + @".dbo.game_acc_id ON insert into " + txt_MainSqlAccount.Text + ".dbo.game_acc_id(id,account) values (" + starAccId + ",'" + sqlAccount + @"') set identity_insert " + txt_MainSqlAccount.Text + ".dbo.game_acc_id OFF"; ret = m_MainSQLConn.SqlCommand(sqlLine); if (!ret) { btn_SavePlus.Enabled = false; lbl_SavePlusStatus.Text = "正在失败.."; MessageBox.Show("Acc_Id插入数据库失败!,请恢复数据库和档案后重启工具重试"); return; } } //判断当前角色名字是否被使用 ret = m_MainCPlayerCtrl.NameExit(newAcc.Name); if (ret) {//存在,则修改此名字 //这里需要保证长度问题 newAcc.Name = CPlayerCtrl.ReName(newAcc.Name); } //可装备次数 + 1 newAcc = CPlayerCtrl.DoAddEquipIimes(newAcc); //添加 m_MainCPlayerCtrl.AddPlayer(newAcc); } ret = m_MainCPlayerCtrl.SavePlayerInfos(); m_MainCUidCtrl.SaveInfos(); } catch (Exception ex) { MessageBox.Show(ex.Message); ret = false; } try { } catch (Exception ex) { MessageBox.Show(ex.Message); ret = false; } if (!ret) { btn_SavePlus.Enabled = false; lbl_SavePlusStatus.Text = "合并失败.."; MessageBox.Show("合并Player.dat失败!请恢复数据库和档案后重启工具重试"); } else { btn_SavePlus.Enabled = false; lbl_SavePlusStatus.Text = "合并成功.."; MessageBox.Show("合并Player.dat成功,生成的player.dat和uid.dat保存在new目录下!"); } }
private bool SingleAQHandle(int flag, string player_dat, string sanvt) { long tick = DateTime.Now.Ticks; Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32)); List <BankItem> list = bankHandle.GetBankItemList(); int n = ran.Next(0, bankHandle.GetBankItemCount()); BankItem item; bool ret = bankHandle.GetItem(n, out item); string tmp = ""; string nextQues = ""; if (flag == 0)//普通 { tmp = "在线问答题:"; nextQues = " 约" + m_AskNormalInterval / 60 + "分钟后开始下一题,请关注公屏提问!"; } else //系列 { m_QACount++; tmp = "第" + m_QACount + "题:"; nextQues = " 十秒后开始下一题,请做好准备!"; } string t_start, t_end; SendWorldWords(tmp + item.question); //记录发题时间 //2017-01-02 13:01:47.000 System.DateTime.Now.ToString("f"); //2008-4-24 16:30:15 t_start = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Thread.Sleep(m_QuesInterval * 1000); //记录结尾时间 t_end = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //查询数据库 List <LogSearch> logList = CSGHelper.SearchLogMsg(item.answer, t_start, t_end); string answerEx = ""; if (logList.Count > 0) { LogSearch firtItem = logList[0]; answerEx = "恭喜 " + firtItem.name + " 抢答成功"; if (flag == 0) { CPlayerCtrl.PlayersAttrListClear(); CPlayerCtrl.LoadPlayerInfos(player_dat, true); string account = CPlayerCtrl.GetAccByName(firtItem.name); //发放虚宝 if (m_NormalRewardItems.Count() > 0) { int rewardIdex = ran.Next(0, m_NormalRewardItems.Count()); int AnswerVtId = int.Parse(m_NormalRewardItems[rewardIdex].id); string AnswerVtName = m_NormalRewardItems[rewardIdex].name; bool vtret = CSGHelper.InsertSanvtItem(sanvt, account, (uint)AnswerVtId, 1, 0, 0, 0, 0, 0, 0, 0, 0); if (vtret) { answerEx += " 答题奖励 " + AnswerVtName + " 已经发放,请注意查收(虚宝)!"; } //日志 LogHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd") + "答题日志.txt", answerEx); } else { int AnswerVtId = m_AnswerVtId; string AnswerVtName = m_AnswerVtName; bool vtret = CSGHelper.InsertSanvtItem(sanvt, account, (uint)AnswerVtId, 1, 0, 0, 0, 0, 0, 0, 0, 0); if (vtret) { answerEx += " 答题奖励 " + AnswerVtName + " 已经发放,请注意查收(虚宝)!"; } //日志 LogHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd") + "答题日志.txt", answerEx); } } else { //日志 LogHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd") + "答题日志.txt", answerEx); //遍历参与者列表 AnswerResult_S newNode; bool found = false; for (int i = 0; i < answerResult.Count; i++) { if (answerResult[i].name == firtItem.name) { newNode = answerResult[i]; newNode.score++; answerResult[i] = newNode; found = true; break; } } if (!found)//未找到 { //add newNode.name = firtItem.name; newNode.score = 1; answerResult.Add(newNode); } } } else { answerEx = "很遗憾,无人能正确答对此题"; } SendWorldWords("答案是:" + item.answer + " " + answerEx + nextQues); Thread.Sleep(10 * 1000); return(true); }