DOF/sqr/User/Socket/FunctionalPack.nut

313 lines
12 KiB
Plaintext
Raw Normal View History

/*
文件名: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;
2025-02-20 13:53:36 +08:00
//构造城镇
local TownObj = Town(Info.town);
2025-02-20 13:53:36 +08:00
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;
}
2025-01-11 23:58:10 +08:00
//以下是角色应当初始化的各项东西
{
//初始化背包
if (ClientCharacterInventory) {
ClientCharacterInventory.DestroyWindow();
}
2025-02-20 13:53:36 +08:00
ClientCharacterInventory = UISpace_Inventory._Inventory("背包窗口", 634, 20, 262, 548, 20);
2025-02-20 13:53:36 +08:00
//初始化个人信息
if (ClientPersonalInfo) {
ClientPersonalInfo.DestroyWindow();
}
ClientPersonalInfo = UISpace_PersonalInfo._PersonalInfo("个人信息窗口", 150, 35, 286, 530, 20);
2025-01-11 16:39:16 +08:00
2025-02-20 13:53:36 +08:00
//初始化HUD
if (ClientHUD) {
ClientHUD.DestroyWindow();
}
ClientHUD = UISpace_Hud._Hud();
ClientHUD.ResetFocus();
2025-01-11 16:39:16 +08:00
2025-02-20 13:53:36 +08:00
//初始化技能树
if (ClientSkillTreeWindow) {
ClientSkillTreeWindow.DestroyWindow();
}
ClientSkillTreeWindow = UISpace_SkillTree._SkillTree("技能树窗口", 135, 4, 796, 524, 20);
ClientSkillTreeWindow.Init(Charc.Job, Charc.GrowJob);
ClientSkillTreeWindow.ResetFocus();
2025-01-11 16:39:16 +08:00
}
2025-02-20 13:53:36 +08:00
});
//刷新客户端角色背包数据
MySocket.RegisterBinaryHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_INVENTORY_DATA_CALLBACK, function(Binary) {
local Pack = Packet(Binary);
local op = Pack.Get_Int();
//背包大小
2025-01-11 16:39:16 +08:00
local InventorySize = Pack.Get_Int();
//背包类型
2025-01-11 16:39:16 +08:00
local InventoryType = Pack.Get_Byte();
//背包道具数量
local InventoryItemCount = Pack.Get_Short();
2025-01-11 16:39:16 +08:00
//项目List
local ItemList = {};
2025-01-11 16:39:16 +08:00
//道具数据
2025-01-11 23:58:10 +08:00
for (local i = 0; i< InventoryItemCount; i++) {
2025-02-20 13:53:36 +08:00
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);
2025-01-11 16:39:16 +08:00
}
}
2025-02-20 13:53:36 +08:00
//处理完穿戴装备以后,重新计算角色属性
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);
2025-01-11 16:39:16 +08:00
}
2025-02-20 13:53:36 +08:00
}
//刷新背包中的人物Ani
ClientCharacterInventory.RefreshRoleAni();
//刷新一下个人信息
ClientPersonalInfo.RefreshPersonalInfo();
}
//时装
else if (InventoryType == 9) {
ClientCharacterInventory.PageList[1].SetItemCollectionList(InventoryType - 9, ItemList);
}
});
2025-02-20 13:53:36 +08:00
//刷新客户端角色背包单个槽数据
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;
2025-02-20 13:53:36 +08:00
local OldItem = null;
local NewItem = null;
if (OldBackpackId) {
OldItem = ClientCharacterInventory.PageList[PageId].CharactersObject.EquipmentSlot[OldPos].Item;
ClientCharacter.UnWearEquipment(OldItem);
2025-01-11 16:39:16 +08:00
}
2025-02-20 13:53:36 +08:00
//背包位置可能无装备
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);
});
2025-02-20 13:53:36 +08:00
//刷新客户端角色背包金币信息
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;
2025-02-20 13:53:36 +08:00
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) {
//角色对象
2025-02-20 13:53:36 +08:00
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);
}
});
2025-02-20 13:53:36 +08:00
//注册聊天信息收包
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);
}
}