DOF/sqr/User/Socket/FunctionalPack.nut

245 lines
9.3 KiB
Plaintext

/*
文件名: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, Info.equ, true);
Charc.Cid = Info.cid;
TownObj.AddObject(Charc, true);
ClientCharacter = Charc;
//以下是角色应当初始化的各项东西
{
//初始化背包
if (ClientCharacterInventory) {
ClientCharacterInventory.DestroyWindow();
}
ClientCharacterInventory = _Inventory("背包窗口", 150, 12, 262, 548, 20);
}
});
/*
InventorySize : int //背包大小
InventoryType : byte //背包类型
InventoryItemCount : short //背包道具数量
ItemInfo : Struct //道具信息 结构体
{
Type : byte //类型
// Type 为 1 装备类型
{
Pos : short //装备位置
EquipId : int //装备ID
EquipEnchant : int //装备附魔编号
EquipUpgrade : byte //装备强化等级或增幅等级
EquipSeparate : byte //装备锻造
EquipIncrease : byte //装备增幅属性 0 无 1 力量 2 智力 3 体力 4 精神
EquipPowerPercentage : byte //装备力量百分比
EquipIntellectPercentage : byte //装备智力百分比
EquipStaminaPercentage : byte //装备体力百分比
EquipSpiritPercentage : byte //装备精神百分比
EquipPhysicalAttackPercentage : byte //装备物理攻击百分比
EquipMagicAttackPercentage : byte //装备魔法攻击百分比
EquipIndependentAttackPercentage : byte //装备独立攻击百分比
EquipPhysicalDefensePercentage : byte //装备物理防御百分比
EquipMagicDefensePercentage : byte //装备魔法防御百分比
EquipWrapCount : byte //装备再封装次数
}
// Type 为 2 消耗品类型
{
Pos : short //道具位置
ItemId : int //道具ID
ItemCount : int //道具数量
}
}
*/
//刷新客户端角色背包数据
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 Type = Pack.Get_Byte();
//装备类型
if (Type == 1) {
local EquInfo = {
//装备位置
Pos = Pack.Get_Short(),
//装备ID
EquipId = Pack.Get_Int(),
//交易类型
EquipTradeType = Pack.Get_Byte(),
//装备附魔编号
EquipEnchant = Pack.Get_Int(),
//装备强化等级或增幅等级
EquipUpgrade = Pack.Get_Byte(),
//装备锻造
EquipSeparate = Pack.Get_Byte(),
//装备增幅属性 0 无 1 力量 2 智力 3 体力 4 精神
EquipIncrease = Pack.Get_Byte(),
//装备力量百分比
EquipPowerPercentage = Pack.Get_Byte(),
//装备智力百分比
EquipIntellectPercentage = Pack.Get_Byte(),
//装备体力百分比
EquipStaminaPercentage = Pack.Get_Byte(),
//装备精神百分比
EquipSpiritPercentage = Pack.Get_Byte(),
//装备物理攻击百分比
EquipPhysicalAttackPercentage = Pack.Get_Byte(),
//装备魔法攻击百分比
EquipMagicAttackPercentage = Pack.Get_Byte(),
//装备独立攻击百分比
EquipIndependentAttackPercentage = Pack.Get_Byte(),
//装备物理防御百分比
EquipPhysicalDefensePercentage = Pack.Get_Byte(),
//装备魔法防御百分比
EquipMagicDefensePercentage = Pack.Get_Byte(),
//装备全属强
EquipAllElementalAttack = Pack.Get_Byte(),
//装备水属强
EquipWaterAttack = Pack.Get_Byte(),
//装备火属强
EquipFireAttack = Pack.Get_Byte(),
//装备光属强
EquipLightAttack = Pack.Get_Byte(),
//装备暗属强
EquipDarkAttack = Pack.Get_Byte(),
//装备品质
EquipPercentage = Pack.Get_Byte(),
//装备再封装次数
EquipWrapCount = Pack.Get_Byte(),
//装备是否封装
EquipIsWrap = Pack.Get_Byte(),
//耐久度
EquipDurability = Pack.Get_Byte(),
}
ItemList[EquInfo.Pos] <- GameItem.Equipment(EquInfo);
//装备栏
if (InventoryType == 2) {
ClientCharacterInventory.EquipmentPage.SetItemCollectionList(0, ItemList);
}
}
//消耗品类型
if (Type == 2 || Type == 3) {
local ItemInfo = {
//道具位置
Pos = Pack.Get_Short(),
//道具ID
ItemId = Pack.Get_Int(),
//交易类型
ItemTradeType = Pack.Get_Byte(),
//道具数量
ItemCount = Pack.Get_Int(),
}
ItemList[ItemInfo.Pos] <- GameItem.Stackable(ItemInfo.ItemId);
ClientCharacterInventory.EquipmentPage.SetItemCollectionList(InventoryType - 2, ItemList);
}
}
});
//城镇中添加角色的回包
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.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 == "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);
}
});
}
//城镇包
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);
}
}