/* 文件名:FunctionalPack.nut 路径:User/Socket/FunctionalPack.nut 创建日期:2025-01-05 00:07 文件用途:功能数据包 */ //注册功能包 function RegisterFunctionalPack() { // 选择角色进入游戏回包 MySocket.RegisterHandler(PACKET_ID.SELECT_CHARACTER_ENTER_GAME_CALLBACK, function(Jso) { local Info = Jso.charac; //构造城镇 local TownObj = Town(Info.town); local Charc = GameObject.CreateCharacter(Info.job, [], true); //构造角色 { Charc.Cid = Info.cid; Charc.GrowJob = Info.jobEx; Charc.Level = Info.lv; Charc.Exp = Info.exp; Charc.Fatigue = Info.fatigue; Charc.SkillPoint = Info.sp; Charc.SetName(Info.name); Charc.InitAttr(); //初始化角色属性 TownObj.AddObject(Charc, true); ClientCharacter = Charc; } //以下是角色应当初始化的各项东西 { //初始化背包 if (ClientCharacterInventory) { ClientCharacterInventory.DestroyWindow(); } ClientCharacterInventory = UISpace_Inventory._Inventory("背包窗口", 634, 20, 262, 548, 20); //初始化个人信息 if (ClientPersonalInfo) { ClientPersonalInfo.DestroyWindow(); } ClientPersonalInfo = UISpace_PersonalInfo._PersonalInfo("个人信息窗口", 150, 35, 286, 530, 20); //初始化HUD if (ClientHUD) { ClientHUD.DestroyWindow(); } ClientHUD = UISpace_Hud._Hud(); ClientHUD.ResetFocus(); //初始化技能树 if (ClientSkillTreeWindow) { ClientSkillTreeWindow.DestroyWindow(); } ClientSkillTreeWindow = UISpace_SkillTree._SkillTree("技能树窗口", 135, 4, 796, 524, 20); ClientSkillTreeWindow.Init(Charc.Job, Charc.GrowJob); ClientSkillTreeWindow.ResetFocus(); } }); //刷新客户端角色背包数据 MySocket.RegisterBinaryHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_INVENTORY_DATA_CALLBACK, function(Binary) { local Pack = Packet(Binary); local op = Pack.Get_Int(); //背包大小 local InventorySize = Pack.Get_Int(); //背包类型 local InventoryType = Pack.Get_Byte(); //背包道具数量 local InventoryItemCount = Pack.Get_Short(); //项目List local ItemList = {}; //道具数据 for (local i = 0; i< InventoryItemCount; i++) { local ItemStruct = GameItem.Item.ConstructionItemByPacket(Pack); ItemList[ItemStruct.Pos] <- ItemStruct.Item; } //穿戴栏 if (InventoryType == 1) { foreach(Index, EquObj in ItemList) { ClientCharacterInventory.PageList[0].CharactersObject.SetEquipment(Index, EquObj); //给角色赋予穿戴装备 if (EquObj) { ClientCharacter.WearEquipment(EquObj); } } //处理完穿戴装备以后,重新计算角色属性 ClientCharacter.ReadFullEquipAttr(); //刷新一下个人信息 ClientPersonalInfo.RefreshPersonalInfo(); } //背包栏 else if (InventoryType > 1 && InventoryType< 7) { ClientCharacterInventory.PageList[0].SetItemCollectionList(InventoryType - 2, ItemList); } //时装穿戴栏 else if (InventoryType == 8) { foreach(Index, EquObj in ItemList) { ClientCharacterInventory.PageList[1].CharactersObject.SetEquipment(Index, EquObj); //给角色赋予穿戴装备 if (EquObj) { ClientCharacter.WearEquipment(EquObj); } } //刷新背包中的人物Ani ClientCharacterInventory.RefreshRoleAni(); //刷新一下个人信息 ClientPersonalInfo.RefreshPersonalInfo(); } //时装 else if (InventoryType == 9) { ClientCharacterInventory.PageList[1].SetItemCollectionList(InventoryType - 9, ItemList); } }); //刷新客户端角色背包单个槽数据 MySocket.RegisterBinaryHandler(PACKET_ID.INVENTORY_ADD_ITEM_CALLBACK, function(Binary) { local Pack = Packet(Binary); local op = Pack.Get_Int(); local InventoryType = Pack.Get_Byte(); //背包类型 local ItemStruct = GameItem.Item.ConstructionItemByPacket(Pack); //穿戴栏 if (InventoryType == 1) { ClientCharacterInventory.PageList[0].CharactersObject.SetEquipment(ItemStruct.Pos, ItemStruct.Item); } //背包栏 else if (InventoryType > 1 && InventoryType< 7) { ClientCharacterInventory.PageList[0].SetItemCollectionSlot(InventoryType - 2, ItemStruct.Pos, ItemStruct.Item); } //时装 else if (InventoryType == 9) { ClientCharacterInventory.PageList[1].SetItemCollectionSlot(InventoryType - 9, ItemStruct.Pos, ItemStruct.Item); } }); MySocket.RegisterBinaryHandler(PACKET_ID.INVENTORY_REMOVE_ITEM_CALLBACK, function(Binary) { local Pack = Packet(Binary); local op = Pack.Get_Int(); local InventoryType = Pack.Get_Byte(); //背包类型 local Pos = Pack.Get_Short(); //穿戴栏 if (InventoryType == 1) { ClientCharacterInventory.PageList[0].CharactersObject.SetEquipment(Pos, null); } //背包栏 else if (InventoryType > 1 && InventoryType< 7) { ClientCharacterInventory.PageList[0].SetItemCollectionSlot(InventoryType - 2, Pos, null); } //时装 else if (InventoryType == 9) { ClientCharacterInventory.PageList[1].SetItemCollectionSlot(InventoryType - 9, Pos, null); } }); //穿戴装备的回包 MySocket.RegisterHandler(PACKET_ID.WEAR_EQUIPMENT_CALLBACK, function(Jso) { //页面ID local PageId = 0; local OldBackpackId = Jso.oldbackpackId; local OldPos = Jso.oldpos; local NewBackpackId = Jso.newbackpackId; //时装页面1 if (NewBackpackId == 9) { PageId = 1; NewBackpackId = 0 } //装备页面0 else { NewBackpackId -= 2 } local NewPos = Jso.newpos; local OldItem = null; local NewItem = null; if (OldBackpackId) { OldItem = ClientCharacterInventory.PageList[PageId].CharactersObject.EquipmentSlot[OldPos].Item; ClientCharacter.UnWearEquipment(OldItem); } //背包位置可能无装备 if (ClientCharacterInventory.PageList[PageId].ItemCollectionList[NewBackpackId].ItemList[NewPos]) { NewItem = ClientCharacterInventory.PageList[PageId].ItemCollectionList[NewBackpackId].ItemList[NewPos].Item; ClientCharacter.WearEquipment(ClientCharacterInventory.PageList[PageId].ItemCollectionList[NewBackpackId].ItemList[NewPos].Item); } //设置背包槽里的Item 如果原先有装备就设置那件 如果原先没有 则设置为null ClientCharacterInventory.PageList[PageId].SetItemCollectionSlot(NewBackpackId, NewPos, OldItem); //设置角色装备栏里的Item ClientCharacterInventory.PageList[PageId].CharactersObject.SetEquipment(OldPos, NewItem); //设置个人信息栏里的装备Item if (PageId == 0) ClientPersonalInfo.PageList[PageId].CharactersObject.SetEquipment(OldPos, NewItem); //刷新背包中的人物Ani ClientCharacterInventory.RefreshRoleAni(); //处理完穿戴装备以后,重新计算角色属性 if (OldItem && PageId == 0) ClientCharacter.Attr -= OldItem.Attr; if (NewItem && PageId == 0) ClientCharacter.Attr += NewItem.Attr; //刷新一下个人信息 ClientPersonalInfo.RefreshPersonalInfo(); }); //刷新客户端角色背包点卷代币券信息 MySocket.RegisterHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_CERA_DATA_CALLBACK, function(Jso) { ClientCharacterInventory.WalletSet("Cera", Jso.coupon); }); //刷新客户端角色背包金币信息 MySocket.RegisterHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_GOLD_DATA_CALLBACK, function(Jso) { ClientCharacterInventory.WalletSet("Gold", Jso.gold); }); //刷新客户端角色背包复活币信息 MySocket.RegisterHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_REVIVE_DATA_CALLBACK, function(Jso) { ClientCharacterInventory.WalletSet("ReviveCoin", Jso.revive); }); //城镇中添加角色的回包 MySocket.RegisterBinaryHandler(PACKET_ID.TOWN_ADD_CHARACTER_CALLBACK, function(Binary) { local Pack = Packet(Binary); local op = Pack.Get_Int(); local cid = Pack.Get_Int(); local namelen = Pack.Get_Byte(); local name = Pack.Get_String(namelen); local job = Pack.Get_Byte(); local lv = Pack.Get_Byte(); local moveflag = Pack.Get_Byte(); local posx = Pack.Get_Int(); local posy = Pack.Get_Int(); local posz = 0; local equcount = Pack.Get_Byte(); local equ = []; for (local i = 0; i< equcount; i++) { equ.push(Pack.Get_Int()); } //构造角色 local Charc = GameObject.CreateCharacter(job, equ); Charc.Cid = cid; Charc.SetName(name); Charc.SetPosition(posx, posy, posz); //从全局地图中找到城镇并添加角色 if (GlobalTownManager.CurrentMap) { GlobalTownManager.CurrentMap.AddObject(Charc); } //设置角色移动状态 if (moveflag != DIRECTION.NONE) { Charc.SetMoveFlag(moveflag); } }); //城镇中移除角色的回包 MySocket.RegisterHandler(PACKET_ID.TOWN_REMOVE_CHARACTER_CALLBACK, function(Jso) { //从全局地图中找到城镇并移除角色 if (GlobalTownManager.CurrentMap) { //遍历所有角色 foreach(obj in GlobalTownManager.CurrentMap.PlayerList) { //角色对象 if (typeof obj == "Game_Character" && obj.Cid == Jso.cid) { GlobalTownManager.CurrentMap.RemoveObject(obj); } } } }); //移动城镇的回包 MySocket.RegisterHandler(PACKET_ID.CHANGE_TOWN_AREA_CALLBACK, function(Jso) { //我自己的移动城镇添加角色对象 local MapObj = GlobalTownManager.TownList[Jso.town].map[Jso.region]; MapObj.AddObjectByChangeTown(ClientCharacter, Jso.pos); }); //城镇中角色移动的回包 MySocket.RegisterBinaryHandler(PACKET_ID.TOWN_CHARACTER_MOVE_CALLBACK, function(Binary) { local Pack = Packet(Binary); Pack.Get_Int(); local cid = Pack.Get_Int(); local MoveFlag = Pack.Get_Byte(); local X = Pack.Get_Int(); local Y = Pack.Get_Int(); //获取角色对象 local obj = GameObject.GetCharacterByCid(cid); if (obj) { obj.SetPosition(X, Y, 0); obj.SetMoveFlag(MoveFlag); } }); //注册聊天信息收包 MySocket.RegisterHandler(PACKET_ID.SEND_CHAT_MESSAGE_CALLBACK, function(Jso) { ClientChatWindow.PushMsg(Jso); //获取角色对象 local obj = GameObject.GetCharacterByCid(Jso.cid); if (obj) obj.SetChatBubble(Jso.msg); }.bindenv(this)); } //城镇包 TOWN_PACKET <- { //城镇角色移动改变状态包 function SendTownMoveStatePacket(X, Y, MoveFlag) { local Pack = Packet(); Pack.Put_Byte(MoveFlag); Pack.Put_Int(X); Pack.Put_Int(Y); MySocket.Send(PACKET_ID.TOWN_CHARACTER_MOVE, Pack.Data); } }