diff --git a/Dps_A/BaseClass/MysqlClass/MysqlClass.nut b/Dps_A/BaseClass/MysqlClass/MysqlClass.nut index 232f161..7f326ec 100644 --- a/Dps_A/BaseClass/MysqlClass/MysqlClass.nut +++ b/Dps_A/BaseClass/MysqlClass/MysqlClass.nut @@ -73,7 +73,7 @@ class Mysql extends Base_C_Object { //转为blob local blob = Sq_Point2Blob(intSizePoint, 4); //读取8位有符号整数 - local result = blob.readn('c'); + local result = blob.readn('i'); Sq_Delete_Point(intSizePoint); return result; } diff --git a/Dps_A/CallBack/Gm_Input.nut b/Dps_A/CallBack/Gm_Input.nut index b2647de..67751fb 100644 --- a/Dps_A/CallBack/Gm_Input.nut +++ b/Dps_A/CallBack/Gm_Input.nut @@ -255,6 +255,51 @@ function TestCronTask(str) { Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) { + // local MoveSUser = World.GetUserByUidCid(2, 2); + // local Pack = Packet(); + // Pack.Put_Header(0, 22); + // Pack.Put_Short(MoveSUser.GetUniqueId()); + // Pack.Put_Short(500); + // Pack.Put_Short(200); + // Pack.Put_Byte(1); + // Pack.Put_Short(0); + // Pack.Finalize(true); + // SUser.Send(Pack); + // Pack.Delete(); + + local Pack = Packet(); + Pack.Put_Header(0, 23); + Pack.Put_Short(SUser.GetUniqueId()); //唯一id + Pack.Put_Byte(SUser.GetLocation().Town); //城镇 + + Pack.Delete(); + + // local RealList = [World.GetUserByUidCid(2, 2), World.GetUserByUidCid(1, 1)]; + + // foreach(_Index, Value in RealList) { + // local SUser = Value; + // local Pack = Packet(); + // Pack.Put_Header(0, 24); + // Pack.Put_Byte(2); //城镇 + // Pack.Put_Byte(0); //区域 + // Pack.Put_Short((RealList.len() - 1)); //几个玩家 要减去自己 + // foreach(__Index, MapObj in RealList) { + // // if (SUser.GetUID() == MapObj.GetUID()) continue; + // Pack.Put_Short(MapObj.GetUniqueId()); + // Pack.Put_Short(MapObj.GetAreaPos().X); + // Pack.Put_Short(MapObj.GetAreaPos().Y); + // Pack.Put_Byte(MapObj.GetDirections()); //朝向 + // Pack.Put_Byte(MapObj.GetVisibleValues()); //是否可见 + // } + // Pack.Put_Byte(1); //是否可见 + // Pack.Finalize(true); + + // foreach(vavava in RealList) { + // vavava.Send(Pack); + // } + // Pack.Delete(); + // } + // Timer.SetCronTask(TestCronTask, "1/0/0/0", "测试字符串参数"); // print("注册任务"); diff --git a/Dps_A/ProjectClass/MarrySystem/MarrySystem.nut b/Dps_A/ProjectClass/MarrySystem/MarrySystem.nut index 1161ded..56d5a39 100644 --- a/Dps_A/ProjectClass/MarrySystem/MarrySystem.nut +++ b/Dps_A/ProjectClass/MarrySystem/MarrySystem.nut @@ -5,6 +5,8 @@ 文件用途:结婚系统 */ class Marry { + //当前频道 + Channel = null; //配置 Config = null; //包头 @@ -14,8 +16,8 @@ class Marry { //进入礼堂前的位置信息 EnterAuditoriumPosList = {}; - - + //礼堂id 对应的用户信息 + AuditoriumUserInfo = {}; //数据库操作集 @@ -101,6 +103,52 @@ class Marry { //把连接还池子 MysqlPool.GetInstance().PutConnect(SqlObj); } + + + //查询礼堂信息 + GetAuditoriumList = function() { + local Sql = format(MARRY_SQL_LIST.GetAuditoriumList); + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + local Ret = SqlObj.Select(Sql, ["int", "string", "int", "int", "int", "string", "int", "int"]); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + + return Ret; + } + + + //根据cid查询自己的礼堂编号 + GetAuditoriumIndexById = function(cid) { + local Sql = format(MARRY_SQL_LIST.GetAuditoriumIndexById, cid); + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + local Ret = SqlObj.Select(Sql, ["int"]); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + + if (Ret.len()< 1 || Ret[0][0] == null) { + return null; + } else { + return Ret[0][0]; + } + } + + //根据cid查询婚礼开始时间 + GetAuditoriumTimeById = function(cid) { + local Sql = format(MARRY_SQL_LIST.GetAuditoriumTimeById, cid); + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + local Ret = SqlObj.Select(Sql, ["int"]); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + + if (Ret.len()< 1 || Ret[0][0] == null) { + return null; + } else { + return Ret[0][0]; + } + } } @@ -272,24 +320,20 @@ class Marry { } else { InvenObj.DeleteItemCount(NeedItem, 1); - // //注册婚礼礼堂信息 - // AuditoriumList.rawset(SUser.GetCID(), { - // Time = Time, - // Level = Level, - // Target_CId = Target_CId, - // Target_Name = Mysql_Operate_Func.CheckMarryTargetName(Target_CId), - // }); - //当前时间戳 作为礼堂编号 - local Index = time(); + + //获得婚礼仪式开始时间 + local Index = time() + (Time + 1) * 10 * 60; //注册婚礼礼堂信息 Mysql_Operate_Func.InsertMarryRoom(SUser.GetCID(), SUser.GetCharacName(), Time, Level, Target_CId, Mysql_Operate_Func.CheckMarryTargetName(Target_CId), 1, Index); Mysql_Operate_Func.InsertMarryRoom(Target_CId, Mysql_Operate_Func.CheckMarryTargetName(Target_CId), Time, Level, SUser.GetCID(), SUser.GetCharacName(), 1, Index); + AuditoriumUserInfo.rawset(SUser.GetCID(), {}); Mysql_Operate_Func.ChangeMarryState(SUser.GetCID(), 2); Mysql_Operate_Func.ChangeMarryState(Target_CId, 2); + local T = { op = OP + 10, Flag = 2 @@ -307,9 +351,14 @@ class Marry { } } + + //进入礼堂 function EnterAuditorium(SUser, Jso) { local RoomId = Jso.room; + + local location = SUser.GetLocation(); + //进入自己的礼堂 if (RoomId == -1) { local MyState = Mysql_Operate_Func.CheckMarryState(SUser.GetCID()); @@ -317,12 +366,42 @@ class Marry { SUser.SendNotiBox("您访问的礼堂不存在!", 1); return; } + RoomId = SUser.GetCID(); + //如果根据自己的cid不能拿到礼堂信息 说明这个礼堂的key是对象的 + if (!(AuditoriumUserInfo.rawin(RoomId))) { + //对象的cid + RoomId = Mysql_Operate_Func.GetAuditoriumIndexById(SUser.GetCID()); + } + location.rawset("所在礼堂编号", RoomId); //向缓存写入进入时的坐标 - EnterAuditoriumPosList.rawset(SUser.GetCID(), SUser.GetLocation()); + EnterAuditoriumPosList.rawset(SUser.GetCID(), location); + //移动到礼堂 + World.MoveArea(SUser, Config["礼堂城镇编号"], Config["礼堂区域编号"], 55, 349); + } else { + location.rawset("所在礼堂编号", RoomId); + //向缓存写入进入时的坐标 + EnterAuditoriumPosList.rawset(SUser.GetCID(), location); //移动到礼堂 World.MoveArea(SUser, Config["礼堂城镇编号"], Config["礼堂区域编号"], 55, 349); } + + + + + AuditoriumUserInfo[RoomId].rawset(SUser.GetCID(), 1); + + local UserCanSee = []; + foreach(cid in AuditoriumUserInfo[RoomId]) { + UserCanSee.push(cid); + } + + local T = { + op = OP + 22, + time = Mysql_Operate_Func.GetAuditoriumTimeById(RoomId) - time() + } + SUser.SendJso(T); + } //离开礼堂 @@ -331,12 +410,111 @@ class Marry { local Info = EnterAuditoriumPosList[SUser.GetCID()]; //离开礼堂回到进入时的位置 World.MoveArea(SUser, Info.Town, Info.Area, Info.Pos.X, Info.Pos.Y); + + + AuditoriumUserInfo[Info["所在礼堂编号"]].rawdelete(SUser.GetCID()); } } + + + //获得礼堂列表 + function GetAuditoriumList(SUser, Jso) { + local re = Mysql_Operate_Func.GetAuditoriumList(); + local SendArr = []; + //判断用的 + local SelectMap = {}; + + foreach(v in re) { + local TimeBuf = v.pop(); + local id = v[0]; + //不存在时PUSH + if (!(SelectMap.rawin(v[4]))) { + v.push(AuditoriumUserInfo.rawget(id).len()); + v.push(Channel); + v.push(TimeBuf); + SendArr.push(v); + SelectMap.rawset(id, 1); + } + } + local T = { + op = OP + 20, + info = SendArr + } + SUser.SendJso(T); + } + + function GetConfig(SUser, Jso) { + local T = { + op = OP + 778, + town = Config["礼堂城镇编号"], + area = Config["礼堂区域编号"], + } + SUser.SendJso(T); + } + + + //表示是否可见 参数为用户数组 + function MarryUserCallBack(RealList, MUser) { + + foreach(_Index, Value in RealList) { + local SUser = Value; + if (!SUser || !SUser.GetState() >= 3) continue; + if (SUser.GetUID() == MUser.GetUID()) continue; + local Pack = Packet(); + Pack.Put_Header(0, 24); + Pack.Put_Byte(SUser.GetLocation().Town); //城镇 + Pack.Put_Byte(SUser.GetArea(1)); //区域 + Pack.Put_Short((RealList.len() - 1)); //几个玩家 要减去自己 + foreach(__Index, MapObj in RealList) { + if (SUser.GetUID() == MapObj.GetUID()) continue; + Pack.Put_Short(MapObj.GetUniqueId()); + Pack.Put_Short(MapObj.GetAreaPos().X); + Pack.Put_Short(MapObj.GetAreaPos().Y); + Pack.Put_Byte(MapObj.GetDirections()); //朝向 + Pack.Put_Byte(MapObj.GetVisibleValues()); //是否可见 + } + Pack.Put_Byte(1); //是否可见 + Pack.Finalize(true); + + SUser.Send(Pack); + Pack.Delete(); + } + } + + + + //退出可见列表 + function MarryUserDeleteCallBack(RealList, MUser) { + + foreach(_Index, Value in RealList) { + local SUser = Value; + if (!SUser || !(SUser.GetState() >= 3) || !MUser || !(MUser.GetState() >= 3)) continue; + if (SUser.GetUID() == MUser.GetUID()) continue; + local Pack = Packet(); + Pack.Put_Header(0, 23); + Pack.Put_Short(MUser.GetUniqueId()); //唯一id + Pack.Put_Byte(MUser.GetLocation().Town); //城镇 + + + Pack.Put_Byte(MUser.GetArea(1)); //区域 + Pack.Put_Short(MUser.GetAreaPos().X); + Pack.Put_Short(MUser.GetAreaPos().Y); + Pack.Put_Byte(MUser.GetDirections()); //朝向 + Pack.Put_Byte(MUser.GetVisibleValues()); //是否可见 + Pack.Finalize(true); + SUser.Send(Pack); + Pack.Delete(); + } + } + + + constructor() { Config = dofile("/root/娱心插件配置/结婚系统配置.dat"); + local ConfigPath = Sq_Game_GetConfig(); + Channel = ConfigPath.slice(-6).slice(0, 2); //注册来自客户端的收包 ClientSocketPackFuncMap.rawset(OP + 9, CheckMarryStateCallBack.bindenv(this)); @@ -347,6 +525,20 @@ class Marry { ClientSocketPackFuncMap.rawset(OP + 13, ConfirmMarry.bindenv(this)); ClientSocketPackFuncMap.rawset(OP + 15, EnterAuditorium.bindenv(this)); ClientSocketPackFuncMap.rawset(OP + 17, LeaveAuditorium.bindenv(this)); + ClientSocketPackFuncMap.rawset(OP + 19, GetAuditoriumList.bindenv(this)); + ClientSocketPackFuncMap.rawset(OP + 777, GetConfig.bindenv(this)); + + //每次加载的时候都注册礼堂信息 + AuditoriumUserInfo.rawset(1, {}); + + local RealList = []; + + RealList.push(World.GetUserByUid(1)); + RealList.push(World.GetUserByUid(2)); + + + + MarryUserDeleteCallBack(RealList, World.GetUserByUid(1)); //从池子拿连接 local SqlObj = MysqlPool.GetInstance().GetConnect(); diff --git a/Dps_A/ProjectClass/MarrySystem/Marry_sql.nut b/Dps_A/ProjectClass/MarrySystem/Marry_sql.nut index 8c85273..7750f49 100644 --- a/Dps_A/ProjectClass/MarrySystem/Marry_sql.nut +++ b/Dps_A/ProjectClass/MarrySystem/Marry_sql.nut @@ -27,3 +27,13 @@ MARRY_SQL_LIST.ChangeMarryState <- "UPDATE zyk.marry SET state = %d WHERE cid = //新增礼堂信息 MARRY_SQL_LIST.InsertMarryRoom <- @"INSERT INTO zyk.marry_room (cid, name, time, level, target_cid, target_name, state, rindex) VALUES (%d, '%s', %d, %d, %d, '%s', %d, %d);"; + + +//查询礼堂列表 +MARRY_SQL_LIST.GetAuditoriumList <- @"SELECT * FROM zyk.marry_room"; + +//根据cid查询自己的礼堂编号 +MARRY_SQL_LIST.GetAuditoriumIndexById <- @"SELECT target_cid FROM zyk.marry_room WHERE cid = %d"; + +//根据cid查询自己的礼堂编号 +MARRY_SQL_LIST.GetAuditoriumTimeById <- @"SELECT rindex FROM zyk.marry_room WHERE cid = %d"; \ No newline at end of file