262 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| /*
 | ||
| 文件名:FiendwarClass.nut
 | ||
| 路径:ProjectClass/Fiendwar/FiendwarClass.nut
 | ||
| 创建日期:2024-04-08	03:00
 | ||
| 文件用途:超时空服务器文件
 | ||
| */
 | ||
| class Fiendwar {
 | ||
|     //频道
 | ||
|     Channel = null;
 | ||
|     //城镇
 | ||
|     Town = null;
 | ||
| 
 | ||
|     //服务端区域移动添加玩家HOOK 让大家不可见
 | ||
|     function insert_user_hook(C_Area, C_User) {
 | ||
|         //如果有城镇配置
 | ||
|         if (Town) {
 | ||
|             local SUser = User(C_User);
 | ||
|             if (SUser.GetLocation().Town == Town) {
 | ||
|                 if (SUser.GetLocation().Area > 1) Sq_WriteAddress(C_Area, 0x68, 1);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
|     //服务端区域移动HOOK 让玩家不可以直接去另一个区域
 | ||
|     function move_area_hook(CUser, TownIndex, AreaIndex) {
 | ||
|         // return true;//TODO
 | ||
|         if (!CUser) return true;
 | ||
|         local SUser = User(CUser);
 | ||
|         //超时空频道
 | ||
|         if (Sq_Game_GetConfig().find("20") != null) {
 | ||
|             if (AreaIndex <= 1) {
 | ||
|                 return true;
 | ||
|             } else {
 | ||
|                 local Jso = {
 | ||
|                     op = 20063023,
 | ||
|                     uid = SUser.GetUID(),
 | ||
|                     cid = SUser.GetCID(),
 | ||
|                     regionId = AreaIndex
 | ||
|                 }
 | ||
|                 Socket.SendGateway(Jso);
 | ||
| 
 | ||
|                 return false;
 | ||
|             }
 | ||
|         } else {
 | ||
|             return true;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     //玩家发送消息HOOK 为了攻坚队频道和团长公告
 | ||
|     function base_input_hook(CUser, CmdString) {
 | ||
|         if (!CUser) return true;
 | ||
|         local SUser = User(CUser);
 | ||
|         //超时空频道
 | ||
|         if (Sq_Game_GetConfig().find("20") != null) {
 | ||
|             local Localtion = SUser.GetLocation();
 | ||
|             if (Localtion.Area <= 1) {
 | ||
|                 return true;
 | ||
|             } else {
 | ||
|                 if (CmdString.find("RindroType") == 8) {
 | ||
|                     local Jso = {
 | ||
|                         op = 20063027,
 | ||
|                         uid = SUser.GetUID(),
 | ||
|                         cid = SUser.GetCID(),
 | ||
|                         msg = CmdString.slice(0, CmdString.find("RindroType"))
 | ||
|                     }
 | ||
|                     Socket.SendGateway(Jso);
 | ||
|                     return false;
 | ||
|                 }
 | ||
|                 return true;
 | ||
|             }
 | ||
|         } else {
 | ||
|             return true;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function base_input_hook2(args) {
 | ||
|         local type = args[2];
 | ||
|         local SUser = User(args[1]);
 | ||
|         local msg = args[3];
 | ||
|         if ((type == 8 || type == 3) && Sq_Game_GetConfig().find("20") != null) {
 | ||
|             local Localtion = SUser.GetLocation();
 | ||
|             if (Localtion.Area <= 1) {
 | ||
|                 return true;
 | ||
|             } else {
 | ||
|                 local Jso = {
 | ||
|                     op = 20063027,
 | ||
|                     uid = SUser.GetUID(),
 | ||
|                     cid = SUser.GetCID(),
 | ||
|                     msg = msg
 | ||
|                 }
 | ||
|                 Socket.SendGateway(Jso);
 | ||
|             }
 | ||
|         }
 | ||
|         return;
 | ||
|     }
 | ||
| 
 | ||
|     //玩家消息分发
 | ||
|     function PlayerNotiMsgDistribute(Jso) {
 | ||
|         local SUser = World.GetUserByUidCid(Jso.uid, Jso.cid);
 | ||
|         if (!SUser) return;
 | ||
|         local CUserList = Jso.list;
 | ||
|         local RealList = [];
 | ||
|         foreach(_i, obj in CUserList) {
 | ||
|             local SUser = World.GetUserByUidCid(obj.uid, obj.cid);
 | ||
|             if (SUser && SUser.GetState() >= 3) RealList.append(SUser);
 | ||
|         }
 | ||
|         local SUserName = SUser.GetCharacName();
 | ||
|         local Type = Jso.type;
 | ||
| 
 | ||
|         Jso.msg = Jso.msg;
 | ||
|         if (Type == -1) {
 | ||
|             Jso.Name <- SUserName;
 | ||
|             foreach(_Index, Value in RealList) {
 | ||
|                 local SendObj = Value;
 | ||
|                 SendObj.SendJso(Jso);
 | ||
|             }
 | ||
|             Type = "长"
 | ||
|         }
 | ||
|         local NotiStr = "(攻坚队" + Type + ") " + "" + SUserName + " : " + Jso.msg;
 | ||
|         foreach(_Index, Value in RealList) {
 | ||
|             local SendObj = Value;
 | ||
|             SendObj.SendNotiPacketMessage(NotiStr, 8);
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     function FiendwarSendAreaUserCallBack(Jso) {
 | ||
|         local CUserList = Jso.list;
 | ||
|         local RealList = [];
 | ||
|         foreach(_i, obj in CUserList) {
 | ||
|             local SUser = World.GetUserByUidCid(obj.uid, obj.cid);
 | ||
|             if (SUser && SUser.GetState() >= 3) RealList.append(SUser);
 | ||
|         }
 | ||
| 
 | ||
|         foreach(_Index, Value in RealList) {
 | ||
|             local SUser = Value;
 | ||
|             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 FiendwarPlayerMoveMapCallBack(Jso) {
 | ||
|         local MoveSUser = World.GetUserByUidCid(Jso.uid, Jso.cid);
 | ||
|         if (!MoveSUser) return;
 | ||
| 
 | ||
|         local CUserList = Jso.list;
 | ||
|         local RealList = [];
 | ||
|         foreach(_i, obj in CUserList) {
 | ||
|             local SUser = World.GetUserByUidCid(obj.uid, obj.cid);
 | ||
|             if (SUser && SUser.GetState() >= 3) RealList.append(SUser);
 | ||
|         }
 | ||
| 
 | ||
|         local Pack = Packet();
 | ||
|         Pack.Put_Header(0, 22);
 | ||
|         Pack.Put_Short(MoveSUser.GetUniqueId());
 | ||
|         Pack.Put_Short(Jso.XPos);
 | ||
|         Pack.Put_Short(Jso.YPos);
 | ||
|         Pack.Put_Byte(Jso.Direction);
 | ||
|         Pack.Put_Short(Jso.Code);
 | ||
|         Pack.Finalize(true);
 | ||
| 
 | ||
|         foreach(_Index, Value in RealList) {
 | ||
|             local SUser = Value;
 | ||
|             if (SUser.GetUniqueId() == MoveSUser.GetUniqueId()) continue;
 | ||
|             SUser.Send(Pack);
 | ||
|         }
 | ||
|         Pack.Delete();
 | ||
|     }
 | ||
| 
 | ||
|     function ClientGetConfigCallBack(SUser, Jso) {
 | ||
|         local evv = {
 | ||
|             op = 20063502,
 | ||
|             town_index = Town,
 | ||
|             channel_index = Channel
 | ||
|         }
 | ||
|         SUser.SendJso(evv);
 | ||
|     }
 | ||
| 
 | ||
|     function ClientCreateOrJoinParty(SUser, Jso) {
 | ||
|         Jso.uid <- SUser.GetUID();
 | ||
|         Jso.cid <- SUser.GetCID();
 | ||
|         Jso.PlayerName <- SUser.GetCharacName();
 | ||
|         Jso.PlayerLevel <- SUser.GetCharacLevel();
 | ||
|         Jso.PlayerJob <- SUser.GetCharacJob();
 | ||
|         Jso.PlayerGrowTypeJob <- SUser.GetCharacGrowType();
 | ||
|         Jso.IsPrepare <- false;
 | ||
|         Jso.PlayerSession <- World.GetSessionByUid(SUser.GetUID());
 | ||
|         Jso.PlayCoin <- SUser.GetCoin();
 | ||
|         Jso.PlayFatigue <- SUser.GetMaxFatigue() - SUser.GetFatigue();
 | ||
|         Socket.SendGateway(Jso);
 | ||
|     }
 | ||
| 
 | ||
|     //玩家上线
 | ||
|     function Login_Hook(SUser) {
 | ||
|         //玩家上线发信息包
 | ||
|         local evv = {
 | ||
|             op = 20063502,
 | ||
|             town_index = Town,
 | ||
|             channel_index = Channel
 | ||
|         }
 | ||
|         SUser.SendJso(evv);
 | ||
| 
 | ||
|         local T = {
 | ||
|             op = 20063063,
 | ||
|             uid = SUser.GetUID(),
 | ||
|             cid = SUser.GetCID(),
 | ||
|         }
 | ||
|         Socket.SendGateway(T);
 | ||
|     }
 | ||
| 
 | ||
|     //团本配置信息获取回调
 | ||
|     function GetPluginConfig(Jso) {
 | ||
|         Town = Jso.Town;
 | ||
| 
 | ||
|         if ("hookparty" in Jso) {
 | ||
|             Cb_User_Party_Create_Func["Fiendwar"] <- function(SUser) {
 | ||
|                 return false;
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     constructor() {
 | ||
|         local ConfigPath = Sq_Game_GetConfig();
 | ||
|         Channel = ConfigPath.slice(ConfigPath.find("cfg/") + 4, ConfigPath.len());
 | ||
| 
 | ||
|         //注册HOOK
 | ||
|         Cb_Insert_User_Func.Fiendwar <- insert_user_hook.bindenv(this); //区域添加角色
 | ||
|         Cb_Move_Area_Func.Fiendwar <- move_area_hook.bindenv(this); //区域移动
 | ||
|         Base_InputHookFunc_Handle.Fiendwar <- base_input_hook.bindenv(this); //玩家发送消息
 | ||
|         Cb_reach_game_world_Func.Fiendwar <- Login_Hook.bindenv(this); //上线HOOK
 | ||
| 
 | ||
|         //注册收包
 | ||
|         GatewaySocketPackFuncMap.rawset(20063010, FiendwarSendAreaUserCallBack.bindenv(this)); //玩家移动后的区域广播包
 | ||
|         GatewaySocketPackFuncMap.rawset(20063012, FiendwarPlayerMoveMapCallBack.bindenv(this)); //玩家移动回调
 | ||
|         //玩家消息分发
 | ||
|         GatewaySocketPackFuncMap.rawset(20063018, PlayerNotiMsgDistribute.bindenv(this)); //玩家打字发送的信息
 | ||
|         GatewaySocketPackFuncMap.rawset(20063778, GetPluginConfig.bindenv(this)); //服务端配置
 | ||
| 
 | ||
|         //注册来自客户端的收包
 | ||
|         ClientSocketPackFuncMap.rawset(20230718, ClientGetConfigCallBack.bindenv(this));
 | ||
|         ClientSocketPackFuncMap.rawset(20063501, ClientGetConfigCallBack.bindenv(this));
 | ||
|         ClientSocketPackFuncMap.rawset(20063001, ClientCreateOrJoinParty.bindenv(this));
 | ||
|         ClientSocketPackFuncMap.rawset(20063005, ClientCreateOrJoinParty.bindenv(this));
 | ||
| 
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| ProjectInitFuncMap.P_Fiendwar <- Fiendwar(); |