| 
									
										
										
										
											2024-10-11 23:56:27 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 文件名:AvatarUseJewel.nut | 
					
						
							|  |  |  | 路径:Dps_A/ProjectClass/AvatarUseJewel/AvatarUseJewel.nut | 
					
						
							|  |  |  | 创建日期:2024-10-09	19:52 | 
					
						
							|  |  |  | 文件用途:时装镶嵌 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | class AvatarUseJewel { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function WongWork_CAvatarItemMgr_getJewelSocketData(a, b) { | 
					
						
							|  |  |  |         return Sq_CallFunc(S_Ptr("0x82F98F8"), "pointer", ["pointer", "int"], a, b); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function CStackableItem_getJewelTargetSocket(C_Object) { | 
					
						
							|  |  |  |         return Sq_CallFunc(S_Ptr("0x0822CA28"), "int", ["pointer"], C_Object); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function CInventory_delete_item(C_Object, Type, Slot, Count, Ps, Log) { | 
					
						
							|  |  |  |         return Sq_CallFunc(S_Ptr("0x850400C"), "int", ["pointer", "int", "int", "int", "int", "int"], C_Object, Type, Slot, Count, Ps, Log); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function api_set_JewelSocketData(jewelSocketData, slot, emblem_item_id) { | 
					
						
							|  |  |  |         if (jewelSocketData) { | 
					
						
							|  |  |  |             NativePointer(jewelSocketData).add(slot * 6 + 2).writeInt(emblem_item_id); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function DB_UpdateAvatarJewelSlot_makeRequest(a, b, c) { | 
					
						
							|  |  |  |         return Sq_CallFunc(S_Ptr("0x843081C"), "pointer", ["int", "int", "pointer"], a, b, c); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //获取时装在数据库中的uid | 
					
						
							|  |  |  |     function api_get_avartar_ui_id(avartar) { | 
					
						
							|  |  |  |         return NativePointer(avartar).add(7).readInt(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function FixFunction() { | 
					
						
							|  |  |  |         Haker.LoadHook("0x8217BD6", ["int", "pointer", "pointer", "int"], | 
					
						
							|  |  |  |             function(args) { | 
					
						
							|  |  |  |                 //角色 | 
					
						
							|  |  |  |                 local SUser = User(args[1]); | 
					
						
							|  |  |  |                 //包数据 | 
					
						
							|  |  |  |                 local Pack = Packet(args[2]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 //校验角色状态是否允许镶嵌 | 
					
						
							|  |  |  |                 if (!SUser || SUser.GetState() != 3) { | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //时装所在的背包槽 | 
					
						
							|  |  |  |                 local Inven_Slot = Pack.GetShort(); | 
					
						
							|  |  |  |                 //时装item_id | 
					
						
							|  |  |  |                 local Item_Id = Pack.GetInt(); | 
					
						
							|  |  |  |                 //本次镶嵌徽章数量 | 
					
						
							|  |  |  |                 local Emblem_Count = Pack.GetByte(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 //获取时装道具 | 
					
						
							|  |  |  |                 local InvemObj = SUser.GetInven(); | 
					
						
							|  |  |  |                 local AvatarObj = InvemObj.GetSlot(2, Inven_Slot); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 //校验时装 数据是否合法 | 
					
						
							| 
									
										
										
										
											2024-10-27 15:32:44 +08:00
										 |  |  |                 if (!AvatarObj || AvatarObj.IsEmpty || (AvatarObj.GetIndex() != Item_Id) || SUser.CheckItemLock(2, Inven_Slot)) return; | 
					
						
							| 
									
										
										
										
											2024-10-11 23:56:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 local Avartar_AddInfo = AvatarObj.GetAdd_Info(); | 
					
						
							|  |  |  |                 //获取时装管理器 | 
					
						
							|  |  |  |                 local Inven_AvartarMgr = InvemObj.GetAvatarItemMgr(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 //获取时装插槽数据 | 
					
						
							|  |  |  |                 local Jewel_Socket_Data = AvatarUseJewel.WongWork_CAvatarItemMgr_getJewelSocketData(Inven_AvartarMgr, Avartar_AddInfo); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (!Jewel_Socket_Data) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 //最多只支持3个插槽 | 
					
						
							|  |  |  |                 if (Emblem_Count <= 3) { | 
					
						
							|  |  |  |                     local emblems = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     for (local i = 0; i< Emblem_Count; i++) { | 
					
						
							|  |  |  |                         //徽章所在的背包槽 | 
					
						
							|  |  |  |                         local emblem_inven_slot = Pack.GetShort(); | 
					
						
							|  |  |  |                         //徽章item_id | 
					
						
							|  |  |  |                         local emblem_item_id = Pack.GetInt(); | 
					
						
							|  |  |  |                         //该徽章镶嵌的时装插槽id | 
					
						
							|  |  |  |                         local avartar_socket_slot = Pack.GetByte(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         //获取徽章道具 | 
					
						
							|  |  |  |                         local EmblemObje = InvemObj.GetSlot(1, emblem_inven_slot); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         //校验徽章及插槽数据是否合法 | 
					
						
							| 
									
										
										
										
											2024-10-27 15:32:44 +08:00
										 |  |  |                         if (!EmblemObje || EmblemObje.IsEmpty || (EmblemObje.GetIndex() != emblem_item_id) || (avartar_socket_slot >= 3)) return; | 
					
						
							| 
									
										
										
										
											2024-10-11 23:56:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         //校验徽章是否满足时装插槽颜色要求 | 
					
						
							|  |  |  |                         //获取徽章pvf数据 | 
					
						
							|  |  |  |                         local citem = PvfItem.GetPvfItemById(emblem_item_id); | 
					
						
							|  |  |  |                         if (!citem) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         //校验徽章类型 | 
					
						
							|  |  |  |                         if (!citem.IsStackable() || citem.GetItemType() != 20) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         //获取徽章支持的插槽 | 
					
						
							|  |  |  |                         local emblem_socket_type = AvatarUseJewel.CStackableItem_getJewelTargetSocket(citem.C_Object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         //获取要镶嵌的时装插槽类型 | 
					
						
							|  |  |  |                         local avartar_socket_type = NativePointer(Jewel_Socket_Data).add(avartar_socket_slot * 6).readShort(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         if (!(emblem_socket_type & avartar_socket_type)) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         emblems[avartar_socket_slot] <- [emblem_inven_slot, emblem_item_id]; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     //开始镶嵌 | 
					
						
							|  |  |  |                     foreach(avartar_socket_slot, emblemObject in emblems) { | 
					
						
							|  |  |  |                         //删除徽章 | 
					
						
							|  |  |  |                         local emblem_inven_slot = emblemObject[0]; | 
					
						
							|  |  |  |                         AvatarUseJewel.CInventory_delete_item(InvemObj.C_Object, 1, emblem_inven_slot, 1, 8, 1); | 
					
						
							|  |  |  |                         //设置时装插槽数据 | 
					
						
							|  |  |  |                         local emblem_item_id = emblemObject[1]; | 
					
						
							|  |  |  |                         AvatarUseJewel.api_set_JewelSocketData(Jewel_Socket_Data, avartar_socket_slot, emblem_item_id); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     //时装插槽数据存档 | 
					
						
							|  |  |  |                     AvatarUseJewel.DB_UpdateAvatarJewelSlot_makeRequest(SUser.GetCID(), AvatarUseJewel.api_get_avartar_ui_id(AvatarObj.C_Object), Jewel_Socket_Data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     //通知客户端时装数据已更新 | 
					
						
							|  |  |  |                     SUser.SendUpdateItemList(1, 1, Inven_Slot); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     //回包给客户端 | 
					
						
							|  |  |  |                     local Pack = Packet(); | 
					
						
							|  |  |  |                     Pack.Put_Header(1, 204); | 
					
						
							|  |  |  |                     Pack.Put_Int(1); | 
					
						
							|  |  |  |                     Pack.Finalize(true); | 
					
						
							|  |  |  |                     SUser.Send(Pack); | 
					
						
							|  |  |  |                     Pack.Delete(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return null; | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             function(args) { | 
					
						
							|  |  |  |                 return 0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor() { | 
					
						
							|  |  |  |         FixFunction(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |