From fde06bbfafd370a441998eddc4857a81e79e43ce Mon Sep 17 00:00:00 2001 From: Le Duc Anh Date: Thu, 9 Oct 2025 08:52:31 +0700 Subject: [PATCH] Move all network code into Unity Project --- .../Debug/netstandard2.1/CSNetwork.deps.json | 130 -- .../Debug/netstandard2.1/CSNetwork.dll | Bin 373760 -> 0 bytes .../Debug/netstandard2.1/CSNetwork.dll.meta | 2 - .../Scripts/Network/CSNetwork.meta | 8 + .../Scripts/Network/CSNetwork/AUICommon.cs | 53 + .../Network/CSNetwork/AUICommon.cs.meta | 2 + .../Scripts/Network/CSNetwork/C2SCommand.meta | 8 + .../CSNetwork/C2SCommand/C2SCommand.cs | 1328 +++++++++++++++++ .../CSNetwork/C2SCommand/C2SCommand.cs.meta | 2 + .../CSNetwork/C2SCommand/C2SCommandFactory.cs | 407 +++++ .../C2SCommand/C2SCommandFactory.cs.meta | 2 + .../Network/CSNetwork/CSNetwork.csproj.meta | 7 + .../Scripts/Network/CSNetwork/Common.meta | 8 + .../Network/CSNetwork/Common/ExpTypes.cs | 115 ++ .../Network/CSNetwork/Common/ExpTypes.cs.meta | 2 + .../Network/CSNetwork/EC_ManMessage.cs | 78 + .../Network/CSNetwork/EC_ManMessage.cs.meta | 2 + .../Scripts/Network/CSNetwork/EC_Manager.cs | 13 + .../Network/CSNetwork/EC_Manager.cs.meta | 2 + .../Scripts/Network/CSNetwork/EC_MsgDef.cs | 380 +++++ .../Network/CSNetwork/EC_MsgDef.cs.meta | 2 + .../Scripts/Network/CSNetwork/EventBus.cs | 326 ++++ .../Network/CSNetwork/EventBus.cs.meta | 2 + .../Scripts/Network/CSNetwork/GPDataType.cs | 1220 +++++++++++++++ .../Network/CSNetwork/GPDataType.cs.meta | 2 + .../Scripts/Network/CSNetwork/GameSession.cs | 731 +++++++++ .../Network/CSNetwork/GameSession.cs.meta | 2 + .../Scripts/Network/CSNetwork/Helper.cs | 36 + .../Scripts/Network/CSNetwork/Helper.cs.meta | 2 + .../Scripts/Network/CSNetwork/Logger.meta | 8 + .../Network/CSNetwork/Logger/ConsoleLogger.cs | 27 + .../CSNetwork/Logger/ConsoleLogger.cs.meta | 2 + .../Network/CSNetwork/Logger/FileLogger.cs | 43 + .../CSNetwork/Logger/FileLogger.cs.meta | 2 + .../Network/CSNetwork/Logger/ILogger.cs | 19 + .../Network/CSNetwork/Logger/ILogger.cs.meta | 2 + .../CSNetwork/Logger/IPrefixedLogger.cs | 23 + .../CSNetwork/Logger/IPrefixedLogger.cs.meta | 2 + .../CSNetwork/Logger/LoggerExtensions.cs | 66 + .../CSNetwork/Logger/LoggerExtensions.cs.meta | 2 + .../Network/CSNetwork/Logger/LoggerFactory.cs | 118 ++ .../CSNetwork/Logger/LoggerFactory.cs.meta | 2 + .../Scripts/Network/CSNetwork/Manager.cs | 22 + .../Scripts/Network/CSNetwork/Manager.cs.meta | 2 + .../Network/CSNetwork/NetworkManager.cs | 540 +++++++ .../Network/CSNetwork/NetworkManager.cs.meta | 2 + .../Scripts/Network/CSNetwork/Octets.cs | 133 ++ .../Scripts/Network/CSNetwork/Octets.cs.meta | 2 + .../Scripts/Network/CSNetwork/OctetsStream.cs | 447 ++++++ .../Network/CSNetwork/OctetsStream.cs.meta | 2 + .../Scripts/Network/CSNetwork/Protocols.meta | 8 + .../CSNetwork/Protocols/AccountProtocols.cs | 84 ++ .../Protocols/AccountProtocols.cs.meta | 2 + .../CSNetwork/Protocols/KeyExchange.cs | 78 + .../CSNetwork/Protocols/KeyExchange.cs.meta | 2 + .../Network/CSNetwork/Protocols/Protocol.cs | 210 +++ .../CSNetwork/Protocols/Protocol.cs.meta | 2 + .../CSNetwork/Protocols/ProtocolTypes.cs | 889 +++++++++++ .../CSNetwork/Protocols/ProtocolTypes.cs.meta | 2 + .../CSNetwork/Protocols/RoleListResponse.cs | 56 + .../Protocols/RoleListResponse.cs.meta | 2 + .../CSNetwork/Protocols/ShopProtocols.cs | 54 + .../CSNetwork/Protocols/ShopProtocols.cs.meta | 2 + .../Network/CSNetwork/Protocols/acanswer.cs | 49 + .../CSNetwork/Protocols/acanswer.cs.meta | 2 + .../CSNetwork/Protocols/accountloginrecord.cs | 50 + .../Protocols/accountloginrecord.cs.meta | 2 + .../Network/CSNetwork/Protocols/acquestion.cs | 45 + .../CSNetwork/Protocols/acquestion.cs.meta | 2 + .../CSNetwork/Protocols/acremotecode.cs | 38 + .../CSNetwork/Protocols/acremotecode.cs.meta | 2 + .../Network/CSNetwork/Protocols/acreport.cs | 38 + .../CSNetwork/Protocols/acreport.cs.meta | 2 + .../Network/CSNetwork/Protocols/addfriend.cs | 46 + .../CSNetwork/Protocols/addfriend.cs.meta | 2 + .../CSNetwork/Protocols/addfriendremarks.cs | 46 + .../Protocols/addfriendremarks.cs.meta | 2 + .../CSNetwork/Protocols/announceforbidinfo.cs | 38 + .../Protocols/announceforbidinfo.cs.meta | 2 + .../CSNetwork/Protocols/announcenewmail.cs | 50 + .../Protocols/announcenewmail.cs.meta | 2 + .../CSNetwork/Protocols/announcesellresult.cs | 62 + .../Protocols/announcesellresult.cs.meta | 2 + .../CSNetwork/Protocols/auctionattendlist.cs | 42 + .../Protocols/auctionattendlist.cs.meta | 2 + .../Network/CSNetwork/Protocols/auctionbid.cs | 58 + .../CSNetwork/Protocols/auctionbid.cs.meta | 2 + .../CSNetwork/Protocols/auctionclose.cs | 46 + .../CSNetwork/Protocols/auctionclose.cs.meta | 2 + .../CSNetwork/Protocols/auctionexitbid.cs | 42 + .../Protocols/auctionexitbid.cs.meta | 2 + .../Network/CSNetwork/Protocols/auctionget.cs | 46 + .../CSNetwork/Protocols/auctionget.cs.meta | 2 + .../CSNetwork/Protocols/auctiongetitem.cs | 42 + .../Protocols/auctiongetitem.cs.meta | 2 + .../CSNetwork/Protocols/auctionlist.cs | 58 + .../CSNetwork/Protocols/auctionlist.cs.meta | 2 + .../CSNetwork/Protocols/auctionlistupdate.cs | 38 + .../Protocols/auctionlistupdate.cs.meta | 2 + .../CSNetwork/Protocols/auctionopen.cs | 78 + .../CSNetwork/Protocols/auctionopen.cs.meta | 2 + .../CSNetwork/Protocols/autolockset.cs | 45 + .../CSNetwork/Protocols/autolockset.cs.meta | 2 + .../Protocols/autoteamplayerleave.cs | 42 + .../Protocols/autoteamplayerleave.cs.meta | 2 + .../CSNetwork/Protocols/battlechallenge.cs | 58 + .../Protocols/battlechallenge.cs.meta | 2 + .../CSNetwork/Protocols/battlechallengemap.cs | 42 + .../Protocols/battlechallengemap.cs.meta | 2 + .../CSNetwork/Protocols/battleenter.cs | 42 + .../CSNetwork/Protocols/battleenter.cs.meta | 2 + .../CSNetwork/Protocols/battlegetmap.cs | 38 + .../CSNetwork/Protocols/battlegetmap.cs.meta | 2 + .../CSNetwork/Protocols/battlestatus.cs | 38 + .../CSNetwork/Protocols/battlestatus.cs.meta | 2 + .../Network/CSNetwork/Protocols/buypoint.cs | 46 + .../CSNetwork/Protocols/buypoint.cs.meta | 2 + .../CSNetwork/Protocols/cancelwaitqueue.cs | 42 + .../Protocols/cancelwaitqueue.cs.meta | 2 + .../Network/CSNetwork/Protocols/cashlock.cs | 50 + .../CSNetwork/Protocols/cashlock.cs.meta | 2 + .../CSNetwork/Protocols/cashpasswordset.cs | 46 + .../Protocols/cashpasswordset.cs.meta | 2 + .../Network/CSNetwork/Protocols/challenge.cs | 60 + .../CSNetwork/Protocols/challenge.cs.meta | 2 + .../CSNetwork/Protocols/chatmessage.cs | 55 + .../CSNetwork/Protocols/chatmessage.cs.meta | 2 + .../CSNetwork/Protocols/chatroomcreate.cs | 51 + .../Protocols/chatroomcreate.cs.meta | 2 + .../CSNetwork/Protocols/chatroomexpel.cs | 46 + .../CSNetwork/Protocols/chatroomexpel.cs.meta | 2 + .../CSNetwork/Protocols/chatroominvite.cs | 68 + .../Protocols/chatroominvite.cs.meta | 2 + .../CSNetwork/Protocols/chatroomjoin.cs | 55 + .../CSNetwork/Protocols/chatroomjoin.cs.meta | 2 + .../CSNetwork/Protocols/chatroomleave.cs | 42 + .../CSNetwork/Protocols/chatroomleave.cs.meta | 2 + .../CSNetwork/Protocols/chatroomlist.cs | 42 + .../CSNetwork/Protocols/chatroomlist.cs.meta | 2 + .../CSNetwork/Protocols/chatroomspeak.cs | 54 + .../CSNetwork/Protocols/chatroomspeak.cs.meta | 2 + .../CSNetwork/Protocols/checknewmail.cs | 38 + .../CSNetwork/Protocols/checknewmail.cs.meta | 2 + .../Protocols/collectclientmachineinfo.cs | 38 + .../collectclientmachineinfo.cs.meta | 2 + .../CSNetwork/Protocols/complain2gm.cs | 61 + .../CSNetwork/Protocols/complain2gm.cs.meta | 2 + .../Protocols/countrybattlegetbattlelimit.cs | 38 + .../countrybattlegetbattlelimit.cs.meta | 2 + .../Protocols/countrybattlegetconfig.cs | 38 + .../Protocols/countrybattlegetconfig.cs.meta | 2 + .../countrybattlegetkingcommandpoint.cs | 34 + .../countrybattlegetkingcommandpoint.cs.meta | 2 + .../Protocols/countrybattlegetmap.cs | 38 + .../Protocols/countrybattlegetmap.cs.meta | 2 + .../countrybattlegetplayerlocation.cs | 38 + .../countrybattlegetplayerlocation.cs.meta | 2 + .../Protocols/countrybattlegetscore.cs | 38 + .../Protocols/countrybattlegetscore.cs.meta | 2 + .../countrybattlekingassignassault.cs | 42 + .../countrybattlekingassignassault.cs.meta | 2 + .../countrybattlekingresetbattlelimit.cs | 42 + .../countrybattlekingresetbattlelimit.cs.meta | 2 + .../CSNetwork/Protocols/countrybattlemove.cs | 42 + .../Protocols/countrybattlemove.cs.meta | 2 + .../Protocols/countrybattlepreenter.cs | 38 + .../Protocols/countrybattlepreenter.cs.meta | 2 + .../Protocols/countrybattlepreenternotify.cs | 46 + .../countrybattlepreenternotify.cs.meta | 2 + .../Protocols/countrybattleresult.cs | 38 + .../Protocols/countrybattleresult.cs.meta | 2 + .../Protocols/countrybattlereturncapital.cs | 34 + .../countrybattlereturncapital.cs.meta | 2 + .../countrybattlesinglebattleresult.cs | 50 + .../countrybattlesinglebattleresult.cs.meta | 2 + .../countrybattlesyncplayerlocation.cs | 46 + .../countrybattlesyncplayerlocation.cs.meta | 2 + .../Protocols/createfactionfortress.cs | 52 + .../Protocols/createfactionfortress.cs.meta | 2 + .../Network/CSNetwork/Protocols/createrole.cs | 42 + .../CSNetwork/Protocols/createrole.cs.meta | 2 + .../Network/CSNetwork/Protocols/deletemail.cs | 42 + .../CSNetwork/Protocols/deletemail.cs.meta | 2 + .../Network/CSNetwork/Protocols/deleterole.cs | 38 + .../CSNetwork/Protocols/deleterole.cs.meta | 2 + .../Network/CSNetwork/Protocols/delfriend.cs | 42 + .../CSNetwork/Protocols/delfriend.cs.meta | 2 + .../CSNetwork/Protocols/deliverrolestatus.cs | 54 + .../Protocols/deliverrolestatus.cs.meta | 2 + .../Network/CSNetwork/Protocols/enterworld.cs | 58 + .../CSNetwork/Protocols/enterworld.cs.meta | 2 + .../Network/CSNetwork/Protocols/errorinfo.cs | 38 + .../CSNetwork/Protocols/errorinfo.cs.meta | 2 + .../Protocols/exchangeconsumepoints.cs | 42 + .../Protocols/exchangeconsumepoints.cs.meta | 2 + .../CSNetwork/Protocols/factionacceptjoin.cs | 46 + .../Protocols/factionacceptjoin.cs.meta | 2 + .../CSNetwork/Protocols/factionchat.cs | 59 + .../CSNetwork/Protocols/factionchat.cs.meta | 2 + .../Protocols/factiondelayexpelannounce.cs | 54 + .../factiondelayexpelannounce.cs.meta | 2 + .../Protocols/factionfortressbattlelist.cs | 34 + .../factionfortressbattlelist.cs.meta | 2 + .../Protocols/factionfortresschallenge.cs | 46 + .../factionfortresschallenge.cs.meta | 2 + .../Protocols/factionfortressenter.cs | 42 + .../Protocols/factionfortressenter.cs.meta | 2 + .../CSNetwork/Protocols/factionfortressget.cs | 38 + .../Protocols/factionfortressget.cs.meta | 2 + .../Protocols/factionfortresslist.cs | 38 + .../Protocols/factionfortresslist.cs.meta | 2 + .../CSNetwork/Protocols/factionlistonline.cs | 38 + .../Protocols/factionlistonline.cs.meta | 2 + .../CSNetwork/Protocols/factionoprequest.cs | 42 + .../Protocols/factionoprequest.cs.meta | 2 + .../Protocols/factionrelationrecvapply.cs | 42 + .../factionrelationrecvapply.cs.meta | 2 + .../Protocols/factionrelationrecvreply.cs | 46 + .../factionrelationrecvreply.cs.meta | 2 + .../Protocols/factionrenameannounce.cs | 46 + .../Protocols/factionrenameannounce.cs.meta | 2 + .../Protocols/factionresourcebattlegetmap.cs | 38 + .../factionresourcebattlegetmap.cs.meta | 2 + .../factionresourcebattlegetrecord.cs | 38 + .../factionresourcebattlegetrecord.cs.meta | 2 + .../factionresourcebattlenotifyplayerevent.cs | 46 + ...ionresourcebattlenotifyplayerevent.cs.meta | 2 + .../factionresourcebattleplayerqueryresult.cs | 50 + ...ionresourcebattleplayerqueryresult.cs.meta | 2 + .../CSNetwork/Protocols/findsellpointinfo.cs | 42 + .../Protocols/findsellpointinfo.cs.meta | 2 + .../CSNetwork/Protocols/friendextlist.cs | 38 + .../CSNetwork/Protocols/friendextlist.cs.meta | 2 + .../CSNetwork/Protocols/friendstatus.cs | 42 + .../CSNetwork/Protocols/friendstatus.cs.meta | 2 + .../CSNetwork/Protocols/gamedatasend.cs | 38 + .../CSNetwork/Protocols/gamedatasend.cs.meta | 2 + .../Protocols/getcnetserverconfig.cs | 34 + .../Protocols/getcnetserverconfig.cs.meta | 2 + .../CSNetwork/Protocols/getcustomdata.cs | 38 + .../CSNetwork/Protocols/getcustomdata.cs.meta | 2 + .../CSNetwork/Protocols/getfactionbaseinfo.cs | 38 + .../Protocols/getfactionbaseinfo.cs.meta | 2 + .../Network/CSNetwork/Protocols/getfriends.cs | 38 + .../CSNetwork/Protocols/getfriends.cs.meta | 2 + .../CSNetwork/Protocols/gethelpstates.cs | 38 + .../CSNetwork/Protocols/gethelpstates.cs.meta | 2 + .../Network/CSNetwork/Protocols/getmail.cs | 42 + .../CSNetwork/Protocols/getmail.cs.meta | 2 + .../CSNetwork/Protocols/getmailattachobj.cs | 50 + .../Protocols/getmailattachobj.cs.meta | 2 + .../CSNetwork/Protocols/getmaillist.cs | 38 + .../CSNetwork/Protocols/getmaillist.cs.meta | 2 + .../CSNetwork/Protocols/getplayerbriefinfo.cs | 42 + .../Protocols/getplayerbriefinfo.cs.meta | 2 + .../Protocols/getplayerfactioninfo.cs | 38 + .../Protocols/getplayerfactioninfo.cs.meta | 2 + .../CSNetwork/Protocols/getplayeridbyname.cs | 46 + .../Protocols/getplayeridbyname.cs.meta | 2 + .../CSNetwork/Protocols/getrewardlist.cs | 42 + .../CSNetwork/Protocols/getrewardlist.cs.meta | 2 + .../CSNetwork/Protocols/getsavedmsg.cs | 38 + .../CSNetwork/Protocols/getsavedmsg.cs.meta | 2 + .../CSNetwork/Protocols/getselllist.cs | 42 + .../CSNetwork/Protocols/getselllist.cs.meta | 2 + .../CSNetwork/Protocols/getuiconfig.cs | 38 + .../CSNetwork/Protocols/getuiconfig.cs.meta | 2 + .../CSNetwork/Protocols/gmforbidrole.cs | 54 + .../CSNetwork/Protocols/gmforbidrole.cs.meta | 2 + .../Protocols/gmgetplayerconsumeinfo.cs | 42 + .../Protocols/gmgetplayerconsumeinfo.cs.meta | 2 + .../CSNetwork/Protocols/gmkickoutrole.cs | 54 + .../CSNetwork/Protocols/gmkickoutrole.cs.meta | 2 + .../CSNetwork/Protocols/gmkickoutuser.cs | 54 + .../CSNetwork/Protocols/gmkickoutuser.cs.meta | 2 + .../CSNetwork/Protocols/gmlistonlineuser.cs | 46 + .../Protocols/gmlistonlineuser.cs.meta | 2 + .../CSNetwork/Protocols/gmonlinenum.cs | 38 + .../CSNetwork/Protocols/gmonlinenum.cs.meta | 2 + .../CSNetwork/Protocols/gmrestartserver.cs | 46 + .../Protocols/gmrestartserver.cs.meta | 2 + .../Protocols/gmsettimelessautolock.cs | 46 + .../Protocols/gmsettimelessautolock.cs.meta | 2 + .../Network/CSNetwork/Protocols/gmshutup.cs | 50 + .../CSNetwork/Protocols/gmshutup.cs.meta | 2 + .../CSNetwork/Protocols/gmshutuprole.cs | 50 + .../CSNetwork/Protocols/gmshutuprole.cs.meta | 2 + .../CSNetwork/Protocols/gmtogglechat.cs | 42 + .../CSNetwork/Protocols/gmtogglechat.cs.meta | 2 + .../CSNetwork/Protocols/kecandidateapply.cs | 46 + .../Protocols/kecandidateapply.cs.meta | 2 + .../CSNetwork/Protocols/kegetstatus.cs | 34 + .../CSNetwork/Protocols/kegetstatus.cs.meta | 2 + .../Network/CSNetwork/Protocols/kevoting.cs | 54 + .../CSNetwork/Protocols/kevoting.cs.meta | 2 + .../CSNetwork/Protocols/keyreestablish.cs | 54 + .../Protocols/keyreestablish.cs.meta | 2 + .../CSNetwork/Protocols/matrixchallenge.cs | 42 + .../Protocols/matrixchallenge.cs.meta | 2 + .../CSNetwork/Protocols/matrixresponse.cs | 34 + .../Protocols/matrixresponse.cs.meta | 2 + .../CSNetwork/Protocols/onlineannounce.cs | 78 + .../Protocols/onlineannounce.cs.meta | 2 + .../CSNetwork/Protocols/playeraccuse.cs | 42 + .../CSNetwork/Protocols/playeraccuse.cs.meta | 2 + .../CSNetwork/Protocols/playerbaseinfo.cs | 38 + .../Protocols/playerbaseinfo.cs.meta | 2 + .../CSNetwork/Protocols/playerbaseinfo_re.cs | 47 + .../Protocols/playerbaseinfo_re.cs.meta | 2 + .../CSNetwork/Protocols/playerbaseinfocrc.cs | 38 + .../Protocols/playerbaseinfocrc.cs.meta | 2 + .../CSNetwork/Protocols/playerlogout.cs | 50 + .../CSNetwork/Protocols/playerlogout.cs.meta | 2 + .../CSNetwork/Protocols/playernameupdate.cs | 38 + .../Protocols/playernameupdate.cs.meta | 2 + .../Protocols/playerprofilegetmatchresult.cs | 42 + .../playerprofilegetmatchresult.cs.meta | 2 + .../Protocols/playerprofilegetprofiledata.cs | 38 + .../playerprofilegetprofiledata.cs.meta | 2 + .../Protocols/playerprofilesetprofiledata.cs | 34 + .../playerprofilesetprofiledata.cs.meta | 2 + .../CSNetwork/Protocols/playersendmail.cs | 81 + .../Protocols/playersendmail.cs.meta | 2 + .../CSNetwork/Protocols/playersendmassmail.cs | 81 + .../Protocols/playersendmassmail.cs.meta | 2 + .../CSNetwork/Protocols/preservemail.cs | 46 + .../CSNetwork/Protocols/preservemail.cs.meta | 2 + .../CSNetwork/Protocols/privatechat.cs | 69 + .../CSNetwork/Protocols/privatechat.cs.meta | 2 + .../CSNetwork/Protocols/pshopactive.cs | 54 + .../CSNetwork/Protocols/pshopactive.cs.meta | 2 + .../Network/CSNetwork/Protocols/pshopbuy.cs | 50 + .../CSNetwork/Protocols/pshopbuy.cs.meta | 2 + .../CSNetwork/Protocols/pshopcancelgoods.cs | 42 + .../Protocols/pshopcancelgoods.cs.meta | 2 + .../CSNetwork/Protocols/pshopcleargoods.cs | 34 + .../Protocols/pshopcleargoods.cs.meta | 2 + .../CSNetwork/Protocols/pshopcreate.cs | 58 + .../CSNetwork/Protocols/pshopcreate.cs.meta | 2 + .../CSNetwork/Protocols/pshopdrawitem.cs | 42 + .../CSNetwork/Protocols/pshopdrawitem.cs.meta | 2 + .../Network/CSNetwork/Protocols/pshoplist.cs | 42 + .../CSNetwork/Protocols/pshoplist.cs.meta | 2 + .../CSNetwork/Protocols/pshoplistitem.cs | 54 + .../CSNetwork/Protocols/pshoplistitem.cs.meta | 2 + .../CSNetwork/Protocols/pshopmanagefund.cs | 54 + .../Protocols/pshopmanagefund.cs.meta | 2 + .../CSNetwork/Protocols/pshopplayerbuy.cs | 58 + .../Protocols/pshopplayerbuy.cs.meta | 2 + .../CSNetwork/Protocols/pshopplayerget.cs | 38 + .../Protocols/pshopplayerget.cs.meta | 2 + .../CSNetwork/Protocols/pshopplayersell.cs | 62 + .../Protocols/pshopplayersell.cs.meta | 2 + .../CSNetwork/Protocols/pshopselfget.cs | 34 + .../CSNetwork/Protocols/pshopselfget.cs.meta | 2 + .../Network/CSNetwork/Protocols/pshopsell.cs | 58 + .../CSNetwork/Protocols/pshopsell.cs.meta | 2 + .../CSNetwork/Protocols/pshopsettype.cs | 38 + .../CSNetwork/Protocols/pshopsettype.cs.meta | 2 + .../Network/CSNetwork/Protocols/publicchat.cs | 55 + .../CSNetwork/Protocols/publicchat.cs.meta | 2 + .../Network/CSNetwork/Protocols/qpaddcash.cs | 46 + .../CSNetwork/Protocols/qpaddcash.cs.meta | 2 + .../CSNetwork/Protocols/qpannouncediscount.cs | 34 + .../Protocols/qpannouncediscount.cs.meta | 2 + .../Protocols/qpgetactivatedservices.cs | 34 + .../Protocols/qpgetactivatedservices.cs.meta | 2 + .../CSNetwork/Protocols/qqaddfriend.cs | 59 + .../CSNetwork/Protocols/qqaddfriend.cs.meta | 2 + .../Protocols/refgetreferencecode.cs | 38 + .../Protocols/refgetreferencecode.cs.meta | 2 + .../CSNetwork/Protocols/reflistreferrals.cs | 42 + .../Protocols/reflistreferrals.cs.meta | 2 + .../CSNetwork/Protocols/refwithdrawbonus.cs | 38 + .../Protocols/refwithdrawbonus.cs.meta | 2 + .../Network/CSNetwork/Protocols/report2gm.cs | 74 + .../CSNetwork/Protocols/report2gm.cs.meta | 2 + .../Network/CSNetwork/Protocols/reportchat.cs | 51 + .../CSNetwork/Protocols/reportchat.cs.meta | 2 + .../Network/CSNetwork/Protocols/response.cs | 137 ++ .../CSNetwork/Protocols/response.cs.meta | 2 + .../CSNetwork/Protocols/rewardmaturenotice.cs | 42 + .../Protocols/rewardmaturenotice.cs.meta | 2 + .../Network/CSNetwork/Protocols/rolelist.cs | 42 + .../CSNetwork/Protocols/rolelist.cs.meta | 2 + .../CSNetwork/Protocols/rolestatusannounce.cs | 50 + .../Protocols/rolestatusannounce.cs.meta | 2 + .../Network/CSNetwork/Protocols/rpcdata.meta | 8 + .../CSNetwork/Protocols/rpcdata/GRoleBase.cs | 131 ++ .../Protocols/rpcdata/GRoleBase.cs.meta | 2 + .../Protocols/rpcdata/GRoleForbid.cs | 40 + .../Protocols/rpcdata/GRoleForbid.cs.meta | 2 + .../Protocols/rpcdata/GRoleInventory.cs | 62 + .../Protocols/rpcdata/GRoleInventory.cs.meta | 2 + .../CSNetwork/Protocols/rpcdata/RoleInfo.cs | 140 ++ .../Protocols/rpcdata/RoleInfo.cs.meta | 2 + .../Network/CSNetwork/Protocols/selectrole.cs | 44 + .../CSNetwork/Protocols/selectrole.cs.meta | 2 + .../CSNetwork/Protocols/selectrole_re.cs | 52 + .../CSNetwork/Protocols/selectrole_re.cs.meta | 2 + .../Network/CSNetwork/Protocols/sellcancel.cs | 46 + .../CSNetwork/Protocols/sellcancel.cs.meta | 2 + .../Network/CSNetwork/Protocols/sellpoint.cs | 50 + .../CSNetwork/Protocols/sellpoint.cs.meta | 2 + .../Network/CSNetwork/Protocols/sendaumail.cs | 46 + .../CSNetwork/Protocols/sendaumail.cs.meta | 2 + .../Network/CSNetwork/Protocols/sendmsg.cs | 58 + .../CSNetwork/Protocols/sendmsg.cs.meta | 2 + .../CSNetwork/Protocols/setcustomdata.cs | 42 + .../CSNetwork/Protocols/setcustomdata.cs.meta | 2 + .../CSNetwork/Protocols/setfriendgroup.cs | 46 + .../Protocols/setfriendgroup.cs.meta | 2 + .../CSNetwork/Protocols/setgroupname.cs | 46 + .../CSNetwork/Protocols/setgroupname.cs.meta | 2 + .../CSNetwork/Protocols/sethelpstates.cs | 42 + .../CSNetwork/Protocols/sethelpstates.cs.meta | 2 + .../CSNetwork/Protocols/setuiconfig.cs | 42 + .../CSNetwork/Protocols/setuiconfig.cs.meta | 2 + .../CSNetwork/Protocols/ssogetticket.cs | 47 + .../CSNetwork/Protocols/ssogetticket.cs.meta | 2 + .../CSNetwork/Protocols/statusannounce.cs | 42 + .../Protocols/statusannounce.cs.meta | 2 + .../CSNetwork/Protocols/stockaccount.cs | 42 + .../CSNetwork/Protocols/stockaccount.cs.meta | 2 + .../Network/CSNetwork/Protocols/stockbill.cs | 42 + .../CSNetwork/Protocols/stockbill.cs.meta | 2 + .../CSNetwork/Protocols/stockcancel.cs | 50 + .../CSNetwork/Protocols/stockcancel.cs.meta | 2 + .../CSNetwork/Protocols/stockcommission.cs | 54 + .../Protocols/stockcommission.cs.meta | 2 + .../CSNetwork/Protocols/sysauctionaccount.cs | 38 + .../Protocols/sysauctionaccount.cs.meta | 2 + .../CSNetwork/Protocols/sysauctionbid.cs | 50 + .../CSNetwork/Protocols/sysauctionbid.cs.meta | 2 + .../Protocols/sysauctioncashtransfer.cs | 50 + .../Protocols/sysauctioncashtransfer.cs.meta | 2 + .../CSNetwork/Protocols/sysauctiongetitem.cs | 38 + .../Protocols/sysauctiongetitem.cs.meta | 2 + .../CSNetwork/Protocols/sysauctionlist.cs | 38 + .../Protocols/sysauctionlist.cs.meta | 2 + .../Protocols/tankbattleplayergetrank.cs | 38 + .../Protocols/tankbattleplayergetrank.cs.meta | 2 + .../CSNetwork/Protocols/tradeaddgoods.cs | 46 + .../CSNetwork/Protocols/tradeaddgoods.cs.meta | 2 + .../CSNetwork/Protocols/tradeconfirm.cs | 42 + .../CSNetwork/Protocols/tradeconfirm.cs.meta | 2 + .../CSNetwork/Protocols/tradediscard.cs | 42 + .../CSNetwork/Protocols/tradediscard.cs.meta | 2 + .../Network/CSNetwork/Protocols/tradeend.cs | 46 + .../CSNetwork/Protocols/tradeend.cs.meta | 2 + .../CSNetwork/Protocols/trademoveobj.cs | 46 + .../CSNetwork/Protocols/trademoveobj.cs.meta | 2 + .../CSNetwork/Protocols/traderemovegoods.cs | 46 + .../Protocols/traderemovegoods.cs.meta | 2 + .../Network/CSNetwork/Protocols/tradestart.cs | 42 + .../CSNetwork/Protocols/tradestart.cs.meta | 2 + .../CSNetwork/Protocols/tradesubmit.cs | 42 + .../CSNetwork/Protocols/tradesubmit.cs.meta | 2 + .../CSNetwork/Protocols/undodeleterole.cs | 38 + .../Protocols/undodeleterole.cs.meta | 2 + .../Protocols/uniquedatamodifybroadcast.cs | 34 + .../uniquedatamodifybroadcast.cs.meta | 2 + .../CSNetwork/Protocols/updateremaintime.cs | 54 + .../Protocols/updateremaintime.cs.meta | 2 + .../CSNetwork/Protocols/useraddcash.cs | 47 + .../CSNetwork/Protocols/useraddcash.cs.meta | 2 + .../Network/CSNetwork/Protocols/usercoupon.cs | 38 + .../CSNetwork/Protocols/usercoupon.cs.meta | 2 + .../CSNetwork/Protocols/usercouponexchange.cs | 42 + .../Protocols/usercouponexchange.cs.meta | 2 + .../Protocols/waitqueuestatenotify.cs | 50 + .../Protocols/waitqueuestatenotify.cs.meta | 2 + .../CSNetwork/Protocols/webtradeattendlist.cs | 46 + .../Protocols/webtradeattendlist.cs.meta | 2 + .../CSNetwork/Protocols/webtradegetdetail.cs | 38 + .../Protocols/webtradegetdetail.cs.meta | 2 + .../CSNetwork/Protocols/webtradegetitem.cs | 38 + .../Protocols/webtradegetitem.cs.meta | 2 + .../CSNetwork/Protocols/webtradelist.cs | 50 + .../CSNetwork/Protocols/webtradelist.cs.meta | 2 + .../Protocols/webtradeprecancelpost.cs | 38 + .../Protocols/webtradeprecancelpost.cs.meta | 2 + .../CSNetwork/Protocols/webtradeprepost.cs | 78 + .../Protocols/webtradeprepost.cs.meta | 2 + .../Protocols/webtraderolegetdetail.cs | 42 + .../Protocols/webtraderolegetdetail.cs.meta | 2 + .../Protocols/webtraderoleprecancelpost.cs | 42 + .../webtraderoleprecancelpost.cs.meta | 2 + .../Protocols/webtraderoleprepost.cs | 58 + .../Protocols/webtraderoleprepost.cs.meta | 2 + .../CSNetwork/Protocols/webtradeupdate.cs | 38 + .../Protocols/webtradeupdate.cs.meta | 2 + .../Network/CSNetwork/Protocols/worldchat.cs | 56 + .../CSNetwork/Protocols/worldchat.cs.meta | 2 + .../Scripts/Network/CSNetwork/Security.meta | 8 + .../CSNetwork/Security/ARCFourSecurity.cs | 181 +++ .../Security/ARCFourSecurity.cs.meta | 2 + .../CSNetwork/Security/BaseSecurity.cs | 84 ++ .../CSNetwork/Security/BaseSecurity.cs.meta | 2 + .../Security/DecompressArcFourSecurity.cs | 105 ++ .../DecompressArcFourSecurity.cs.meta | 2 + .../CSNetwork/Security/HMAC_MD5Hash.cs | 135 ++ .../CSNetwork/Security/HMAC_MD5Hash.cs.meta | 2 + .../Network/CSNetwork/Security/MD5Hash.cs | 302 ++++ .../CSNetwork/Security/MD5Hash.cs.meta | 2 + .../CSNetwork/Security/NullSecurity.cs | 37 + .../CSNetwork/Security/NullSecurity.cs.meta | 2 + .../Network/CSNetwork/Security/SHA256Hash.cs | 87 ++ .../CSNetwork/Security/SHA256Hash.cs.meta | 2 + .../CSNetwork/Security/SecurityFactory.cs | 22 + .../Security/SecurityFactory.cs.meta | 2 + .../CSNetwork/Security/StreamCompress.cs | 336 +++++ .../CSNetwork/Security/StreamCompress.cs.meta | 2 + .../Scripts/Network/CSNetwork/obj.meta | 8 + .../obj/CSNetwork.csproj.nuget.dgspec.json | 73 + .../CSNetwork.csproj.nuget.dgspec.json.meta} | 2 +- .../obj/CSNetwork.csproj.nuget.g.props | 15 + .../obj/CSNetwork.csproj.nuget.g.props.meta | 7 + .../obj/CSNetwork.csproj.nuget.g.targets | 2 + .../obj/CSNetwork.csproj.nuget.g.targets.meta | 7 + .../Scripts/Network/CSNetwork/obj/Debug.meta | 8 + .../CSNetwork/obj/Debug/netstandard2.1.meta | 8 + ...tandard,Version=v2.1.AssemblyAttributes.cs | 4 + .../netstandard2.1/CSNetwork.AssemblyInfo.cs | 22 + .../CSNetwork.AssemblyInfo.cs.meta | 2 + .../CSNetwork.AssemblyInfoInputs.cache | 1 + .../CSNetwork.AssemblyInfoInputs.cache.meta | 7 + ....GeneratedMSBuildEditorConfig.editorconfig | 8 + ...ratedMSBuildEditorConfig.editorconfig.meta | 7 + .../netstandard2.1/CSNetwork.assets.cache | Bin 0 -> 3936 bytes .../CSNetwork.assets.cache.meta | 7 + .../CSNetwork.csproj.AssemblyReference.cache | Bin 0 -> 1500 bytes ...etwork.csproj.AssemblyReference.cache.meta | 7 + .../CSNetwork.csproj.CoreCompileInputs.cache | 1 + ...etwork.csproj.CoreCompileInputs.cache.meta | 7 + .../CSNetwork.csproj.FileListAbsolute.txt | 10 + ...SNetwork.csproj.FileListAbsolute.txt.meta} | 2 +- .../obj/Debug/netstandard2.1/CSNetwork.dll | Bin 0 -> 375296 bytes .../Debug/netstandard2.1/CSNetwork.dll.meta | 2 + .../Network/CSNetwork/obj/project.assets.json | 351 +++++ .../CSNetwork/obj/project.assets.json.meta | 7 + .../Network/CSNetwork/obj/project.nuget.cache | 15 + .../CSNetwork/obj/project.nuget.cache.meta | 7 + .../CSNetwork/obj/project.packagespec.json | 1 + .../obj/project.packagespec.json.meta | 7 + .../obj/rider.project.model.nuget.info | 1 + .../obj/rider.project.model.nuget.info.meta | 7 + .../CSNetwork/obj/rider.project.restore.info | 1 + .../obj/rider.project.restore.info.meta | 7 + .../Scripts/Network/UnityGameSession.cs | 1 + Assets/PerfectWorld/Scripts/UI/GameScene.meta | 8 + .../Scripts/UI/GameScene/EnterWorldTest.cs | 13 + .../UI/GameScene/EnterWorldTest.cs.meta | 2 + Assets/Plugins/TestClient.deps.json | 146 -- Assets/Plugins/TestClient.dll | Bin 13824 -> 0 bytes Assets/Plugins/TestClient.dll.meta | 2 - Assets/Scenes/WorldRender.unity | 80 + Assets/Scripts/CanvasController.cs | 16 +- Assets/Scripts/ScreenLogin.cs | 1 - 559 files changed, 20164 insertions(+), 297 deletions(-) delete mode 100644 Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json delete mode 100644 Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll delete mode 100644 Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/CSNetwork.csproj.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Common.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json rename Assets/{Plugins/TestClient.deps.json.meta => PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json.meta} (75%) create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.assets.cache create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.assets.cache.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt rename Assets/{NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json.meta => PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt.meta} (75%) create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.dll create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.dll.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.assets.json create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.assets.json.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info.meta create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info.meta create mode 100644 Assets/PerfectWorld/Scripts/UI/GameScene.meta create mode 100644 Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs create mode 100644 Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs.meta delete mode 100644 Assets/Plugins/TestClient.deps.json delete mode 100644 Assets/Plugins/TestClient.dll delete mode 100644 Assets/Plugins/TestClient.dll.meta diff --git a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json b/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json deleted file mode 100644 index 1a28e5f5ea..0000000000 --- a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETStandard,Version=v2.1/", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETStandard,Version=v2.1": {}, - ".NETStandard,Version=v2.1/": { - "CSNetwork/1.0.0": { - "dependencies": { - "System.Reflection.Metadata": "9.0.8" - }, - "runtime": { - "CSNetwork.dll": {} - } - }, - "System.Buffers/4.5.1": { - "runtime": { - "lib/netstandard2.0/System.Buffers.dll": { - "assemblyVersion": "4.0.3.0", - "fileVersion": "4.6.28619.1" - } - } - }, - "System.Collections.Immutable/9.0.8": { - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - }, - "runtime": { - "lib/netstandard2.0/System.Collections.Immutable.dll": { - "assemblyVersion": "9.0.0.0", - "fileVersion": "9.0.825.36511" - } - } - }, - "System.Memory/4.5.5": { - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - }, - "runtime": { - "lib/netstandard2.0/System.Memory.dll": { - "assemblyVersion": "4.0.1.2", - "fileVersion": "4.6.31308.1" - } - } - }, - "System.Numerics.Vectors/4.4.0": { - "runtime": { - "lib/netstandard2.0/System.Numerics.Vectors.dll": { - "assemblyVersion": "4.1.3.0", - "fileVersion": "4.6.25519.3" - } - } - }, - "System.Reflection.Metadata/9.0.8": { - "dependencies": { - "System.Collections.Immutable": "9.0.8", - "System.Memory": "4.5.5" - }, - "runtime": { - "lib/netstandard2.0/System.Reflection.Metadata.dll": { - "assemblyVersion": "9.0.0.0", - "fileVersion": "9.0.825.36511" - } - } - }, - "System.Runtime.CompilerServices.Unsafe/6.0.0": { - "runtime": { - "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { - "assemblyVersion": "6.0.0.0", - "fileVersion": "6.0.21.52210" - } - } - } - } - }, - "libraries": { - "CSNetwork/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - }, - "System.Buffers/4.5.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", - "path": "system.buffers/4.5.1", - "hashPath": "system.buffers.4.5.1.nupkg.sha512" - }, - "System.Collections.Immutable/9.0.8": { - "type": "package", - "serviceable": true, - "sha512": "sha512-Eje6exD7AGKPg5SIkmjyWTBq0KK6SpfTBfdFUmpGG07mNbYimFJ+jyVnILcs0ikFOXoYTBpBOxKYgAk2hhjYOw==", - "path": "system.collections.immutable/9.0.8", - "hashPath": "system.collections.immutable.9.0.8.nupkg.sha512" - }, - "System.Memory/4.5.5": { - "type": "package", - "serviceable": true, - "sha512": "sha512-XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "path": "system.memory/4.5.5", - "hashPath": "system.memory.4.5.5.nupkg.sha512" - }, - "System.Numerics.Vectors/4.4.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", - "path": "system.numerics.vectors/4.4.0", - "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" - }, - "System.Reflection.Metadata/9.0.8": { - "type": "package", - "serviceable": true, - "sha512": "sha512-oJQezcASFomKvSp+06pzvSFRTnzdUJtiO19peAdZ9RwiqZinBV56u7zW5fEGf2/VrQFL3qZSV7UapgG31XRWQA==", - "path": "system.reflection.metadata/9.0.8", - "hashPath": "system.reflection.metadata.9.0.8.nupkg.sha512" - }, - "System.Runtime.CompilerServices.Unsafe/6.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", - "path": "system.runtime.compilerservices.unsafe/6.0.0", - "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" - } - } -} \ No newline at end of file diff --git a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll b/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll deleted file mode 100644 index c82e94aa15e03ce91f4dce7ae4a3ad63f89ec721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373760 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 diff --git a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll.meta b/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll.meta deleted file mode 100644 index fb396d45e8..0000000000 --- a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 3b9d74e7123c6e144ae35ceb982d00de \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork.meta new file mode 100644 index 0000000000..57b4c2f6e1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cff6fdd017698448b94714631dec98e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs new file mode 100644 index 0000000000..9bb345d99f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CSNetwork +{ + public static class AUICommon + { + public static void AUI_ConvertChatString(string pszChat, char[] pszConv, bool bName) + { + if (string.IsNullOrEmpty(pszChat) || pszConv == null) + return; + + int nLen = 0; + + for (int i = 0; i < pszChat.Length; i++) + { + char c = pszChat[i]; + if (c == '^') + { + if (nLen + 1 < pszConv.Length) + { + pszConv[nLen] = '^'; + pszConv[nLen + 1] = '^'; + nLen += 2; + } + } + else if (c == '&') + { + if (nLen + 1 < pszConv.Length) + { + pszConv[nLen] = '^'; + pszConv[nLen + 1] = '&'; + nLen += 2; + } + } + else + { + if (nLen < pszConv.Length) + { + pszConv[nLen] = c; + nLen++; + } + } + } + + // kết thúc chuỗi bằng ký tự null + if (nLen < pszConv.Length) + pszConv[nLen] = '\0'; + } + + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs.meta new file mode 100644 index 0000000000..048c3c3f20 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ff3c9f9901a244e7282e005d885f27a1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand.meta new file mode 100644 index 0000000000..25f7b038e0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 93762d244ce204f89bcdff922008fe27 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs new file mode 100644 index 0000000000..623cac9385 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs @@ -0,0 +1,1328 @@ +using CSNetwork.GPDataType; +using System; +using System.Numerics; + +namespace CSNetwork.C2SCommand +{ + + // Command IDs + public enum CommandID : ushort + { + PLAYER_MOVE = 0, + LOGOUT, + SELECT_TARGET, + NORMAL_ATTACK, + REVIVE_VILLAGE, // Revive in near village + + REVIVE_ITEM = 5, // Revive by using item + PICKUP, + STOP_MOVE, + UNSELECT, + GET_ITEM_INFO, + + GET_IVTR = 10, // Get inventory information + GET_IVTR_DETAIL, // Get inventory detail information + EXG_IVTR_ITEM, + MOVE_IVTR_ITEM, + DROP_IVTR_ITEM, + + DROP_EQUIP_ITEM = 15, + EXG_EQUIP_ITEM, + EQUIP_ITEM, + MOVE_ITEM_TO_EQUIP, + GOTO, + + THROW_MONEY = 20, + GET_EXT_PROP, + SET_STATUS_POINT, // Set state points + GET_EXT_PROP_BASE, + GET_EXT_PROP_MOVE, + + GET_EXT_PROP_ATK = 25, + GET_EXT_PROP_DEF, + TEAM_INVITE, + TEAM_AGREE_INVITE, + TEAM_REJECT_INVITE, + + TEAM_LEAVE_PARTY = 30, + TEAM_KICK_MEMBER, + TEAM_MEMBER_POS, // Get team member's position + GET_OTHER_EQUIP, + TEAM_SET_PICKUP, // Change team pickup flag + + SEVNPC_HELLO = 35, // say hello to service NPC + SEVNPC_GET_CONTENT, + SEVNPC_SERVE, + GET_OWN_WEALTH, + GET_ALL_DATA, // Get all data when entering game, returns all packages, money and skills + + USE_ITEM = 40, // Use an item + CAST_SKILL, + CANCEL_ACTION, + CHARGE_E_FLYSWORD, // Charge flysword which is on equipment bar + CHARGE_FLYSWORD, + + USE_ITEM_T = 45, // use item with target + SIT_DOWN, + STAND_UP, + EMOTE_ACTION, + TASK_NOTIFY, + + ASSIST_SELECT = 50, + CONTINUE_ACTION, + STOP_FALL, // Stop falling + GET_ITEM_INFO_LIST, + GATHER_MATERIAL, + + GET_TRASHBOX_INFO = 55, + EXG_TRASHBOX_ITEM, + MOVE_TRASHBOX_ITEM, + EXG_TRASHBOX_IVTR, + TRASHBOX_ITEM_TO_IVTR, + + IVTR_ITEM_TO_TRASHBOX = 60, + EXG_TRASHBOX_MONEY, + TRICK_ACTION, + SET_ADV_DATA, + CLR_ADV_DATA, + + TEAM_ASK_TO_JOIN = 65, + TEAM_REPLY_JOIN_ASK, + QUERY_PLAYER_INFO_1, + QUERY_NPC_INFO_1, + SESSION_EMOTE, + + CON_EMOTE_REQUEST = 70, + CON_EMOTE_REPLY, + CHANGE_TEAM_LEADER, + DEAD_MOVE, + DEAD_STOP_MOVE, + + ENTER_SANCTUARY = 75, + OPEN_BOOTH, + CLOSE_BOOTH, + QUERY_BOOTH_NAME, + COMPLETE_TRAVEL, + + CAST_INSTANT_SKILL = 80, + DESTROY_ITEM, + ENABLE_PVP_STATE, + DISABLE_PVP_STATE, + OPEN_BOOTH_TEST, + + SWITCH_FASHION_MODE = 85, + ENTER_INSTANCE, + REVIVAL_AGREE, + NOTIFY_POS_IN_TEAM, + CAST_POS_SKILL, + + ACTIVE_RUSH_FLY = 90, + QUERY_DOUBLE_EXP, + DUEL_REQUEST, + DUEL_REPLY, + BIND_PLAYER_REQUEST, + + BIND_PLAYER_INVITE = 95, + BIND_PLAYER_REQUEST_REPLY, + BIND_PLAYER_INVITE_REPLY, + CANCEL_BIND_PLAYER, + GET_OTHER_EQUIP_DETAIL, + + SUMMON_PET = 100, + RECALL_PET, + BANISH_PET, + PET_CTRL, + DEBUG_DELIVER_CMD, + + DEBUG_GS_CMD = 105, + MALL_SHOPPING, + GET_WALLOW_INFO, + TEAM_DISMISS_PARTY, + USE_ITEM_WITH_ARG, + + QUERY_CASH_INFO = 110, + ELF_ADD_ATTRIBUTE, + ELF_ADD_GENIUS, + ELF_PLAYER_INSERT_EXP, + ELF_EQUIP_ITEM, + + ELF_CHANGE_SECURE_STATUS = 115, + CAST_ELF_SKILL, + RECHARGE_EQUIPPED_ELF, + GET_MALL_ITEM_PRICE, + EQUIP_FASHION_ITEM, + + CHECK_SECURITY_PASSWD = 120, + NOTIFY_FORCE_ATTACK, + DIVIDEND_MALL_SHOPPING, + GET_DIVIDEND_MALL_ITEM_PRICE, + CHOOSE_MULTI_EXP, + + TOGGLE_MULTI_EXP = 125, + MULTI_EXCHANGE_ITEM, + SYSAUCTION_OP, + CALC_NETWORK_DELAY, + GET_FACTION_FORTRESS_INFO, + + CONGREGATE_REPLY = 130, + GET_FORCE_GLOBAL_DATA, + PRODUCE4_CHOOSE, + RECHARGE_ONLINE_AWARD, + TOGGLE_ONLINE_AWARD, + + QUERY_PROFIT_TIME = 135, + ENTER_PK_PROTECTED, + COUNTRYBATTLE_GET_PERSONAL_SCORE, + GET_SERVER_TIMESTAMP, + COUNTRYBATTLE_LEAVE, + + GET_CASH_MONEY_EXCHG_RATE = 140, + EVOLUTION_PET, + ADD_PET_EXP, + REBUILD_PET_NATURE, + REBUILD_PET_INHERIT_RATIO, + + PET_REBUILD_INHERIT_CHOOSE = 145, + PET_REBUILD_NATURE_CHOOSE, + EXCHANGE_WANMEI_YINPIAO, + PLAYER_GIVE_PRESENT, + PLAYER_ASK_FOR_PRESENT, + + MERIDIANS_IMPACT = 150, + COUNTRYBATTLE_GET_STRONGHOLD_STATE, + QUERY_TOUCH_POINT, + SPEND_TOUCH_POINT, + QUERY_TITLE, + + CHANGE_CURR_TITLE = 155, + DAILY_SIGNIN, + LATE_SIGNIN, + APPLY_SIGNINAWARD, + REFRESH_SIGNIN, + + SWITCH_IN_PARALLEL_WORLD = 160, + QUERY_PARALLEL_WORLD, + GET_REINCARNATION_TOME, + REWRITE_REINCARNATION_TOME, + ACTIVATE_REINCARNATION_TOME, + + QUERY_UNIQUE_DATA = 165, + AUTO_TEAM_SET_GOAL, + AUTO_TEAM_JUMP_TO_GOAL, + TRICKBATTLE_LEAVE, + TRICKBATTLE_UPGRADE_CHARIOT, + + SWALLOW_GENERALCARD = 170, + EQUIP_TRASHBOX_ITEM, + QUERY_TRICKBATTLE_CHARIOTS, + COUNTRYBATTLE_LIVE_SHOW, + SEND_MASS_MAIL, + + RANDOM_MALL_SHOPPING = 175, + QUERY_MAFIA_PVP_INFO, + QUERY_CAN_INHERIT_ADDONS, + ACTIVATE_REGION_WAYPOINTS, + INSTANCE_REENTER_REQUEST, + + NUM_C2SCMD, + + // GM Commands + GM_CMD_START = 200, + GM_MOVETO_PLAYER, + GM_CALLIN_PLAYER, + GM_KICK_PLAYER, // Requires target selection, no parameters + GM_INVISIBLE, // Toggle self invisibility, no parameters + + GM_INVINCIBLE = 205, // Toggle self invincibility, no parameters + GM_GENERATE, + GM_ACTIVE_SPAWNER, + GM_GENERATE_MOB, + + GM_QUERY_SPEC_ITEM = 218, // query player's trashbox detail + GM_REMOVE_SPEC_ITEM, // remove items in trashbox + GM_OPEN_ACTIVITY, // GM open activity + GM_CHANGE_DS, // GM cross-server + } + + // Basic command header structure + public struct CMD_Header + { + public CommandID cmd; + } + + // Player movement command + public struct CMD_PlayerMove + { + public Vector3 vCurPos; // Current position + public Vector3 vNextPos; // Next position + public ushort useTime; // Time to use + public short speed; // Move speed 8.8 fix-point + public byte moveMode; // Walk run swim fly .... walk_back run_back + public ushort stamp; // Move command stamp + } + struct cmd_object_move + { + public int id; + public Vector3 dest; + public float use_time; + public short sSpeed; // Move speed 8.8 fix-point + public byte move_mode; + }; + + // Stop movement command + public struct CMD_StopMove + { + public Vector3 vCurPos; // Current position + public short speed; // Moving speed in 8.8 fix-point + public byte dir; // Object direction + public byte moveMode; // Walk run swim fly .... walk_back run_back + public ushort stamp; // Move command stamp + public ushort useTime; // Time to use + } + + // Player logout command + public struct CMD_PlayerLogout + { + public int outType; + } + + // Select target command + public struct CMD_SelectTarget + { + public int id; + } + + // Normal attack command + public struct CMD_NormalAttack + { + public byte pvpMask; + } + + public struct cmd_error_msg + { + public int iMessage; + } + + // Pickup item command + public struct CMD_Pickup + { + public int idItem; + public int tid; // Template ID + } + + // Get item info command + public struct CMD_GetItemInfo + { + public byte byPackage; + public byte bySlot; + } + // Get inventory + public struct CMD_GetInventory + { + public byte byPackage; + } + // Get inventory detail + public struct CMD_GetInventoryDetail + { + public byte byPackage; + } + // NPC trade item structure + public struct CMD_NPCTradeItem + { + public int tid; + public int index; + public int count; + } + + // NPC sell item structure + public struct CMD_NPCSellItem + { + public int tid; + public int index; + public int count; + public int price; + } + + // NPC booth item structure + public struct CMD_NPCBoothItem + { + public int tid; + public ushort index; + public ushort invIndex; + public uint count; + } + + // Exchange inventory item command + public struct CMD_ExchangeInventoryItem + { + public byte index1; + public byte index2; + } + + // Move inventory item command + public struct CMD_MoveInventoryItem + { + public byte src; + public byte dest; + public uint count; + } + + // Exchange equipment item command + public struct CMD_ExchangeEquipItem + { + public byte index1; + public byte index2; + } + + public struct CMD_CheckSecurityPassWd + { + public uint passwd_size; + } + + // Equip item command + public struct CMD_EquipItem + { + public byte idx_inv; + public byte idx_eq; + } + + public struct CMD_DropIvtrItem + { + public byte index; + public int amount; + } + + public struct CMD_DropEquipItem + { + public byte index; + } + // Move equipment item command + public struct CMD_MoveEquipItem + { + public byte indexInv; + public byte indexEquip; + public uint amount; + } + + // Add status point command + public struct CMD_AddStatusPoint + { + public int vitality; + public int energy; + public int strength; + public int agility; + public int remain; + } + + // Team leader invite command + public struct CMD_TeamLeaderInvite + { + public int idLeader; + public int seq; + public ushort pickFlag; + } + + // Team member position command + public struct CMD_TeamMemberPos + { + public ushort memberCount; + public int[] memberIDs; // Variable length array + } + + // Get other equipment command + public struct CMD_GetOtherEquip + { + public ushort size; + public int[] idList; // Variable length array + } + + // Team set pickup command + public struct CMD_TeamSetPickup + { + public short pickupFlag; + } + + // Get all data command + public struct CMD_GetAllData + { + public byte byPack; + public byte byEquip; + public byte byTask; + } + + // Use item command + public struct CMD_UseItem + { + public byte where; + public byte byCount; + public ushort index; + public int itemId; + } + + // Cast skill command + public struct CMD_CastSkill + { + public int skillId; + public byte pvpMask; + public byte targetCount; + public int[] targets; // Variable length array + } + + // Dead move command + public struct CMD_DeadMove + { + public float y; + public ushort useTime; + public ushort speed; + public byte moveMode; + } + + // Dead stop move command + public struct CMD_DeadStopMove + { + public float y; + public ushort speed; + public byte dir; + public byte moveMode; + } + + // Enter sanctuary command + public struct CMD_EnterSanctuary + { + public int id; + } + + // Open booth command + public struct CMD_OpenBooth + { + public ushort count; + public string name; // Max 62 bytes + + public struct Entry + { + public int type; + public int index; + public int count; + public int price; + } + public Entry[] list; // Variable length array + } + + // Query booth name command + public struct CMD_QueryBoothName + { + public ushort count; + public int[] list; // Variable length array + } + + // Evolution pet command + public struct CMD_EvolutionPet + { + public int petIndex; + public int formulaIndex; + } + + // Add pet exp command + public struct CMD_AddPetExp + { + public int petIndex; + public int itemNum; + } + + // Rebuild pet nature command + public struct CMD_RebuildPetNature + { + public int petIndex; + public int formulaIndex; + } + + // Rebuild pet inherit ratio command + public struct CMD_RebuildPetInheritRatio + { + public int petIndex; + public int formulaIndex; + } + + // Pet rebuild inherit choose command + public struct CMD_PetRebuildInheritChoose + { + public byte isAccept; + } + + // Pet rebuild nature choose command + public struct CMD_PetRebuildNatureChoose + { + public byte isAccept; + } + + // Try refine meridian command + public struct CMD_TryRefineMeridian + { + public int index; // Gate index + } + + // Player give present command + public struct CMD_PlayerGivePresent + { + public int roleId; + public int mailId; + public int goodsId; + public int goodsIndex; + public int goodsSlot; + } + + // Player ask for present command + public struct CMD_PlayerAskForPresent + { + public int roleId; + public int goodsId; + public int goodsIndex; + public int goodsSlot; + } + + // Spend touch point command + public struct CMD_SpendTouchPoint + { + public uint index; + public uint lots; + public int id; + public uint num; + public uint price; + public int expireTime; + } + + // Query unique data command + public struct CMD_QueryUniqueData + { + public int count; + public int[] key; // Variable length array + } + + // Revive command + public struct CMD_Revive + { + public int param; // For chariot battlefield this is chariotId, meaningless for other scenes + } + + // Trickbattle upgrade chariot command + public struct CMD_TrickbattleUpgradeChariot + { + public int chariot; + } + + // Swallow general card command + public struct CMD_SwallowGeneralCard + { + public byte equipIndex; + public byte isInv; + public byte swallowedEquipIndex; + public uint count; + } + + // Equip trashbox item command + public struct CMD_EquipTrashboxItem + { + public byte trashBoxIndex; + public byte itemIndexInBox; + public byte equipIndex; + } + + // Send mass mail command + public struct CMD_SendMassMail + { + public int serviceId; + public byte[] data; // Variable length array + } + + // Random mall shopping command + public struct CMD_RandomMallShopping + { + public int configId; + public int op; + } + + // Query faction PVP info command + public struct CMD_QueryFactionPvpInfo + { + public int factionId; + } + + // Query can inherit addons command + public struct CMD_QueryCanInheritAddons + { + public int equipId; + public byte invIdx; + } + + // Activate region waypoints command + public struct CMD_ActivateRegionWaypoints + { + public byte num; + public int[] waypoints; // Variable length array + } + + // Instance reenter request command + public struct CMD_InstanceReenterRequest + { + public bool agree; + } +} + +namespace CSNetwork.S2CCommand +{ + public enum eCommandID// Command ID + { + PROTOCOL_COMMAND = -1, // Reserved for protocol + + PLAYER_INFO_1 = 0, + PLAYER_INFO_2, + PLAYER_INFO_3, + PLAYER_INFO_4, + PLAYER_INFO_1_LIST, + + PLAYER_INFO_2_LIST, // 5 + PLAYER_INFO_3_LIST, + PLAYER_INFO_23_LIST, + SELF_INFO_1, + NPC_INFO_LIST, + + MATTER_INFO_LIST, // 10 + NPC_ENTER_SLICE, + PLAYER_ENTER_SLICE, + OBJECT_LEAVE_SLICE, + NOTIFY_HOSTPOS, + + OBJECT_MOVE, // 15 + NPC_ENTER_WORLD, + PLAYER_ENTER_WORLD, + MATTER_ENTER_WORLD, + PLAYER_LEAVE_WORLD, + + NPC_DIED, // 20 + OBJECT_DISAPPEAR, + OBJECT_STARTATTACK, // ������ + HOST_STOPATTACK, + HOST_ATTACKRESULT, + + ERROR_MESSAGE, // 25 + HOST_ATTACKED, + PLAYER_DIED, + HOST_DIED, + PLAYER_REVIVE, + + PICKUP_MONEY, // 30 + PICKUP_ITEM, + PLAYER_INFO_00, + NPC_INFO_00, + OUT_OF_SIGHT_LIST, + + OBJECT_STOP_MOVE, // 35 + RECEIVE_EXP, + LEVEL_UP, + SELF_INFO_00, + UNSELECT, + + OWN_ITEM_INFO, // 40, Own item information + EMPTY_ITEM_SLOT, // Empty item slot notify + OWN_IVTR_DATA, // Own inventory data + OWN_IVTR_DETAIL_DATA, + EXG_IVTR_ITEM, + + MOVE_IVTR_ITEM, // 45 + PLAYER_DROP_ITEM, + EXG_EQUIP_ITEM, + EQUIP_ITEM, + MOVE_EQUIP_ITEM, + + OWN_EXT_PROP, // 50 + ADD_STATUS_POINT, + SELECT_TARGET, + PLAYER_EXT_PROP_BASE, + PLAYER_EXT_PROP_MOVE, + + PLAYER_EXT_PROP_ATK, // 55 + PLAYER_EXT_PROP_DEF, + TEAM_LEADER_INVITE, + TEAM_REJECT_INVITE, + TEAM_JOIN_TEAM, + + TEAM_MEMBER_LEAVE, // 60 + TEAM_LEAVE_PARTY, + TEAM_NEW_MEMBER, + TEAM_LEADER_CACEL_PARTY, + TEAM_MEMBER_DATA, + + TEAM_MEMBER_POS, // 65 + EQUIP_DATA, // �û���װ�����ݣ�Ӱ����� + EQUIP_DATA_CHANGED, + EQUIP_DAMAGED, // װ���� + TEAM_MEMBER_PICKUP, // ���Ѽ���װ�� + + NPC_GREETING, // 70 + NPC_SERVICE_CONTENT, + PURCHASE_ITEM, + ITEM_TO_MONEY, + REPAIR_ALL, + + REPAIR, // 75 + RENEW, + SPEND_MONEY, + GAIN_MONEY_IN_TRADE, + GAIN_ITEM_IN_TRADE, + + GAIN_MONEY_AFTER_TRADE, // 80 + GAIN_ITEM_AFTER_TRADE, + GET_OWN_MONEY, + ATTACK_ONCE, + HOST_START_ATTACK, + + OBJECT_CAST_SKILL, // 85 + SKILL_INTERRUPTED, + SELF_SKILL_INTERRUPTED, + SKILL_PERFORM, + OBJECT_BE_ATTACKED, // ������ + + SKILL_DATA, // 90 + HOST_USE_ITEM, + EMBED_ITEM, + CLEAR_TESSERA, + COST_SKILL_POINT, + + LEARN_SKILL, // 95 + OBJECT_TAKEOFF, + OBJECT_LANDING, + FLYSWORD_TIME, + HOST_OBTAIN_ITEM, + + PRODUCE_START, // 100 + PRODUCE_ONCE, + PRODUCE_END, + DECOMPOSE_START, + DECOMPOSE_END, + + TASK_DATA, // 105 + TASK_VAR_DATA, + OBJECT_START_USE, + OBJECT_CANCEL_USE, + OBJECT_USE_ITEM, + + OBJECT_START_USE_T, // 110 + OBJECT_SIT_DOWN, + OBJECT_STAND_UP, + OBJECT_DO_EMOTE, + SERVER_TIME, + + OBJECT_ROOT, // 115 + HOST_DISPEL_ROOT, + INVADER_RISE, + PARIAH_RISE, + INVADER_FADE, + + OBJECT_ATTACK_RESULT, // 120 + BE_HURT, + HURT_RESULT, + HOST_STOP_SKILL, + UPDATE_EXT_STATE, + + ICON_STATE_NOTIFY, // 125 + PLAYER_GATHER_START, + PLAYER_GATHER_STOP, + TRASHBOX_PWD_CHANGED, + TRASHBOX_PWD_STATE, + + TRASHBOX_OPEN, // 130 + TRASHBOX_CLOSE, + TRASHBOX_WEALTH, + EXG_TRASHBOX_ITEM, + MOVE_TRASHBOX_ITEM, + + EXG_TRASHBOX_IVTR, // 135 + IVTR_ITEM_TO_TRASH, + TRASH_ITEM_TO_IVTR, + EXG_TRASH_MONEY, + ENCHANT_RESULT, + + HOST_NOTIFY_ROOT, // 140 + OBJECT_DO_ACTION, + HOST_SKILL_ATTACK_RESULT, + OBJECT_SKILL_ATTACK_RESULT, + HOST_SKILL_ATTACKED, + + PLAYER_SET_ADV_DATA, // 145 + PLAYER_CLR_ADV_DATA, + PLAYER_IN_TEAM, + TEAM_ASK_TO_JOIN, + OBJECT_EMOTE_RESTORE, + + CON_EMOTE_REQUEST, // 150, concurrent emote request + DO_CONCURRENT_EMOTE, + MATTER_PICKUP, + MAFIA_INFO_NOTIFY, + MAFIA_TRADE_START, + + MAFIA_TRADE_END, // 155 + TASK_DELIVER_ITEM, + TASK_DELIVER_REP, + TASK_DELIVER_EXP, + TASK_DELIVER_MONEY, + + TASK_DELIVER_LEVEL2, // 160 + HOST_REPUTATION, + ITEM_IDENTIFY, + PLAYER_CHGSHAPE, + ENTER_SANCTUARY, + + LEAVE_SANCTUARY, // 165 + PLAYER_OPEN_BOOTH, + SELF_OPEN_BOOTH, + PLAYER_CLOSE_BOOTH, + PLAYER_BOOTH_INFO, + + BOOTH_TRADE_SUCCESS, // 170 + BOOTH_NAME, + PLAYER_START_TRAVEL, + HOST_START_TRAVEL, + PLAYER_END_TRAVEL, + + GM_INVINCIBLE, // 175 + GM_INVISIBLE, + HOST_CORRECT_POS, + OBJECT_CAST_INSTANT_SKILL, + ACTIVATE_WAYPOINT, + + WAYPOINT_LIST, // 180 + UNFREEZE_IVTR_SLOT, // Unfreeze inventory item + TEAM_INVITE_TIMEOUT, + PLAYER_ENABLE_PVP, + PLAYER_DISABLE_PVP, + + HOST_PVP_COOLDOWN, // 185 + COOLTIME_DATA, + SKILL_ABILITY, + OPEN_BOOTH_TEST, + BREATH_DATA, + + HOST_STOP_DIVE, // 190 + BOOTH_SELL_ITEM, + PLAYER_ENABLE_FASHION, + HOST_ENABLE_FREEPVP, + INVALID_OBJECT, + + PLAYER_ENABLE_EFFECT, // 195 + PLAYER_DISABLE_EFFECT, + REVIVAL_INQUIRE, + SET_COOLDOWN, + CHANGE_TEAM_LEADER, + + EXIT_INSTANCE, // 200 + CHANGE_FACE_START, + CHANGE_FACE_END, + PLAYER_CHG_FACE, // Player change face completed + OBJECT_CAST_POS_SKILL, + + SET_MOVE_STAMP, // 205 + INST_DATA_CHECKOUT, + HOST_RUSH_FLY, + TRASHBOX_SIZE, + NPC_DIED2, + + PRODUCE_NULL, // 210 + PVP_COMBAT, + DOUBLE_EXP_TIME, + AVAILABLE_DOUBLE_EXP_TIME, + DUEL_RECV_REQUEST, + + DUEL_REJECT_REQUEST, // 215 + DUEL_PREPARE, + DUEL_CANCEL, + HOST_DUEL_START, + DUEL_STOP, + + DUEL_RESULT, // 220 + PLAYER_BIND_REQUEST, + PLAYER_BIND_INVITE, + PLAYER_BIND_REQUEST_REPLY, + PLAYER_BIND_INVITE_REPLY, + + PLAYER_BIND_START, // 225 + PLAYER_BIND_STOP, + PLAYER_MOUNTING, + PLAYER_EQUIP_DETAIL, + PLAYER_DUEL_START, + + PARIAH_TIME, // 230 + GAIN_PET, + FREE_PET, + SUMMON_PET, + RECALL_PET, + + PLAYER_START_PET_OP, // 235 + PLAYER_STOP_PET_OP, + PET_RECEIVE_EXP, + PET_LEVELUP, + PET_ROOM, + + PET_ROOM_CAPACITY, // 240 + PET_HONOR_POINT, + PET_HUNGER_GAUGE, + HOST_ENTER_BATTLE, + TANK_LEADER_NOTIFY, + + BATTLE_RESULT, // 245 + BATTLE_SCORE, + PET_DEAD, + PET_REVIVE, + PET_HP_NOTIFY, + + PET_AI_STATE, // 250 + REFINE_RESULT, + PET_SET_COOLDOWN, + PLAYER_CASH, + PLAYER_BIND_SUCCESS, + + CHANGE_IVTR_SIZE, // 255 + PVP_MODE, + PLAYER_WALLOW_INFO, + PLAYER_USE_ITEM_WITH_ARG, + OBJECT_USE_ITEM_WITH_ARG, + + PLAYER_CHANGE_SPOUSE, // 260 + NOTIFY_SAFE_LOCK, + ELF_VIGOR, + ELF_ENHANCE, + ELF_STAMINA, + + ELF_CMD_RESULT, // 265 + COMMON_DATA_NOTIFY, + COMMON_DATA_LIST, + ELF_REFINE_ACTIVATE, + CAST_ELF_SKILL, + + MALL_ITEM_PRICE, // 270 + MALL_ITEM_BUY_FAILED, + GOBLIN_LEVEL_UP, + PLAYER_PROPERTY, + PLAYER_CAST_RUNE_SKILL, + + PLAYER_CAST_RUNE_INSTANT_SKILL, //275 + PLAYER_EQUIP_TRASHBOX_ITEM, + SECURITY_PASSWD_CHECKED, + OBJECT_INVISIBLE, + PLAYER_HP_STEAL, + + PLAYER_DIVIDEND, // 280 + DIVIDEND_MALL_ITEM_PRICE, + DIVIDEND_MALL_ITEM_BUY_FAILED, + ELF_EXP, + PUBLIC_QUEST_INFO, + + PUBLIC_QUEST_RANKS, // 285 + MULTI_EXP_INFO, + CHANGE_MULTI_EXP_STATE, + WORLD_LIFE_TIME, + WEDDING_BOOK_LIST, + + WEDDING_BOOK_SUCCESS, // 290 + CALC_NETWORK_DELAY_RE, + PLAYER_KNOCKBACK, + SUMMON_PLANT_PET, + PLANT_PET_DISAPPEAR, + + PLANT_PET_HP_NOTIFY, // 295 + PET_PROPERTY, + FACTION_CONTRIB_NOTIFY, + FACTION_FORTRESS_INFO, + ENTER_FACTIONFORTRESS, + + FACTION_RELATION_NOTIFY, // 300 + PLAYER_EQUIP_DISABLED, + PLAYER_SPEC_ITEM_LIST, // return value of GM_QUERY_SPEC_ITEM + OBJECT_START_PLAY_ACTION, + OBJECT_STOP_PLAY_ACTION, + + CONGREGATE_REQUEST, // 305 + REJECT_CONGREGATE, + CONGREGATE_START, + CANCEL_CONGREGATE, + ENGRAVE_START, + + ENGRAVE_END, // 310 + ENGRAVE_RESULT, + DPS_DPH_RANK, + ADDONREGEN_START, + ADDONREGEN_END, + + ADDONREGEN_RESULT, // 315 + INVISIBLE_OBJ_LIST, + SET_PLAYER_LIMIT, + PLAYER_TELEPORT, + OBJECT_FORBID_BE_SELECTED, + + PLAYER_INVENTORY_DETAIL, // 320 + PLAYER_FORCE_DATA, + PLAYER_FORCE_CHANGED, + PLAYER_FORCE_DATA_UPDATE, + FORCE_GLOBAL_DATA, + + ADD_MULTIOBJECT_EFFECT, // 325 + REMOVE_MULTIOBJECT_EFFECT, + ENTER_WEDDING_SCENE, + PRODUCE4_ITEM_INFO, + ONLINE_AWARD_DATA, //���߽��� + + TOGGLE_ONLINE_AWARD, // 330 ����л������߽����Ŀ���״̬ + PLAYER_PROFIT_TIME, // �������ʱ�� + ENTER_NONPENALTY_PVP_STATE, // PK�޳ͷ� + SELF_COUNTRY_NOTIFY, + PLAYER_COUNTRY_CHANGED, + + ENTER_COUNTRYBATTLE, // 335 + COUNTRYBATTLE_RESULT, + COUNTRYBATTLE_SCORE, + COUNTRYBATTLE_RESURRECT_REST_TIMES, + COUNTRYBATTLE_FLAG_CARRIER_NOTIFY, + + COUNTRYBATTLE_BECAME_FLAG_CARRIER, // 340 + COUNTRYBATTLE_PERSONAL_SCORE, + COUNTRYBATTLE_FLAG_MSG_NOTIFY, + DEFENSE_RUNE_ENABLED, + COUNTRYBATTLE_INFO, + + SET_PROFIT_TIME, //345 + CASH_MONEY_EXCHG_RATE, + PET_REBUILD_INHERIT_START, + PET_REBUILD_INHERIT_INFO, + PET_REBUILD_INHERIT_END, + + PET_EVOLUTION_DONE, //350 + PET_REBUILD_NATURE_START, + PET_REBUILD_NATURE_INFO, + PET_REBUILD_NATURE_END, + EQUIP_ADDON_UPDATE_NOTIFY, //354 ֪ͨװ����ʯ��� + + SELF_KING_NOTIFY, // 355 + PLAYER_KING_CHANGED, + MERIDIANS_NOTIFY, // ������Ϣ��� + MERIDIANS_RESULT, // ������Ѩ��� + COUNTRYBATTLE_STRONGHOND_STATE_NOTIFY, + + QUERY_TOUCH_POINT, // 360 + SPEND_TOUCH_POINT, + TOTAL_RECHARGE, + QUERY_TITLE_RE, + CHANGE_CURR_TITLE_RE, + + MODIFY_TITLE_NOFIFY, // 365 + REFRESH_SIGNIN, // ǩ��״̬ + PARALLEL_WORLD_INFO, + PLAYER_REINCARNATION, // ���ת�� + REINCARNATION_TOME_INFO, // ת��������Ϣ + + ACTIVATE_REINCARNATION_TOME, // 370 ת�������Ƿ񼤻� + UNIQUE_DATA_NOTIFY, // ��ʷ�ƽ� ��ȫ������ + USE_GIFTCARD_RESULT, + REALM_EXP, // ���羭�� + REALM_LEVEL, // ����ȼ� + + ENTER_TRICKBATTLE, // 375 ����ս�� ���庬��ͬ��ս����ս�� + TRICKBATTLE_PERSONAL_SCORE, // ս���Լ��÷� + TRICKBATTLE_CHARIOT_INFO, // ս����Ϣ + PLAYER_LEADERSHIP, // ���ͳ���� + GENERALCARD_COLLECTION_DATA, // �佫��ͼ������ + + ADD_GENERALCARD_COLLECTION, // 380 �ղؿ��� + REFRESH_MONSTERSPIRIT_LEVEL, // ���� + MINE_GATHERED, // ����ɹ��ɼ��㲥 + PLAYER_IN_OUT_BATTLE, // ������ҽ���/����ս��״̬ + PLAYER_QUERY_CHARIOTS, // ս��������ѯ + + COUNTRYBATTLE_LIVE_SHOW_RESULT, // 385 ��սս��rank���������� + RANDOM_MALL_SHOPPING_RES, // ����̳Dz�ѯ���� + FACTION_PVP_MASK_MODIFY, // ����PVP״̬�ı� + PLAYER_WORLD_CONTRIBUTION, // ���繱�׶� + RANDOM_MAP_ORDER, // �����ͼ + + SCENE_SERVICE_NPC_LIST, // 390��ǰ������ѧϰ���ܵ�NPC�б� + NPC_VISIBLE_TID_NOTIFY, // �㲥֪ͨ��Ұ��npc�任����ģ�� + CLIENT_SCREEN_EFFECT, // ��Ļ��Ч + EQUIP_CAN_INHERIT_ADDONS, // ��������5�ɼ̳еĸ������� + COMBO_SKILL_PREPARE, + + INSTANCE_REENTER_NOTIFY, // 395 ��������֪ͨ + PRAY_DISTANCE_CHANGE, // ����������� + }; + + public struct CMD_GetAllData + { + byte byPack; // Get detail info. flag + byte byEquip; + byte byTask; + }; + public struct CMD_OwnInventoryInfo + { + public byte byPackage; + public byte ivtr_size; + public uint content_length; + public byte[] content; + }; + public struct CMD_OwnInventoryDetailInfo + { + public byte byPackage; + public byte ivtr_size; + public uint content_length; + public byte[] content; + }; + // Drop inventory item command + public struct CMD_PlayerDropItem + { + public byte byPackage; + public byte bySlot; + public uint count; + public int tid; + public byte reason; + }; + public struct CMD_OwnItemInfo + { + public byte byPackage; + public byte bySlot; + public int type; + public int expire_date; + public int state; + public uint count; + public ushort crc; + public ushort content_length; + public byte[] content; + }; + // Equip item command + public struct CMD_EquipItem + { + public byte index_inv; + public byte index_equip; + public uint count_inv; + public uint count_equip; + } + public struct CMD_InfoPlayer1 + { + public int cid; + public Vector3 pos; + public ushort crc_e; + public ushort crc_c; + public byte dir; //256�Ķ�������ʾ���� + public byte level2; + public int state; + public int state2; + + // public bool CheckValid(int buf_size, int sz) + // { + // if (buf_size< sizeof(this)) + // return false; + + // sz = sizeof(*this); + + // if (state & eStatePlayerAndNPC.GP_STATE_ADV_MODE) + // sz += sizeof(DWORD)* 2; + + // if (state & GP_STATE_SHAPE) + // sz += sizeof(char); + + // if (state & GP_STATE_EMOTE) + // sz += sizeof(char); + + // if (state & GP_STATE_EXTEND_PROPERTY) + // sz += sizeof(DWORD)* OBJECT_EXT_STATE_COUNT; + + // if (state & GP_STATE_FACTION) + // sz += sizeof(int) + sizeof(char); + + // if (state & GP_STATE_BOOTH) + // sz += sizeof(char); + + // if (state & GP_STATE_EFFECT) + // { + // const BYTE* pData = reinterpret_cast (this) + sz; + // sz += sizeof(BYTE); + + // if (buf_size(this) + sz; + // sz += sizeof(int); + + // if (buf_size < sz) + // return false; + + // sz += *(int *)pData * (sizeof(int) + sizeof(char)); + // } + + // if (state & GP_STATE_COUNTRY) + // sz += sizeof(int); + // if (state2 & GP_STATE2_TITLE) + // sz += sizeof(unsigned short); + // if (state2 & GP_STATE2_REINCARNATION) + // sz += sizeof(unsigned char); + // if (state2 & GP_STATE2_REALM) + // sz += sizeof(unsigned char); + // if (state2 & GP_STATE2_FACTION_PVP_MASK) + // sz += sizeof(unsigned char); + + // return buf_size >= sz; + // } + //unsigned char GetGender()const{ + // return (state2 & GP_STATE2_GENDER) ? GENDER_FEMALE : GENDER_MALE; + // } + } + + public struct CMD_TaskData + { + public uint active_list_size; + public byte[] active_list; + + public uint finished_list_size; + public byte[] finished_list; + + public uint finished_time_list_size; + public byte[] finished_time_list; + + public uint finished_count_size; + public byte[] finished_count; + + public uint storage_task_size; + public byte[] storage_task; + }; + public struct CMD_TaskVarData + { + public uint size; + public byte[] data; + }; + + //public struct CMD_InfoPlayer2 //name ,customize data �����ı� + //{ + // public byte size; + // public char data[1]; + //}; +} + +// Player and NPC state \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs.meta new file mode 100644 index 0000000000..11cf9753b1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e1241d6c086734d9ebada34113290082 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs new file mode 100644 index 0000000000..9d2c624942 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs @@ -0,0 +1,407 @@ +using CSNetwork.GPDataType; +using CSNetwork.S2CCommand; +using System; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Threading.Tasks; + +namespace CSNetwork.C2SCommand +{ + public static class C2SCommandFactory + { + private static readonly IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(GameSession)); // Get class-specific logger + // Special types that need custom serialization + private static bool NeedsCustomSerialization(Type type) + { + return type == typeof(string) + || type == typeof(Vector3) + || type.IsArray + || !type.IsValueType; + } + + // Generic command serialization + public static Octets SerializeCommand(CommandID cmdId, T command) + where T : struct + { + var octets = new Octets(); + + // Write command header - write enum value directly + WriteBasicValue(octets, (ushort)cmdId); + + // Write command body + WriteStruct(octets, command); + + return octets; + } + public static Octets SerializeCommand(eCommandID cmdId, T command) + where T : struct + { + var octets = new Octets(); + + // Write command header - write enum value directly + WriteBasicValue(octets, (ushort)cmdId); + + // Write command body + WriteStruct(octets, command); + + return octets; + } + + // Serialize a nake command (commands that have id but havn't data) + public static Octets SerializeCommand(CommandID cmdId) + { + var octets = new Octets(); + WriteBasicValue(octets, (ushort)cmdId); + return octets; + } + + private static void WriteStruct(Octets octets, T value) + where T : struct + { + // Get fields of the struct + var fields = typeof(T).GetFields(); + + foreach (var field in fields) + { + var fieldValue = field.GetValue(value); + var fieldType = field.FieldType; + + if (NeedsCustomSerialization(fieldType)) + { + // Handle special types + if (fieldType == typeof(Vector3)) + { + var vec = (Vector3)fieldValue; + WriteBasicValue(octets, vec.X); + WriteBasicValue(octets, vec.Y); + WriteBasicValue(octets, vec.Z); + } + else if (fieldType == typeof(string)) + { + WriteString(octets, (string)fieldValue); + } + else if (fieldType.IsArray) + { + WriteArray(octets, (Array)fieldValue); + } + } + else if (fieldType.IsEnum) + { + // Handle enum by getting underlying value + var underlyingType = Enum.GetUnderlyingType(fieldType); + var enumValue = Convert.ChangeType(fieldValue, underlyingType); + WriteBasicValue(octets, enumValue); + } + else + { + // For basic value types, use non-generic overload + WriteBasicValue(octets, fieldValue, fieldType); + } + } + } + + // Generic version for known types + private static void WriteBasicValue(Octets octets, T value) + { + if (value == null) + return; + + WriteBasicValue(octets, value, typeof(T)); + } + + // Non-generic version for handling object values with known type + private static void WriteBasicValue(Octets octets, object value, Type type) + { + if (value == null) + return; + + // Handle enums + if (type.IsEnum) + { + type = Enum.GetUnderlyingType(type); + value = Convert.ChangeType(value, type); + } + + byte[] bytes; + if (type == typeof(byte)) + bytes = new[] { (byte)value }; + else if (type == typeof(sbyte)) + bytes = new[] { (byte)(sbyte)value }; + else if (type == typeof(short)) + bytes = BitConverter.GetBytes((short)value); + else if (type == typeof(ushort)) + bytes = BitConverter.GetBytes((ushort)value); + else if (type == typeof(int)) + bytes = BitConverter.GetBytes((int)value); + else if (type == typeof(uint)) + bytes = BitConverter.GetBytes((uint)value); + else if (type == typeof(long)) + bytes = BitConverter.GetBytes((long)value); + else if (type == typeof(ulong)) + bytes = BitConverter.GetBytes((ulong)value); + else if (type == typeof(float)) + bytes = BitConverter.GetBytes((float)value); + else if (type == typeof(double)) + bytes = BitConverter.GetBytes((double)value); + else if (type == typeof(bool)) + bytes = BitConverter.GetBytes((bool)value); + else + throw new ArgumentException( + $"Unsupported type for basic value serialization: {type.Name}" + ); + + octets.Insert(octets.Size, bytes); + } + + private static void WriteString(Octets octets, string str, int maxLength = 62) + { + if (octets == null) + return; + + if (string.IsNullOrEmpty(str)) + { + WriteBasicValue(octets, (byte)0); + return; + } + + byte[] strBytes = System.Text.Encoding.UTF8.GetBytes(str); + byte length = (byte)Math.Min(strBytes.Length, maxLength); + WriteBasicValue(octets, length); + octets.Insert(octets.Size, strBytes.AsSpan(0, length).ToArray()); + } + + private static void WriteArray(Octets octets, Array array) + { + if (octets == null) + return; + if (array == null) + { + WriteBasicValue(octets, 0); + return; + } + + WriteBasicValue(octets, array.Length); + + var elementType = array.GetType().GetElementType(); + if (NeedsCustomSerialization(elementType)) + { + // Handle arrays of special types + for (int i = 0; i < array.Length; i++) + { + var element = array.GetValue(i); + if (elementType == typeof(Vector3)) + { + var vec = (Vector3)element; + WriteBasicValue(octets, vec.X); + WriteBasicValue(octets, vec.Y); + WriteBasicValue(octets, vec.Z); + } + else if (elementType.IsValueType) + { + WriteBasicValue(octets, element, elementType); + } + } + } + else + { + // For basic type arrays, handle each element individually + for (int i = 0; i < array.Length; i++) + { + WriteBasicValue(octets, array.GetValue(i), elementType); + } + } + } + + // Example usage methods + public static Octets CreatePlayerMove( + Vector3 curPos, + Vector3 nextPos, + ushort useTime, + float speed, + byte moveMode, + ushort stamp + ) + { + var cmd = new CMD_PlayerMove + { + vCurPos = curPos, + vNextPos = nextPos, + useTime = useTime, + speed = FloatToFix8(speed), + moveMode = moveMode, + stamp = stamp + }; + return SerializeCommand(CommandID.PLAYER_MOVE, cmd); + } + public static Octets CreatePlayerStop( + in Vector3 vDest, float fSpeed, byte iMoveMode, + byte byDir, ushort wStamp, ushort iTime + ) + { + _logger.Log(LogType.Warning, $"HoangDev : vDest : {vDest}\n speed {FloatToFix8(FloatToFix8(fSpeed))} \n useTime : {iTime}\n moveMode: {iMoveMode} \n stamp: {wStamp}"); + var cmd = new CMD_StopMove + { + vCurPos = vDest, + speed = FloatToFix8(fSpeed), + dir = byDir, + moveMode = iMoveMode, + stamp = wStamp, + useTime = iTime + }; + return SerializeCommand(CommandID.STOP_MOVE, cmd); + } + public static short FloatToFix8(float x) + { + return (short)(x * 256.0f + 0.5f); + } + public static Octets CreateSelectTarget(int targetId) + { + var cmd = new CMD_SelectTarget { id = targetId }; + return SerializeCommand(CommandID.SELECT_TARGET, cmd); + } + + public static Octets CreateDropIvtrItem(byte index, int amount) + { + var cmd = new CMD_DropIvtrItem + { + index = index, + amount = amount + }; + return SerializeCommand(CommandID.DROP_IVTR_ITEM, cmd); + } + public static Octets CreateDropEquipItem(byte index) + { + var cmd = new CMD_DropEquipItem + { + index = index + }; + return SerializeCommand(CommandID.DROP_EQUIP_ITEM, cmd); + } + + public static Octets CreatePickupItem(int idItem, int tid) + { + var cmd = new CMD_Pickup + { + idItem = idItem, + tid = tid + }; + return SerializeCommand(CommandID.PICKUP, cmd); + } + public static Octets CreateCheckSecurityPassWd(string password) + { + // Calculate password length (similar to C++ strlen) + uint passwdSize = 0; + if (!string.IsNullOrEmpty(password)) + { + passwdSize = (uint)password.Length; + } + + // Create the command structure + var cmd = new CMD_CheckSecurityPassWd { passwd_size = passwdSize }; + + // Serialize the command structure first + var octets = SerializeCommand(CommandID.CHECK_SECURITY_PASSWD, cmd); + + // Append the actual password data if present + if (passwdSize > 0) + { + var passwordBytes = System.Text.Encoding.UTF8.GetBytes(password); + octets.Insert(octets.Size, passwordBytes); + } + + return octets; + } + + public static Octets CreateEquipItem(byte iIvtrIdx, byte iEquipIdx) + { + var cmd = new CMD_EquipItem + { + idx_inv = iIvtrIdx, + idx_eq = iEquipIdx + }; + return SerializeCommand(CommandID.EQUIP_ITEM, cmd); + } + + public static Octets CreateGetInventoryDetail(byte byPackage) + { + var cmd = new CMD_GetInventoryDetail + { + byPackage = byPackage + }; + return SerializeCommand(CommandID.GET_IVTR_DETAIL, cmd); + } + public static Octets CreateOwnItemInfo + ( + byte byPackage, + byte bySlot, + int type, + int expire_date, + int state, + uint count, + ushort crc, + ushort content_length, + byte[] content + ) + { + var cmd = new CMD_OwnItemInfo + { + byPackage = byPackage, + bySlot = bySlot, + type = type, + expire_date = expire_date, + state = state, + count = count, + crc = crc, + content_length = content_length, + content = content + }; + return SerializeCommand(eCommandID.OWN_ITEM_INFO, cmd); + } + public static Octets CreateTaskDataCommand(uint active_list_size, byte[] active_list, uint finished_list_size, byte[] finished_list, uint finished_time_list_size, byte[] finished_time_list, uint finished_count_size, byte[] finished_count, uint storage_task_size, byte[] storage_task) + { + // Create the CMD_TaskData object and populate it with the provided parameters + var cmd = new CMD_TaskData + { + active_list_size = active_list_size, + active_list = active_list, + finished_list_size = finished_list_size, + finished_list = finished_list, + finished_time_list_size = finished_time_list_size, + finished_time_list = finished_time_list, + finished_count_size = finished_count_size, + finished_count = finished_count, + storage_task_size = storage_task_size, + storage_task = storage_task + }; + + // Serialize the command and return the serialized data + return SerializeCommand(eCommandID.TASK_DATA, cmd); + } + public static Octets CreateTaskVarDataCommand(uint size, byte[] data) + { + // Create the CMD_TaskVarData object and populate it with the provided parameters + var cmd = new CMD_TaskVarData + { + size = size, + data = data + }; + + // Serialize the command and return the serialized data + return SerializeCommand(eCommandID.TASK_VAR_DATA, cmd); + } + + public static Octets CreateGetAllDataCommand(bool byPack, bool byEquip, bool byTask) + { + var cmd = new CMD_GetAllData + { + byPack = Convert.ToByte(byPack), + byEquip = Convert.ToByte(byEquip), + byTask = Convert.ToByte(byTask) + }; + + // Serialize the command and return the serialized data + return SerializeCommand(CommandID.GET_ALL_DATA, cmd); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs.meta new file mode 100644 index 0000000000..87511fad5d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 028c8545e700b497296ae6d17c61beac \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/CSNetwork.csproj.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/CSNetwork.csproj.meta new file mode 100644 index 0000000000..333a9b1482 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/CSNetwork.csproj.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d0c06c588e2a6442488a3542551fb243 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common.meta new file mode 100644 index 0000000000..1a3c52952c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7009390df0e724fafa550ca88301cb61 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs new file mode 100644 index 0000000000..aa6b652bb7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace CSNetwork.Common +{ + internal class ExpTypes + { + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] + public struct MONSTER_ESSENCE + { + public uint id; + public uint id_type; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string name; // wchar_t[32] + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] + public string prop; // wchar_t[16] + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] + public string desc; // wchar_t[16] + + public uint faction; + public uint monster_faction; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string file_model; // wchar_t[128] + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string file_gfx_short; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string file_gfx_short_hit; + + public float size; + public float damage_delay; + + public uint id_strategy; + public uint role_in_war; + public uint character_combo_id; + public uint element_combo_id; + public uint exp; + public uint spirit; + public uint money; + public uint drop_probability; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public DropInfo[] drop_objects; + + public uint hp; + public uint mp; + public uint attack; + public uint defence; + public uint attack_speed; + public uint run_speed; + public uint range; + public uint view_range; + + public uint level; + public uint resist_metal; + public uint resist_wood; + public uint resist_water; + public uint resist_fire; + public uint resist_earth; + + public uint stunt; + public uint stunt_probability; + public uint stunt_delay; + + public uint combined_switch; + + public int hp_adjust_common_value; + public int defence_adjust_common_value; + public int attack_adjust_common_value; + + public float max_move_range; + public uint drop_for_no_profit_time; + + public int drop_mine_condition_flag; + public float drop_mine_probability; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public DropMine[] drop_mines; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] + public string label; // wchar_t[16] + + public uint domain_related; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public int[] local_var; + + // ---- Sub-structs ---- + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct DropInfo + { + public uint id; + public float probability; + public int num; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct DropMine + { + public uint id; + public float probability; + public int life; + } + } + + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs.meta new file mode 100644 index 0000000000..a5916c1b95 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Common/ExpTypes.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5d306357d71734b56aa0f851a31d456b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs new file mode 100644 index 0000000000..a7de0199cd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; + +namespace CSNetwork +{ + public class EC_ManMessage + { + // singleton + private static readonly IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(GameSession)); + private static EC_ManMessage _instance; + private static EC_ManMessage Instance + { + get + { + if (_instance == null) + { + _instance = new EC_ManMessage(); + } + return _instance; + } + } + + private Dictionary m_MsgHandlerList = new Dictionary(); + public Queue m_MsgList = new Queue(); + private IMsgHandler m_tempHandler; // so we don't have to allocate a new one every time + + private EC_ManMessage() {} + + /// Post a message to the message queue + public static void PostMessage(long dwMsg, int iManager, int iSubID, object p1=null, object p2=null, object p3=null, object p4=null, MsgDataBase[] pData=null) + { + ECMSG msg = new ECMSG + { + dwMsg = dwMsg, + iManager = iManager, + iSubID = iSubID, + dwParam1 = p1, + dwParam2 = p2, + dwParam3 = p3, + dwParam4 = p4, + pMsgData = pData + }; + AddMessage(msg); + } + + /// Add a message to the message queue + public static void AddMessage(ECMSG msg) + { + Instance.m_MsgList.Enqueue(msg); + } + + /// Register a message handler, it should be called before the game starts + public static void RegisterHandler(IMsgHandler handler) + { + Instance.m_MsgHandlerList.Add(handler.HandlerId, handler); + } + + /// Must use a Update function to call this function. It should be called in the Unity main thread + public static void Tick() + { + int i, count = Instance.m_MsgList.Count; + _logger.Info($"HoangDev : "+ Instance.m_MsgList.Count); + for (i = 0; i < count; i++) + { + ECMSG msg = Instance.m_MsgList.Dequeue(); + Instance.m_tempHandler = Instance.m_MsgHandlerList[msg.iManager]; + if (Instance.m_tempHandler != null) + { + Instance.m_tempHandler.ProcessMessage(msg); + } + } + } + + public static void Dispose() + { + _instance = null; + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs.meta new file mode 100644 index 0000000000..28cac02051 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b85016761c95c4e5b80bb57093a98d27 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs new file mode 100644 index 0000000000..70d66122ae --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs @@ -0,0 +1,13 @@ +namespace CSNetwork +{ + public sealed class MANAGER_INDEX + { + public static int MAN_PLAYER = 0; // Player manager + public static int MAN_NPC = 1; // NPC manager + public static int MAN_MATTER = 2; // Matter manager + public static int MAN_ORNAMENT = 3; // Ornament manager + public static int MAN_SKILLGFX = 4; // Skill Gfx Manager + public static int MAN_ATTACKS = 5; // Attack Manager + public static int MAN_DECAL = 6; // Decal manager + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs.meta new file mode 100644 index 0000000000..8a1183565e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_Manager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 87633064405114fb784b88dc38ecf2b9 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs new file mode 100644 index 0000000000..7260c565ca --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs @@ -0,0 +1,380 @@ +using System; + +namespace CSNetwork +{ + public sealed class EC_MsgDef + { + // Messages to gamerun + public static int MSG_EXITGAME = 100; // Exit game. p1 - exit code, + public static int MSG_CLOSEALLDIALOG = 101; // Close all dialogs + public static int MSG_SERVERTIME = 102; // Server time + public static int MSG_INSTCHECKOUT = 103; // Instance data checkout + public static int MSG_DOUBLETIME = 104; // Double time + public static int MSG_COMMONDATA = 105; // Common data + public static int MSG_MALLITEMINFO = 106; // Mall item info + public static int MSG_DIVIDENDMALLITEMINFO = 107; // Dividend mall item info + public static int MSG_PUBLICQUESTINFO = 108; // Public Quest task info + public static int MSG_WORLDLIFETIME = 109; // World life time info + public static int MSG_ENTERAUTOHOME = 110; // Enter autohome + public static int MSG_LEAVEAUTOHOME = 111; // Leave authhome + public static int MSG_CALCNETWORKDELAY = 112; // Network delay + public static int MSG_PLAYERSPECITEMLIST = 113; // Player spec items + public static int MSG_PARALLEL_WORLD_INFO = 114; // Sharding and load information + public static int MSG_UNIQUE_DATA = 115; // Historical progression data + public static int MSG_RANDOM_MAP_ORDER = 116; + + // Messages to host player + public static int MSG_GST_MOVE = 200; // Ghost move. p1 - move dir (0 - 7) + public static int MSG_GST_PITCH = 201; // Ghost pitch, p1 - degree + public static int MSG_GST_YAW = 202; // Ghost yaw, p1 - degree + public static int MSG_GST_MOVEABSUP = 203; // Ghost move absolute up, p1 - 1: up, 0: down + + public static int MSG_HST_CAMERAMODE = 220; // Host camera mode. p1 - camera mode + public static int MSG_HST_PUSHMOVE = 221; // Host player is pushed to move, p1 - move dir (0 - 7) + public static int MSG_HST_PITCH = 222; // Host camera pitch, p1 - degree; p2 - turn player flag + public static int MSG_HST_YAW = 223; // Host camera yaw, p1 - degree; p2 - turn player flag + public static int MSG_HST_LBTNCLICK = 224; // Left button click, p1 - x; p2 - y; p3 - SHIFT, ALT, CTRL key states; p4 - double click flag + public static int MSG_HST_TURNCAM = 225; // Begin or end turning host's camera, p1 - 1: begin, 0: end. p2 - 1: left button, 0: right button + public static int MSG_HST_WHEELCAM = 226; // Move camera using mouse's wheel button + public static int MSG_HST_CAMDEFAULT = 227; // Retrieve system default camera state + public static int MSG_HST_CAMPRESET = 228; // Retrieve system pre-defined camera state + public static int MSG_HST_CAMUSERGET = 229; // Retrieve user defined camera state, p1 - channel + public static int MSG_HST_CAMUSERSET = 230; // Store user defined camera state, p1 - channel + public static int MSG_HST_QUICKVIEW = 231; // Call camera monitor state quickly + public static int MSG_HST_ATKRESULT = 232; // Host attack result + public static int MSG_HST_ATTACKED = 233; // Host was attacked, p1 - data address + public static int MSG_HST_DIED = 234; // Host died + public static int MSG_HST_ASKREVIVE = 235; // Ask revive + public static int MSG_HST_PICKUPMONEY = 236; // Host pickup money + public static int MSG_HST_PICKUPITEM = 237; // Host pickup item + public static int MSG_HST_FOLLOW = 238; // Host follow some else + public static int MSG_HST_RECEIVEEXP = 239; // Received experience, p1 - data address + public static int MSG_HST_INFO00 = 240; // Host information 00, p1 - data address + public static int MSG_HST_GOTO = 241; // Host go to a position, p1 - data address + public static int MSG_HST_OWNITEMINFO = 242; // Host item information, p1 - data address + public static int MSG_HST_GAINITEM = 243; // Gain item in or after trade + public static int MSG_HST_SELTARGET = 244; // Select / unselect target, p1 - data address; p2 - command ID + public static int MSG_HST_FIXCAMERA = 245; // Fix camera + public static int MSG_HST_OWNEXTPROP = 246; // Host extend properties + public static int MSG_HST_ADDSTATUSPT = 247; // Add status point + public static int MSG_HST_RBTNCLICK = 248; // Left button click, p1 - x; p2 - y; p2 - y; p3 - SHIFT, ALT, CTRL key states + public static int MSG_HST_JOINTEAM = 249; // Host join team + public static int MSG_HST_LEAVETEAM = 250; // Host leave team + public static int MSG_HST_NEWTEAMMEM = 251; // New team member joined + public static int MSG_HST_ITEMOPERATION = 252; // Inventory and equipment item operations + public static int MSG_HST_TEAMINVITE = 253; // Host is invited by a team + public static int MSG_HST_TEAMREJECT = 254; // Host's join requirment is rejected by a team + public static int MSG_HST_TEAMMEMPOS = 255; // Notify host team member position + public static int MSG_HST_TEAMMEMPICKUP = 256; // Host team member pickup item + public static int MSG_HST_EQUIPDAMAGED = 257; // Host equipment damaged + public static int MSG_HST_NPCGREETING = 258; // NPC say greeting to host + public static int MSG_HST_TRADESTART = 259; // Trade with player start + public static int MSG_HST_TRADEREQUEST = 260; // Other player's trade request + public static int MSG_HST_TRADEMOVEITEM = 261; // Move item when trading with other player + public static int MSG_HST_TRADECANCEL = 262; // Host cancel trading with other player + public static int MSG_HST_TRADESUBMIT = 263; // Host submit trading + public static int MSG_HST_TARDECONFIRM = 264; // Host confirm trading + public static int MSG_HST_TRADEEND = 265; // Trade end + public static int MSG_HST_TRADEADDGOODS = 266; // Add goods to trade bar + public static int MSG_HST_TRADEREMGOODS = 267; // Remove goods from trade bar + public static int MSG_HST_IVTRINFO = 268; // Host inventory information + public static int MSG_HST_STARTATTACK = 269; // Host start attack + public static int MSG_HST_PURCHASEITEMS = 270; // Host buy items form NPC or player + public static int MSG_HST_SPENDMONEY = 271; // Host spend money + public static int MSG_HST_ITEMTOMONEY = 272; // Host sell items to NPC + public static int MSG_HST_REPAIR = 273; // Repair items + public static int MSG_HST_USEITEM = 274; // Host use item + public static int MSG_HST_SKILLDATA = 275; // Host skill data + public static int MSG_HST_EMBEDITEM = 276; // Embed item + public static int MSG_HST_CLEARTESSERA = 277; // Clear tessera + public static int MSG_HST_COSTSKILLPT = 278; // Cost skill point + public static int MSG_HST_LEARNSKILL = 279; // Learn skill + public static int MSG_HST_FLYSWORDTIME = 280; // Notify fly sword time + public static int MSG_HST_PRODUCEITEM = 281; // Host produce item + public static int MSG_HST_BREAKITEM = 282; // Host break item + public static int MSG_HST_TASKDATA = 283; // Task data + public static int MSG_HST_TARGETISFAR = 284; // Attack target is too far + public static int MSG_HST_PRESSCANCEL = 285; // User press cancel button + public static int MSG_HST_CANCELACTION = 286; // Cancel host current action + public static int MSG_HST_ROOTNOTIFY = 287; // Dispel root + public static int MSG_HST_STOPATTACK = 288; // Host stop attack + public static int MSG_HST_JUMP = 289; // Test code. jump + public static int MSG_HST_HURTRESULT = 290; // Hurt result + public static int MSG_HST_ATTACKONCE = 291; // Attack once notify + public static int MSG_HST_TRASHBOXOP = 292; // Trash box operation + public static int MSG_HST_PLAYTRICK = 293; // Play trick action + public static int MSG_HST_SKILLRESULT = 294; // Host skill attack result + public static int MSG_HST_SKILLATTACKED = 295; // Host skill attacked + public static int MSG_HST_ASKTOJOINTEAM = 296; // Some ask to join team + public static int MSG_HST_FACTION = 297; // Faction messages + public static int MSG_HST_TASKDELIVER = 298; // Task deliver + public static int MSG_HST_REPUTATION = 299; // Reputation update + public static int MSG_HST_ITEMIDENTIFY = 300; // Item identify + public static int MSG_HST_SANCTUARY = 301; // Sanctuary + public static int MSG_HST_CORRECTPOS = 302; // Correct host position + public static int MSG_HST_FRIENDOPT = 303; // Friend operation + public static int MSG_HST_TEAMINVITETO = 304; // Team invite timeout + public static int MSG_HST_WAYPOINT = 305; // Way point + public static int MSG_HST_BREATHDATA = 306; // Breath data + public static int MSG_HST_SKILLABILITY = 307; // Skill ability + public static int MSG_HST_COOLTIMEDATA = 308; // Cool time data + public static int MSG_HST_REVIVALINQUIRE = 309; // Revival inquire + public static int MSG_HST_SETCOOLTIME = 310; // Set cool time + public static int MSG_HST_CHGTEAMLEADER = 311; // Change team leader + public static int MSG_HST_EXITINSTANCE = 312; // Exit instance notify + public static int MSG_HST_CHANGEFACE = 313; // Host change face + public static int MSG_HST_TEAMMEMBERDATA = 314; // Team member data + public static int MSG_HST_SETMOVESTAMP = 315; // Set move stamp + public static int MSG_HST_CHATROOMOPT = 316; // Chatroom messages + public static int MSG_HST_MAILOPT = 317; // Mail messages + public static int MSG_HST_VENDUEOPT = 318; // Vendue messages + public static int MSG_HST_VIEWOTHEREQUIP = 319; // Get player's equipments + public static int MSG_HST_PARIAHTIME = 320; // Update pariah time + public static int MSG_HST_PETOPT = 321; // Pet operation + public static int MSG_HST_BATTLEOPT = 322; // Battle operation + public static int MSG_HST_ACCOUNTPOINT = 323; // Account point operation + public static int MSG_HST_GMOPT = 324; // GM operation + public static int MSG_HST_REFINEOPT = 325; // Refine operation + public static int MSG_HST_ITEMBOUND = 326; // Item bound result + public static int MSG_HST_USEITEMWITHDATA = 327; // Host use item with data + public static int MSG_HST_SAFELOCK = 328; // Safe lock operation + public static int MSG_HST_GOBLININFO = 329; // Goblin information + public static int MSG_HST_AUTOMOVE = 330; // Player auto move + public static int MSG_HST_BUY_SELL_FAIL = 331; // Player buy or sell failed + public static int MSG_HST_PLAYERPROPERTY = 332; // Player property + public static int MSG_HST_PASSWDCHECKED = 333; // Player's password has checked + public static int MSG_HST_HPSTEAL = 334; // Player steal hp + public static int MSG_HST_MULTI_EXP_INFO = 335; // Player multi exp info + public static int MSG_HST_MULTI_EXP_STATE = 336; // Player change multi exp state + public static int MSG_HST_WEBTRADELIST = 337; // Web trade list re + public static int MSG_HST_WEBTRADEATTENDLIST = 338; // Web trade attend list re + public static int MSG_HST_WEBTRADEGETITEM = 339; // Web trade get item re + public static int MSG_HST_WEBTRADEGETDETAIL = 340; // Web trade get item detail re + public static int MSG_HST_WEBTRADEPREPOST = 341; // Web trade pre-post re + public static int MSG_HST_WEBTRADEPRECANCELPOST = 342; // Web trade cancel post re + public static int MSG_HST_WEBTRADEUPDATE = 343; // Web trade update re + public static int MSG_HST_SYSAUCTIONACCOUNT = 344; // Sys Auction Account re + public static int MSG_HST_SYSAUCTIONBID = 345; // Sys Auction Bid re + public static int MSG_HST_SYSAUCTIONCASHTRANSFER = 346; // Sys Auction Cash Transfer re + public static int MSG_HST_SYSAUCTIONGETITEM = 347; // Sys Auction Get Item re + public static int MSG_HST_SYSAUCTIONLIST = 348; // Sys Auction List re + public static int MSG_HST_ONLINEAWARD = 349; // Online award + // Continue later; do not add more here + + // Messages to player manager + public static int MSG_PM_PLAYERINFO = 350; // Player information, p1 - data address; p2 - command ID + public static int MSG_PM_PLAYERMOVE = 351; // Player move, p1 - data address + public static int MSG_PM_PLAYERRUNOUT = 352; // Player run out of view area, p1 - data address + public static int MSG_PM_PLAYEREXIT = 353; // Player exit game, p1 - data address + public static int MSG_PM_CHANGENAMECOLOR = 354; // Change player's name color + public static int MSG_PM_PLAYERROOT = 355; // Player is root + public static int MSG_PM_PLAYERDIED = 356; // Player was killed, p1 - data address + public static int MSG_PM_PLAYERREVIVE = 357; // Player revive, p1 - data address + public static int MSG_PM_PLAYEROUTOFVIEW = 358; // Player is out of view, p1 - player's ID + public static int MSG_PM_PLAYERDISAPPEAR = 359; // Player disappear, p1 - data address + public static int MSG_PM_PLAYERSTOPMOVE = 360; // Player stop move, p1 - data address + public static int MSG_PM_PLAYERLEVELUP = 361; // Player level up + public static int MSG_PM_PLAYEREXTPROP = 362; // Player extend properties + // #define MSG_PM_TEAMMEMBERDATA 363 // Team member data + public static int MSG_PM_LEAVETEAM = 364; // Player leave team + public static int MSG_PM_PLAYEREQUIPDATA = 365; // Player equipment data + public static int MSG_PM_CASTSKILL = 366; // Player cast skill + public static int MSG_PM_PLAYERBASEINFO = 367; // Player custom data + public static int MSG_PM_PLAYERFLY = 368; // Player take off or land on + public static int MSG_PM_PLAYERSITDOWN = 369; // Player sit down / stand up + public static int MSG_PM_PLAYERATKRESULT = 370; // Player attack result + public static int MSG_PM_PLAYEREXTSTATE = 371; // Player extend states changed + public static int MSG_PM_PLAYERDOEMOTE = 372; // Player do emotion + public static int MSG_PM_PLAYERUSEITEM = 373; // Player use item + public static int MSG_PM_PLAYERCUSTOM = 374; // Player custom data + public static int MSG_PM_ENCHANTRESULT = 375; // Enchant result + public static int MSG_PM_PLAYERDOACTION = 376; // Player do action + public static int MSG_PM_PLAYERSKILLRESULT = 377; // Player skill attack result + public static int MSG_PM_PLAYERADVDATA = 378; // Player advertisement data + public static int MSG_PM_PLAYERINTEAM = 379; // Player in team notify + public static int MSG_PM_PICKUPMATTER = 380; // Player pickup a matter + public static int MSG_PM_PLAYERGATHER = 381; // Player gather mine + public static int MSG_PM_DOCONEMOTE = 382; // Player do concurrent emotion + public static int MSG_PM_PLAYERCHGSHAPE = 383; // Player change shape + public static int MSG_PM_BOOTHOPT = 384; // Booth operation + public static int MSG_PM_PLAYERTRAVEL = 385; // Player travel service + public static int MSG_PM_PLAYERPVP = 386; // Player PVP messages + public static int MSG_PM_FASHIONENABLE = 387; // Player enable/disable fashion + public static int MSG_PM_INVALIDOBJECT = 388; // Object is invalid + public static int MSG_PM_PLAYEREFFECT = 389; // Player effect association + public static int MSG_PM_CHANGEFACE = 390; // Player change face + public static int MSG_PM_DUELOPT = 391; // Duel operation + public static int MSG_PM_PLAYERBINDOPT = 392; // Player bind operation + public static int MSG_PM_PLAYERBINDSTART = 393; // Player bind start + public static int MSG_PM_PLAYERMOUNT = 394; // Player mount state + public static int MSG_PM_PLAYERDUELOPT = 395; // Player duel operation + public static int MSG_PM_PLAYERDUELRLT = 396; // Player duel result + public static int MSG_PM_PLAYERLEVEL2 = 397; // Player level2 notify + public static int MSG_PM_TANKLEADER = 398; // Tank leader notify + public static int MSG_PM_USEITEMWITHDATA = 399; + public static int MSG_PM_PLAYERCHANGESPOUSE = 400; // Player change the spouse + public static int MSG_PM_GOBLINOPT = 401; // Goblin operation: Cast skill, change refine active... + public static int MSG_PM_GOBLINLEVELUP = 402; // Goblin level up + public static int MSG_PM_PLAYERINVISIBLE = 403; // Player invisible + public static int MSG_PM_PLAYERKNOCKBACK = 404; // Player knock back + public static int MSG_PM_PLAYEREQUIPDISABLED = 405; // Player equipment disabled + public static int MSG_PM_CONGREGATE = 406; // Congregate related + public static int MSG_PM_TELEPORT = 407; // teleport + public static int MSG_PM_FORBIDBESELECTED = 408; // forbid to be selected + public static int MSG_PM_FORCE_CHANGED = 409; // a player changed his force + public static int MSG_PM_MULTIOBJ_EFFECT = 410; // player's multi object effect + public static int MSG_PM_COUNTRY_CHANGED = 411; + public static int MSG_PM_KINGCHANGED = 412; + public static int MSG_PM_TITLE = 413; // player's titles + public static int MSG_PM_REINCARNATION = 414; + public static int MSG_PM_REALMLEVEL = 415; + public static int MSG_PM_PLAYER_IN_OUT_BATTLE = 416; + public static int MSG_PM_FACTION_PVP_MASK_MODIFY = 417; + + // Messages to NPC manager + public static int MSG_NM_NPCINFO = 400; // NPC information, p1 - protocol object address + public static int MSG_NM_NPCMOVE = 401; // NPC move, p1 - data address + public static int MSG_NM_NPCRUNOUT = 402; // NPC run out of view area, p1 - data address + public static int MSG_NM_NPCDIED = 403; // NPC died, p1 - data address + public static int MSG_NM_NPCDISAPPEAR = 404; // NPC disappear, p1 - data address + public static int MSG_NM_NPCCASTSKILL = 405; // NPC cast skill + public static int MSG_NM_NPCROOT = 406; // NPC is root + public static int MSG_NM_NPCOUTOFVIEW = 407; // NPC is out of view, p1 - NPC's ID + public static int MSG_NM_NPCSTOPMOVE = 408; // NPC stop moving, p1 - data address + public static int MSG_NM_NPCATKRESULT = 409; // NPC attack result + public static int MSG_NM_NPCEXTSTATE = 410; // NPC extend states changed + public static int MSG_NM_ENCHANTRESULT = 411; // Enchant result + public static int MSG_NM_NPCSKILLRESULT = 412; // NPC skill attack result + public static int MSG_NM_INVALIDOBJECT = 413; // Object is invalid + public static int MSG_NM_NPCLEVELUP = 414; // NPC level up + public static int MSG_NM_NPCINVISIBLE = 415; // NPC invisible + public static int MSG_NM_NPCSTARTPLAYACTION = 416; // NPC play policy action + public static int MSG_NM_NPCSTOPPLAYACTION = 417; // NPC stop play policy action + public static int MSG_NM_FORBIDBESELECTED = 418; // forbid to be selected + public static int MSG_NM_MULTIOBJECT_EFFECT = 419; // NPC's multi object effect + + // Messages to matter manager + public static int MSG_MM_MATTERINFO = 500; // Matter information, p1 - data address + public static int MSG_MM_MATTERDISAPPEAR = 501; // Matter disappear, p1 - data address + public static int MSG_MM_MATTERENTWORLD = 502; // Matter enter world, p1 - data address + public static int MSG_MM_MATTEROUTOFVIEW = 503; // Matter is out of view, p1 - data address + public static int MSG_MM_INVALIDOBJECT = 504; // Object is invalid + + // Messages to host player cont. + public static int MSG_HST_WEDDINGBOOKLIST = 600; // wedding book list + public static int MSG_HST_WEDDINGBOOKSUCCESS = 601; // wedding book success notify + public static int MSG_HST_FACTIONCONTRIB = 602; // faction contrib + public static int MSG_HST_FACTIONFORTRESSINFO = 603; // faction fortress info + public static int MSG_HST_ENTERFACTIONFORTRESS = 604; // enter faction fortress + public static int MSG_HST_ENGRAVEITEM = 605; // engrave item + public static int MSG_HST_DPS_DPH_RANK = 606; // current dps dph rank + public static int MSG_HST_ADDONREGEN = 607; // regenerate item addon + public static int MSG_HST_INVISIBLEOBJLIST = 608; // invisible object list notify + public static int MSG_HST_SETPLAYERLIMIT = 609; // set player limit + public static int MSG_HST_FORCE_DATA = 610; // Player force data (get or changed) + public static int MSG_HST_INVENTORY_DETAIL = 611; // Get other player's inventory detail info + public static int MSG_HST_ADD_MULTIOBJECT_EFFECT = 612; // Add multi object effect + public static int MSG_HST_WEDDINGSCENE_INFO = 613; // whose wedding scene the player is entering + public static int MSG_HST_PROFITTIME = 614; // change the player's profit level + public static int MSG_HST_PVPNOPENALTY = 615; // PVP no penalty + public static int MSG_HST_COUNTRY_NOTIFY = 616; + public static int MSG_HST_ENTER_COUNTRYBATTLE = 617; + public static int MSG_HST_COUNTRYBATTLE_RESULT = 618; + public static int MSG_HST_COUNTRYBATTLE_SCORE = 619; + public static int MSG_HST_COUNTRYBATTLE_REVIVE_TIMES = 620; + public static int MSG_HST_COUNTRYBATTLE_CARRIER_NOTIFY = 621; + public static int MSG_HST_COUNTRYBATTLE_BECOME_CARRIER = 622; + public static int MSG_HST_COUNTRYBATTLE_PERSONAL_SCORE = 623; + public static int MSG_HST_COUNTRYBATTLE_FLAG_MSG_NOTIFY = 624; + public static int MSG_HST_DEFENSE_RUNE_ENABLE = 625; + public static int MSG_HST_COUNTRYBATTLE_INFO = 626; + public static int MSG_HST_CASHMONEYRATE = 627; + public static int MSG_HST_STONECHANGEEND = 628; + public static int MSG_HST_KINGNOTIFY = 629; + public static int MSG_HST_MERIDIANS_NOTIFY = 630; + public static int MSG_HST_MERIDIANS_RESULT = 631; + public static int MSG_HST_COUNTRYBATTLE_STRONGHOLD_STATE = 632; + public static int MSG_HST_TOUCHPOINT = 633; // Touch related + public static int MSG_HST_TITLE = 644; // Title related + public static int MSG_HST_SIGNIN = 645; + public static int MSG_HST_REINCARNATION_TOME_INFO = 646; + public static int MSG_HST_REINCARNATION_TOME_ACTIVATE = 647; + public static int MSG_HST_USE_GIFTCARD = 648; // Use gift card + public static int MSG_HST_REALM_EXP = 649; + public static int MSG_HST_TRICKBATTLE = 650; + public static int MSG_HST_CONTINUECOMBOSKILL = 651; + public static int MSG_HST_GENERALCARD = 652; + public static int MSG_HST_MONSTERSPIRIT_LEVEL = 653; + public static int MSG_HST_COUNTRYBATTLE_LIVESHOW = 654; + public static int MSG_HST_RAND_MALL_SHOPPING_RES = 655; + public static int MSG_HST_WORLD_CONTRIBUTION = 656; + public static int MSG_HST_CANINHERIT_ADDONS = 657; + public static int MSG_HST_CLIENT_SCREENEFFECT = 658; + public static int MSG_HST_COMBO_SKILL_PREPARE = 659; + public static int MSG_HST_INSTANCE_REENTER_NOTIFY = 660; + public static int MSG_HST_PRAY_DISTANCE_CHANGE = 661; + + } + + public struct ECMSG + { + public long dwMsg; // Message code + public int iManager; // Receiver manager's ID + public int iSubID; // Sub ID + public object dwParam1; // Parameter 1 + public object dwParam2; // Parameter 2 + public object dwParam3; // Parameter 3 + public object dwParam4; // Parameter 4 + public MsgDataBase[] pMsgData; + + } + + public enum DataType + { + MSG_DATABASE = 0, + MSG_TARGETPOS, + MSG_TARGETNPC, + } + + public class MsgDataBase + { + public int m_imsgType; + + public MsgDataBase() {} + public MsgDataBase(int type) + { + m_imsgType = type; + } + } + + public class MsgDataAutoMove : MsgDataBase + { + public int m_iNPCId; + public int m_iTaskId; + + public MsgDataAutoMove(int type, int id, int taskid) : base(type) + { + m_iNPCId = id; + m_iTaskId = taskid; + } + + // TODO: might need to implement this + // virtual MsgDataBase* Clone() { return new MsgDataAutoMove(*this); } + + public int GetTargetID() + { + return m_iNPCId; + } + + public int GetTaskID() + { + return m_iTaskId; + } + } + + public interface IMsgHandler + { + int HandlerId { get; } + bool ProcessMessage(ECMSG Msg); + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs.meta new file mode 100644 index 0000000000..1bf4d7178f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fbc9be35124064cef8fde9e5f637a9bf \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs new file mode 100644 index 0000000000..31180090b6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs @@ -0,0 +1,326 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Timers; + +public static class EventBus +{ + // Cho phép null ở value để có thể "clear" slot + private static readonly Dictionary globalListeners = + new Dictionary(); + + private static readonly Dictionary globalClassListeners = + new Dictionary(); + + private static readonly Dictionary> channelListeners = + new Dictionary>(); + + private static readonly Dictionary> channelClassListeners = + new Dictionary>(); + + // Cho phép null khi chưa bật auto-cleanup + private static Timer? cleanupTimer; + + public static bool DebugEnabled = false; + + private static void DebugLog(string message) + { + if (DebugEnabled) + Console.WriteLine($"[EventBus] {message}"); + } + + // ===== GLOBAL STRUCT EVENTS ===== + public static void Subscribe(Action listener) where T : struct + { + var type = typeof(T); + if (!globalListeners.ContainsKey(type)) + globalListeners[type] = null; + + var current = globalListeners[type] as Action; + current += listener; + globalListeners[type] = current; + } + + public static void Unsubscribe(Action listener) where T : struct + { + var type = typeof(T); + if (!globalListeners.ContainsKey(type)) + return; + + var current = globalListeners[type] as Action; + current -= listener; + if (current == null) + globalListeners.Remove(type); + else + globalListeners[type] = current; + } + + public static void Publish(T eventData) where T : struct + { + var type = typeof(T); + if (globalListeners.TryGetValue(type, out var del)) + { + var action = del as Action; + if (action != null) + { + DebugLog($"Publish Global Struct Event: {type.Name}"); + action(eventData); + } + } + } + + // ===== GLOBAL CLASS EVENTS ===== + public static void SubscribeClass(Action listener) where T : class + { + var type = typeof(T); + if (!globalClassListeners.ContainsKey(type)) + globalClassListeners[type] = null; + + var current = globalClassListeners[type] as Action; + current += listener; + globalClassListeners[type] = current; + } + + public static void UnsubscribeClass(Action listener) where T : class + { + var type = typeof(T); + if (!globalClassListeners.ContainsKey(type)) + return; + + var current = globalClassListeners[type] as Action; + current -= listener; + if (current == null) + globalClassListeners.Remove(type); + else + globalClassListeners[type] = current; + } + + public static void PublishClass(T eventData) where T : class + { + var type = typeof(T); + if (globalClassListeners.TryGetValue(type, out var del)) + { + var action = del as Action; + if (action != null) + { + DebugLog($"Publish Global Class Event: {type.Name}"); + action(eventData); + } + } + } + + // ===== CHANNEL STRUCT EVENTS ===== + public static void SubscribeChannel(int channelId, Action listener) where T : struct + { + var type = typeof(T); + + if (!channelListeners.ContainsKey(channelId)) + channelListeners[channelId] = new Dictionary(); + + if (!channelListeners[channelId].ContainsKey(type)) + channelListeners[channelId][type] = null; + + var current = channelListeners[channelId][type] as Action; + current += listener; + channelListeners[channelId][type] = current; + } + + public static void UnsubscribeChannel(int channelId, Action listener) where T : struct + { + var type = typeof(T); + if (!channelListeners.ContainsKey(channelId) || + !channelListeners[channelId].ContainsKey(type)) + return; + + var current = channelListeners[channelId][type] as Action; + current -= listener; + + if (current == null) + { + channelListeners[channelId].Remove(type); + if (channelListeners[channelId].Count == 0) + channelListeners.Remove(channelId); + } + else + { + channelListeners[channelId][type] = current; + } + } + + public static void PublishChannel(int channelId, T eventData) where T : struct + { + var type = typeof(T); + if (channelListeners.TryGetValue(channelId, out var dict)) + { + Delegate? del; + if (dict.TryGetValue(type, out del)) + { + var action = del as Action; + if (action != null) + { + DebugLog($"Publish Channel Struct Event: {type.Name} to channel '{channelId}'"); + action(eventData); + } + } + } + } + + // ===== CHANNEL CLASS EVENTS ===== + public static void SubscribeChannelClass(int channelId, Action listener) where T : class + { + var type = typeof(T); + + if (!channelClassListeners.ContainsKey(channelId)) + channelClassListeners[channelId] = new Dictionary(); + + if (!channelClassListeners[channelId].ContainsKey(type)) + channelClassListeners[channelId][type] = null; + + var current = channelClassListeners[channelId][type] as Action; + current += listener; + channelClassListeners[channelId][type] = current; + } + + public static void UnsubscribeChannelClass(int channelId, Action listener) where T : class + { + var type = typeof(T); + if (!channelClassListeners.ContainsKey(channelId) || + !channelClassListeners[channelId].ContainsKey(type)) + return; + + var current = channelClassListeners[channelId][type] as Action; + current -= listener; + + if (current == null) + { + channelClassListeners[channelId].Remove(type); + if (channelClassListeners[channelId].Count == 0) + channelClassListeners.Remove(channelId); + } + else + { + channelClassListeners[channelId][type] = current; + } + } + + public static void PublishChannelClass(int channelId, T eventData) where T : class + { + var type = typeof(T); + if (channelClassListeners.TryGetValue(channelId, out var dict)) + { + Delegate? del; + if (dict.TryGetValue(type, out del)) + { + var action = del as Action; + if (action != null) + { + DebugLog($"Publish Channel Class Event: {type.Name} to channel '{channelId}'"); + action(eventData); + } + } + } + } + + // ===== ONE-TIME SUBSCRIBE ===== + public static void SubscribeOnce(Action listener) where T : struct + { + Action? wrapper = null; + wrapper = data => + { + listener(data); + Unsubscribe(wrapper); + }; + Subscribe(wrapper); + } + + public static void SubscribeOnceClass(Action listener) where T : class + { + Action? wrapper = null; + wrapper = data => + { + listener(data); + UnsubscribeClass(wrapper); + }; + SubscribeClass(wrapper); + } + + public static void SubscribeOnceChannel(int channelId, Action listener) where T : struct + { + Action? wrapper = null; + wrapper = data => + { + listener(data); + UnsubscribeChannel(channelId, wrapper); + }; + SubscribeChannel(channelId, wrapper); + } + + public static void SubscribeOnceChannelClass(int channelId, Action listener) where T : class + { + Action? wrapper = null; + wrapper = data => + { + listener(data); + UnsubscribeChannelClass(channelId, wrapper); + }; + SubscribeChannelClass(channelId, wrapper); + } + + // ===== CHANNEL UTILITIES ===== + public static bool ChannelExists(int channelId) + { + return channelListeners.ContainsKey(channelId) || channelClassListeners.ContainsKey(channelId); + } + + public static void EnableAutoCleanup(float delaySeconds = 5f) + { + cleanupTimer = new Timer(delaySeconds * 1000); + cleanupTimer.Elapsed += (sender, e) => + { + var emptyStructChannels = channelListeners + .Where(pair => pair.Value.Values.All(d => d == null)) + .Select(pair => pair.Key) + .ToList(); + foreach (var id in emptyStructChannels) + { + channelListeners.Remove(id); + DebugLog($"Removed empty struct channel: {id}"); + } + + var emptyClassChannels = channelClassListeners + .Where(pair => pair.Value.Values.All(d => d == null)) + .Select(pair => pair.Key) + .ToList(); + foreach (var id in emptyClassChannels) + { + channelClassListeners.Remove(id); + DebugLog($"Removed empty class channel: {id}"); + } + }; + cleanupTimer.AutoReset = true; + cleanupTimer.Start(); + } + public static void UnsubscribeAllChannels() + { + channelListeners.Clear(); + channelClassListeners.Clear(); + DebugLog("Unsubscribed all events from all channels"); + } + public static void UnsubscribeAllInChannel(int channelId) + { + if (channelListeners.ContainsKey(channelId)) + { + channelListeners[channelId].Clear(); + channelListeners.Remove(channelId); + DebugLog($"Unsubscribed all struct events in channel {channelId}"); + } + + if (channelClassListeners.ContainsKey(channelId)) + { + channelClassListeners[channelId].Clear(); + channelClassListeners.Remove(channelId); + DebugLog($"Unsubscribed all class events in channel {channelId}"); + } + } + +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs.meta new file mode 100644 index 0000000000..6985f7755e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EventBus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 51ef736cb143545fc868769bb41d309e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs new file mode 100644 index 0000000000..2d8f7303d7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs @@ -0,0 +1,1220 @@ +using System; +using System.Buffers.Binary; +using System.Collections.Generic; +using System.Numerics; +using System.Runtime.InteropServices; +using System.Text; + +namespace CSNetwork.GPDataType +{ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_header + { + public ushort cmd; + }; + + [Flags] + public enum GPMoveMode + { + GP_MOVE_WALK = 0, + GP_MOVE_RUN = 1, + GP_MOVE_STAND = 2, + GP_MOVE_FALL = 3, + GP_MOVE_SLIDE = 4, + GP_MOVE_PUSH = 5, // only sent to NPC + GP_MOVE_FLYFALL = 6, + GP_MOVE_RETURN = 7, + GP_MOVE_JUMP = 8, + GP_MOVE_PULL = 9, // only sent to NPC + GP_MOVE_BLINK = 10, // only sent to NPC£¨Ë²ÒÆ£© + GP_MOVE_MASK = 0x0f, + + GP_MOVE_TURN = 0x10, // Turnaround + GP_MOVE_DEAD = 0x20, + + GP_MOVE_AIR = 0x40, + GP_MOVE_WATER = 0x80, + GP_MOVE_ENVMASK = 0xc0, + }; + + public static class CommandID // Command ID + { + public const int PROTOCOL_COMMAND = -1; // Reserved for protocol + + public const int PLAYER_INFO_1 = 0; + public const int PLAYER_INFO_2 = 1; + public const int PLAYER_INFO_3 = 2; + public const int PLAYER_INFO_4 = 3; + public const int PLAYER_INFO_1_LIST = 4; + + public const int PLAYER_INFO_2_LIST = 5; + public const int PLAYER_INFO_3_LIST = 6; + public const int PLAYER_INFO_23_LIST = 7; + public const int SELF_INFO_1 = 8; + public const int NPC_INFO_LIST = 9; + + public const int MATTER_INFO_LIST = 10; + public const int NPC_ENTER_SLICE = 11; + public const int PLAYER_ENTER_SLICE = 12; + public const int OBJECT_LEAVE_SLICE = 13; + public const int NOTIFY_HOSTPOS = 14; + + public const int OBJECT_MOVE = 15; + public const int NPC_ENTER_WORLD = 16; + public const int PLAYER_ENTER_WORLD = 17; + public const int MATTER_ENTER_WORLD = 18; + public const int PLAYER_LEAVE_WORLD = 19; + + public const int NPC_DIED = 20; + public const int OBJECT_DISAPPEAR = 21; + public const int OBJECT_STARTATTACK = 22; + public const int HOST_STOPATTACK = 23; + public const int HOST_ATTACKRESULT = 24; + + public const int ERROR_MESSAGE = 25; + public const int HOST_ATTACKED = 26; + public const int PLAYER_DIED = 27; + public const int HOST_DIED = 28; + public const int PLAYER_REVIVE = 29; + + public const int PICKUP_MONEY = 30; + public const int PICKUP_ITEM = 31; + public const int PLAYER_INFO_00 = 32; + public const int NPC_INFO_00 = 33; + public const int OUT_OF_SIGHT_LIST = 34; + + public const int OBJECT_STOP_MOVE = 35; + public const int RECEIVE_EXP = 36; + public const int LEVEL_UP = 37; + public const int SELF_INFO_00 = 38; + public const int UNSELECT = 39; + + public const int OWN_ITEM_INFO = 40; + public const int EMPTY_ITEM_SLOT = 41; + public const int OWN_IVTR_DATA = 42; + public const int OWN_IVTR_DETAIL_DATA = 43; + public const int EXG_IVTR_ITEM = 44; + + public const int MOVE_IVTR_ITEM = 45; + public const int PLAYER_DROP_ITEM = 46; + public const int EXG_EQUIP_ITEM = 47; + public const int EQUIP_ITEM = 48; + public const int MOVE_EQUIP_ITEM = 49; + + public const int OWN_EXT_PROP = 50; + public const int ADD_STATUS_POINT = 51; + public const int SELECT_TARGET = 52; + public const int PLAYER_EXT_PROP_BASE = 53; + public const int PLAYER_EXT_PROP_MOVE = 54; + + public const int PLAYER_EXT_PROP_ATK = 55; + public const int PLAYER_EXT_PROP_DEF = 56; + public const int TEAM_LEADER_INVITE = 57; + public const int TEAM_REJECT_INVITE = 58; + public const int TEAM_JOIN_TEAM = 59; + + public const int TEAM_MEMBER_LEAVE = 60; + public const int TEAM_LEAVE_PARTY = 61; + public const int TEAM_NEW_MEMBER = 62; + public const int TEAM_LEADER_CACEL_PARTY = 63; + public const int TEAM_MEMBER_DATA = 64; + + public const int TEAM_MEMBER_POS = 65; + public const int EQUIP_DATA = 66; + public const int EQUIP_DATA_CHANGED = 67; + public const int EQUIP_DAMAGED = 68; + public const int TEAM_MEMBER_PICKUP = 69; + + public const int NPC_GREETING = 70; + public const int NPC_SERVICE_CONTENT = 71; + public const int PURCHASE_ITEM = 72; + public const int ITEM_TO_MONEY = 73; + public const int REPAIR_ALL = 74; + + public const int REPAIR = 75; + public const int RENEW = 76; + public const int SPEND_MONEY = 77; + public const int GAIN_MONEY_IN_TRADE = 78; + public const int GAIN_ITEM_IN_TRADE = 79; + + public const int GAIN_MONEY_AFTER_TRADE = 80; + public const int GAIN_ITEM_AFTER_TRADE = 81; + public const int GET_OWN_MONEY = 82; + public const int ATTACK_ONCE = 83; + public const int HOST_START_ATTACK = 84; + + public const int OBJECT_CAST_SKILL = 85; + public const int SKILL_INTERRUPTED = 86; + public const int SELF_SKILL_INTERRUPTED = 87; + public const int SKILL_PERFORM = 88; + public const int OBJECT_BE_ATTACKED = 89; + + public const int SKILL_DATA = 90; + public const int HOST_USE_ITEM = 91; + public const int EMBED_ITEM = 92; + public const int CLEAR_TESSERA = 93; + public const int COST_SKILL_POINT = 94; + + public const int LEARN_SKILL = 95; + public const int OBJECT_TAKEOFF = 96; + public const int OBJECT_LANDING = 97; + public const int FLYSWORD_TIME = 98; + public const int HOST_OBTAIN_ITEM = 99; + + public const int PRODUCE_START = 100; + public const int PRODUCE_ONCE = 101; + public const int PRODUCE_END = 102; + public const int DECOMPOSE_START = 103; + public const int DECOMPOSE_END = 104; + + public const int TASK_DATA = 105; + public const int TASK_VAR_DATA = 106; + public const int OBJECT_START_USE = 107; + public const int OBJECT_CANCEL_USE = 108; + public const int OBJECT_USE_ITEM = 109; + + public const int OBJECT_START_USE_T = 110; + public const int OBJECT_SIT_DOWN = 111; + public const int OBJECT_STAND_UP = 112; + public const int OBJECT_DO_EMOTE = 113; + public const int SERVER_TIME = 114; + + public const int OBJECT_ROOT = 115; + public const int HOST_DISPEL_ROOT = 116; + public const int INVADER_RISE = 117; + public const int PARIAH_RISE = 118; + public const int INVADER_FADE = 119; + + public const int OBJECT_ATTACK_RESULT = 120; + public const int BE_HURT = 121; + public const int HURT_RESULT = 122; + public const int HOST_STOP_SKILL = 123; + public const int UPDATE_EXT_STATE = 124; + + public const int ICON_STATE_NOTIFY = 125; + public const int PLAYER_GATHER_START = 126; + public const int PLAYER_GATHER_STOP = 127; + public const int TRASHBOX_PWD_CHANGED = 128; + public const int TRASHBOX_PWD_STATE = 129; + + public const int TRASHBOX_OPEN = 130; + public const int TRASHBOX_CLOSE = 131; + public const int TRASHBOX_WEALTH = 132; + public const int EXG_TRASHBOX_ITEM = 133; + public const int MOVE_TRASHBOX_ITEM = 134; + + public const int EXG_TRASHBOX_IVTR = 135; + public const int IVTR_ITEM_TO_TRASH = 136; + public const int TRASH_ITEM_TO_IVTR = 137; + public const int EXG_TRASH_MONEY = 138; + public const int ENCHANT_RESULT = 139; + public const int HOST_NOTIFY_ROOT = 140; + public const int OBJECT_DO_ACTION = 141; + public const int HOST_SKILL_ATTACK_RESULT = 142; + public const int OBJECT_SKILL_ATTACK_RESULT = 143; + public const int HOST_SKILL_ATTACKED = 144; + + public const int PLAYER_SET_ADV_DATA = 145; + public const int PLAYER_CLR_ADV_DATA = 146; + public const int PLAYER_IN_TEAM = 147; + public const int TEAM_ASK_TO_JOIN = 148; + public const int OBJECT_EMOTE_RESTORE = 149; + + public const int CON_EMOTE_REQUEST = 150; // concurrent emote request + public const int DO_CONCURRENT_EMOTE = 151; + public const int MATTER_PICKUP = 152; + public const int MAFIA_INFO_NOTIFY = 153; + public const int MAFIA_TRADE_START = 154; + + public const int MAFIA_TRADE_END = 155; + public const int TASK_DELIVER_ITEM = 156; + public const int TASK_DELIVER_REP = 157; + public const int TASK_DELIVER_EXP = 158; + public const int TASK_DELIVER_MONEY = 159; + + public const int TASK_DELIVER_LEVEL2 = 160; + public const int HOST_REPUTATION = 161; + public const int ITEM_IDENTIFY = 162; + public const int PLAYER_CHGSHAPE = 163; + public const int ENTER_SANCTUARY = 164; + + public const int LEAVE_SANCTUARY = 165; + public const int PLAYER_OPEN_BOOTH = 166; + public const int SELF_OPEN_BOOTH = 167; + public const int PLAYER_CLOSE_BOOTH = 168; + public const int PLAYER_BOOTH_INFO = 169; + + public const int BOOTH_TRADE_SUCCESS = 170; + public const int BOOTH_NAME = 171; + public const int PLAYER_START_TRAVEL = 172; + public const int HOST_START_TRAVEL = 173; + public const int PLAYER_END_TRAVEL = 174; + + public const int GM_INVINCIBLE = 175; + public const int GM_INVISIBLE = 176; + public const int HOST_CORRECT_POS = 177; + public const int OBJECT_CAST_INSTANT_SKILL = 178; + public const int ACTIVATE_WAYPOINT = 179; + + public const int WAYPOINT_LIST = 180; + public const int UNFREEZE_IVTR_SLOT = 181; // Unfreeze inventory item + public const int TEAM_INVITE_TIMEOUT = 182; + public const int PLAYER_ENABLE_PVP = 183; + public const int PLAYER_DISABLE_PVP = 184; + + public const int HOST_PVP_COOLDOWN = 185; + public const int COOLTIME_DATA = 186; + public const int SKILL_ABILITY = 187; + public const int OPEN_BOOTH_TEST = 188; + public const int BREATH_DATA = 189; + + public const int HOST_STOP_DIVE = 190; + public const int BOOTH_SELL_ITEM = 191; + public const int PLAYER_ENABLE_FASHION = 192; + public const int HOST_ENABLE_FREEPVP = 193; + public const int INVALID_OBJECT = 194; + + public const int PLAYER_ENABLE_EFFECT = 195; + public const int PLAYER_DISABLE_EFFECT = 196; + public const int REVIVAL_INQUIRE = 197; + public const int SET_COOLDOWN = 198; + public const int CHANGE_TEAM_LEADER = 199; + + public const int EXIT_INSTANCE = 200; + public const int CHANGE_FACE_START = 201; + public const int CHANGE_FACE_END = 202; + public const int PLAYER_CHG_FACE = 203; // Player change face completed + public const int OBJECT_CAST_POS_SKILL = 204; + + public const int SET_MOVE_STAMP = 205; + public const int INST_DATA_CHECKOUT = 206; + public const int HOST_RUSH_FLY = 207; + public const int TRASHBOX_SIZE = 208; + public const int NPC_DIED2 = 209; + + public const int PRODUCE_NULL = 210; + public const int PVP_COMBAT = 211; + public const int DOUBLE_EXP_TIME = 212; + public const int AVAILABLE_DOUBLE_EXP_TIME = 213; + public const int DUEL_RECV_REQUEST = 214; + + public const int DUEL_REJECT_REQUEST = 215; + public const int DUEL_PREPARE = 216; + public const int DUEL_CANCEL = 217; + public const int HOST_DUEL_START = 218; + public const int DUEL_STOP = 219; + + public const int DUEL_RESULT = 220; + public const int PLAYER_BIND_REQUEST = 221; + public const int PLAYER_BIND_INVITE = 222; + public const int PLAYER_BIND_REQUEST_REPLY = 223; + public const int PLAYER_BIND_INVITE_REPLY = 224; + + public const int PLAYER_BIND_START = 225; + public const int PLAYER_BIND_STOP = 226; + public const int PLAYER_MOUNTING = 227; + public const int PLAYER_EQUIP_DETAIL = 228; + public const int PLAYER_DUEL_START = 229; + + public const int PARIAH_TIME = 230; + public const int GAIN_PET = 231; + public const int FREE_PET = 232; + public const int SUMMON_PET = 233; + public const int RECALL_PET = 234; + + public const int PLAYER_START_PET_OP = 235; + public const int PLAYER_STOP_PET_OP = 236; + public const int PET_RECEIVE_EXP = 237; + public const int PET_LEVELUP = 238; + public const int PET_ROOM = 239; + + public const int PET_ROOM_CAPACITY = 240; + public const int PET_HONOR_POINT = 241; + public const int PET_HUNGER_GAUGE = 242; + public const int HOST_ENTER_BATTLE = 243; + public const int TANK_LEADER_NOTIFY = 244; + + public const int BATTLE_RESULT = 245; + public const int BATTLE_SCORE = 246; + public const int PET_DEAD = 247; + public const int PET_REVIVE = 248; + public const int PET_HP_NOTIFY = 249; + + public const int PET_AI_STATE = 250; + public const int REFINE_RESULT = 251; + public const int PET_SET_COOLDOWN = 252; + public const int PLAYER_CASH = 253; + public const int PLAYER_BIND_SUCCESS = 254; + + public const int CHANGE_IVTR_SIZE = 255; + public const int PVP_MODE = 256; + public const int PLAYER_WALLOW_INFO = 257; + public const int PLAYER_USE_ITEM_WITH_ARG = 258; + public const int OBJECT_USE_ITEM_WITH_ARG = 259; + + public const int PLAYER_CHANGE_SPOUSE = 260; + public const int NOTIFY_SAFE_LOCK = 261; + public const int ELF_VIGOR = 262; + public const int ELF_ENHANCE = 263; + public const int ELF_STAMINA = 264; + + public const int ELF_CMD_RESULT = 265; + public const int COMMON_DATA_NOTIFY = 266; + public const int COMMON_DATA_LIST = 267; + public const int ELF_REFINE_ACTIVATE = 268; + public const int CAST_ELF_SKILL = 269; + + public const int MALL_ITEM_PRICE = 270; + public const int MALL_ITEM_BUY_FAILED = 271; + public const int GOBLIN_LEVEL_UP = 272; + public const int PLAYER_PROPERTY = 273; + public const int PLAYER_CAST_RUNE_SKILL = 274; + + public const int PLAYER_CAST_RUNE_INSTANT_SKILL = 275; + public const int PLAYER_EQUIP_TRASHBOX_ITEM = 276; + public const int SECURITY_PASSWD_CHECKED = 277; + public const int OBJECT_INVISIBLE = 278; + public const int PLAYER_HP_STEAL = 279; + + public const int PLAYER_DIVIDEND = 280; + public const int DIVIDEND_MALL_ITEM_PRICE = 281; + public const int DIVIDEND_MALL_ITEM_BUY_FAILED = 282; + public const int ELF_EXP = 283; + public const int PUBLIC_QUEST_INFO = 284; + + public const int PUBLIC_QUEST_RANKS = 285; + public const int MULTI_EXP_INFO = 286; + public const int CHANGE_MULTI_EXP_STATE = 287; + public const int WORLD_LIFE_TIME = 288; + public const int WEDDING_BOOK_LIST = 289; + + public const int WEDDING_BOOK_SUCCESS = 290; + public const int CALC_NETWORK_DELAY_RE = 291; + public const int PLAYER_KNOCKBACK = 292; + public const int SUMMON_PLANT_PET = 293; + public const int PLANT_PET_DISAPPEAR = 294; + + public const int PLANT_PET_HP_NOTIFY = 295; + public const int PET_PROPERTY = 296; + public const int FACTION_CONTRIB_NOTIFY = 297; + public const int FACTION_FORTRESS_INFO = 298; + public const int ENTER_FACTIONFORTRESS = 299; + + public const int FACTION_RELATION_NOTIFY = 300; + public const int PLAYER_EQUIP_DISABLED = 301; + public const int PLAYER_SPEC_ITEM_LIST = 302; // return value of GM_QUERY_SPEC_ITEM + public const int OBJECT_START_PLAY_ACTION = 303; + public const int OBJECT_STOP_PLAY_ACTION = 304; + + public const int CONGREGATE_REQUEST = 305; + public const int REJECT_CONGREGATE = 306; + public const int CONGREGATE_START = 307; + public const int CANCEL_CONGREGATE = 308; + public const int ENGRAVE_START = 309; + + public const int ENGRAVE_END = 310; + public const int ENGRAVE_RESULT = 311; + public const int DPS_DPH_RANK = 312; + public const int ADDONREGEN_START = 313; + public const int ADDONREGEN_END = 314; + + public const int ADDONREGEN_RESULT = 315; + public const int INVISIBLE_OBJ_LIST = 316; + public const int SET_PLAYER_LIMIT = 317; + public const int PLAYER_TELEPORT = 318; + public const int OBJECT_FORBID_BE_SELECTED = 319; + + public const int PLAYER_INVENTORY_DETAIL = 320; + public const int PLAYER_FORCE_DATA = 321; + public const int PLAYER_FORCE_CHANGED = 322; + public const int PLAYER_FORCE_DATA_UPDATE = 323; + public const int FORCE_GLOBAL_DATA = 324; + + public const int ADD_MULTIOBJECT_EFFECT = 325; + public const int REMOVE_MULTIOBJECT_EFFECT = 326; + public const int ENTER_WEDDING_SCENE = 327; + public const int PRODUCE4_ITEM_INFO = 328; + public const int ONLINE_AWARD_DATA = 329; + + public const int TOGGLE_ONLINE_AWARD = 330; + public const int PLAYER_PROFIT_TIME = 331; + public const int ENTER_NONPENALTY_PVP_STATE = 332; + public const int SELF_COUNTRY_NOTIFY = 333; + public const int PLAYER_COUNTRY_CHANGED = 334; + + public const int ENTER_COUNTRYBATTLE = 335; + public const int COUNTRYBATTLE_RESULT = 336; + public const int COUNTRYBATTLE_SCORE = 337; + public const int COUNTRYBATTLE_RESURRECT_REST_TIMES = 338; + public const int COUNTRYBATTLE_FLAG_CARRIER_NOTIFY = 339; + + public const int COUNTRYBATTLE_BECAME_FLAG_CARRIER = 340; + public const int COUNTRYBATTLE_PERSONAL_SCORE = 341; + public const int COUNTRYBATTLE_FLAG_MSG_NOTIFY = 342; + public const int DEFENSE_RUNE_ENABLED = 343; + public const int COUNTRYBATTLE_INFO = 344; + + public const int SET_PROFIT_TIME = 345; + public const int CASH_MONEY_EXCHG_RATE = 346; + public const int PET_REBUILD_INHERIT_START = 347; + public const int PET_REBUILD_INHERIT_INFO = 348; + public const int PET_REBUILD_INHERIT_END = 349; + + public const int PET_EVOLUTION_DONE = 350; + public const int PET_REBUILD_NATURE_START = 351; + public const int PET_REBUILD_NATURE_INFO = 352; + public const int PET_REBUILD_NATURE_END = 353; + public const int EQUIP_ADDON_UPDATE_NOTIFY = 354; + + public const int SELF_KING_NOTIFY = 355; + public const int PLAYER_KING_CHANGED = 356; + public const int MERIDIANS_NOTIFY = 357; + public const int MERIDIANS_RESULT = 358; + public const int COUNTRYBATTLE_STRONGHOND_STATE_NOTIFY = 359; + + public const int QUERY_TOUCH_POINT = 360; + public const int SPEND_TOUCH_POINT = 361; + public const int TOTAL_RECHARGE = 362; + public const int QUERY_TITLE_RE = 363; + public const int CHANGE_CURR_TITLE_RE = 364; + + public const int MODIFY_TITLE_NOFIFY = 365; + public const int REFRESH_SIGNIN = 366; + public const int PARALLEL_WORLD_INFO = 367; + public const int PLAYER_REINCARNATION = 368; + public const int REINCARNATION_TOME_INFO = 369; + + public const int ACTIVATE_REINCARNATION_TOME = 370; + public const int UNIQUE_DATA_NOTIFY = 371; + public const int USE_GIFTCARD_RESULT = 372; + public const int REALM_EXP = 373; + public const int REALM_LEVEL = 374; + + public const int ENTER_TRICKBATTLE = 375; + public const int TRICKBATTLE_PERSONAL_SCORE = 376; + public const int TRICKBATTLE_CHARIOT_INFO = 377; + public const int PLAYER_LEADERSHIP = 378; + public const int GENERALCARD_COLLECTION_DATA = 379; + + public const int ADD_GENERALCARD_COLLECTION = 380; // Êղؿ¨ÅÆ + public const int REFRESH_MONSTERSPIRIT_LEVEL = 381; // ÃüÂÖ + public const int MINE_GATHERED = 382; // ¿óÎï³É¹¦²É¼¯¹ã²¥ + public const int PLAYER_IN_OUT_BATTLE = 383; // ÆäËûÍæ¼Ò½øÈë/ÍÑÀëÕ½¶·×´Ì¬ + public const int PLAYER_QUERY_CHARIOTS = 384; // Õ½³µÊýÁ¿²éѯ + + public const int COUNTRYBATTLE_LIVE_SHOW_RESULT = 385; // ¹úÕ½Õ½³¡rankºÍËÀÍöÊý¾Ý + public const int RANDOM_MALL_SHOPPING_RES = 386; // Ëæ»úÉ̳Dzéѯ·µ»Ø + public const int FACTION_PVP_MASK_MODIFY = 387; // °ïÅÉPVP״̬¸Ä±ä + public const int PLAYER_WORLD_CONTRIBUTION = 388; // ÊÀ½ç¹±Ï×¶È + public const int RANDOM_MAP_ORDER = 389; // Ëæ»úµØÍ¼ + + public const int SCENE_SERVICE_NPC_LIST = 390; // µ±Ç°³¡¾°ÖÐѧϰ¼¼ÄܵÄNPCÁбí + public const int NPC_VISIBLE_TID_NOTIFY = 391; // ¹ã²¥Í¨ÖªÊÓÒ°ÄÚnpc±ä»»¿ÉÊÓÄ£ÐÍ + public const int CLIENT_SCREEN_EFFECT = 392; // ÆÁÄ»ÌØÐ§ + public const int EQUIP_CAN_INHERIT_ADDONS = 393; // Éú²úÀàÐÍ5¿É¼Ì³ÐµÄ¸½¼ÓÊôÐÔ + public const int COMBO_SKILL_PREPARE = 394; + + public const int INSTANCE_REENTER_NOTIFY = 395; // ¸±±¾ÖØÈë֪ͨ + public const int PRAY_DISTANCE_CHANGE = 396; // Ò÷³ª¾àÀë²ÎÊý + } + + // Constants used in moving control + public struct MOVECONST + { + public float fStepHei; // Maximum step height + public float fMinAirHei; // Minimum distance to terrain (or water) when fly + public float fMinWaterHei; // Minimum distance to terrain when swim + public float fShoreDepth; // Shore depth + public float fWaterSurf; // Water surface depth + + public MOVECONST(float fStepHei, float fMinAirHei, float fMinWaterHei, float fShoreDepth, float fWaterSurf) + { + this.fStepHei = fStepHei; + this.fMinAirHei = fMinAirHei; + this.fMinWaterHei = fMinWaterHei; + this.fShoreDepth = fShoreDepth; + this.fWaterSurf = fWaterSurf; + } + }; + + // Gender + public static class GENDER + { + public const int GENDER_MALE = 0; + public const int GENDER_FEMALE = 1; + public const int NUM_GENDER = 2; + } + + // Profession + public static class PROFESSION + { + public const int PROF_WARRIOR = 0; // 0:ÎäÏÀ + public const int PROF_MAGE = 1; // 1:·¨Ê¦ + public const int PROF_MONK = 2; // 2:Î×ʦ + public const int PROF_HAG = 3; // 3:Ñý¾« + public const int PROF_ORC = 4; // 4:ÑýÊÞ + public const int PROF_GHOST = 5; // 5:´Ì¿Í + public const int PROF_ARCHOR = 6; // 6:Óðâ + public const int PROF_ANGEL = 7; // 7:ÓðÁé + public const int PROF_JIANLING = 8; // 8:½£Áé + public const int PROF_MEILING = 9; // 9:÷ÈÁé + public const int PROF_YEYING = 10; // 10:Ò¹Ó° + public const int PROF_YUEXIAN = 11; // 11:ÔÂÏÉ + public const int NUM_PROFESSION = 12; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_object_move + { + public int id; + public A3DVECTOR3 dest; + public ushort use_time; + public short sSpeed; // Move speed 8.8 fixed-point + public byte move_mode; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_object_stop_move + { + public int id; + public A3DVECTOR3 dest; + public short sSpeed; // Move speed 8.8 fix-point + public byte dir; + public byte move_mode; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct A3DVECTOR3 + { + public float x; + public float y; + public float z; + + // Constructors + public A3DVECTOR3(float m) + { + x = m; y = m; z = m; + } + + public A3DVECTOR3(float x, float y, float z) + { + this.x = x; this.y = y; this.z = z; + } + + public A3DVECTOR3(A3DVECTOR3 v) + { + x = v.x; y = v.y; z = v.z; + } + + // Operators + public static A3DVECTOR3 operator +(A3DVECTOR3 v1, A3DVECTOR3 v2) + => new A3DVECTOR3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z); + + public static A3DVECTOR3 operator -(A3DVECTOR3 v1, A3DVECTOR3 v2) + => new A3DVECTOR3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z); + + public static A3DVECTOR3 operator *(A3DVECTOR3 v, float f) + => new A3DVECTOR3(v.x * f, v.y * f, v.z * f); + + public static A3DVECTOR3 operator *(float f, A3DVECTOR3 v) + => v * f; + + public static A3DVECTOR3 operator /(A3DVECTOR3 v, float f) + { + float inv = 1.0f / f; + return new A3DVECTOR3(v.x * inv, v.y * inv, v.z * inv); + } + + public static A3DVECTOR3 operator /(A3DVECTOR3 v1, A3DVECTOR3 v2) + => new A3DVECTOR3(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z); + + public static bool operator ==(A3DVECTOR3 v1, A3DVECTOR3 v2) + => v1.x == v2.x && v1.y == v2.y && v1.z == v2.z; + + public static bool operator !=(A3DVECTOR3 v1, A3DVECTOR3 v2) + => !(v1 == v2); + + public static A3DVECTOR3 operator -(A3DVECTOR3 v) + => new A3DVECTOR3(-v.x, -v.y, -v.z); + + // Dot product + public static float DotProduct(A3DVECTOR3 v1, A3DVECTOR3 v2) + => v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; + + // Cross product + public static A3DVECTOR3 CrossProduct(A3DVECTOR3 v1, A3DVECTOR3 v2) + { + return new A3DVECTOR3( + v1.y * v2.z - v1.z * v2.y, + v1.z * v2.x - v1.x * v2.z, + v1.x * v2.y - v1.y * v2.x + ); + } + + // Magnitudes + public float Magnitude() => (float)Math.Sqrt(x * x + y * y + z * z); + public float MagnitudeH() => (float)Math.Sqrt(x * x + z * z); + public float SquaredMagnitude() => x * x + y * y + z * z; + + // Normalize (in-place) + public float Normalize() + { + float mag = Magnitude(); + if (Math.Abs(mag) < 1e-6f) + { + Clear(); + return 0f; + } + float inv = 1f / mag; + x *= inv; y *= inv; z *= inv; + return mag; + } + + // Get normalized (static) + public static float Normalize(A3DVECTOR3 vIn, out A3DVECTOR3 vOut) + { + float mag = vIn.Magnitude(); + if (Math.Abs(mag) < 1e-6f) + { + vOut = new A3DVECTOR3(0f, 0f, 0f); + return 0f; + } + float inv = 1f / mag; + vOut = vIn * inv; + return mag; + } + + // Lerp + public static A3DVECTOR3 Lerp(A3DVECTOR3 v1, A3DVECTOR3 v2, float t) + => v1 * (1f - t) + v2 * t; + + // Utils + public void Set(float _x, float _y, float _z) { x = _x; y = _y; z = _z; } + public void Clear() { x = y = z = 0f; } + public bool IsZero() => x == 0f && y == 0f && z == 0f; + + public float MinMember() => Math.Min(x, Math.Min(y, z)); + public float MaxMember() => Math.Max(x, Math.Max(y, z)); + + public void Snap() + { + if (x > 1f - 1e-5f) { Clear(); x = 1f; return; } + if (x < -1f + 1e-5f) { Clear(); x = -1f; return; } + if (y > 1f - 1e-5f) { Clear(); y = 1f; return; } + if (y < -1f + 1e-5f) { Clear(); y = -1f; return; } + if (z > 1f - 1e-5f) { Clear(); z = 1f; return; } + if (z < -1f + 1e-5f) { Clear(); z = -1f; return; } + } + + // Override Equals & GetHashCode + public override bool Equals(object obj) + { + if (!(obj is A3DVECTOR3)) return false; + var v = (A3DVECTOR3)obj; + return this == v; + } + + public override int GetHashCode() => (x, y, z).GetHashCode(); + + public override string ToString() => $"({x}, {y}, {z})"; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_self_info_1 + { + public int iExp; + public int iSP; + public int cid; + public A3DVECTOR3 pos; + public ushort crc_e; + public ushort crc_c; + public byte dir; // unsigned char → byte + public byte level2; // unsigned char → byte + public int state; + public int state2; + + //TO DO: Check Valid + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct info_player_1 + { + public int cid; + public A3DVECTOR3 pos; + public ushort crc_e; + public ushort crc_c; + public byte dir; + public byte level2; + public int state; + public int state2; + + //TO DO: Convert to c# + // Hàm CheckValid bên C# sẽ viết lại thủ công (không auto marshal được) + //public bool CheckValid(int bufSize, ref int sz, byte[] buffer, int offset = 0) + //{ + // sz = Marshal.SizeOf(); + + // if (bufSize < sz) + // return false; + + // if ((state & GP_STATE_ADV_MODE) != 0) + // sz += sizeof(int) * 2; + + // if ((state & GP_STATE_SHAPE) != 0) + // sz += sizeof(byte); + + // if ((state & GP_STATE_EMOTE) != 0) + // sz += sizeof(byte); + + // if ((state & GP_STATE_EXTEND_PROPERTY) != 0) + // sz += sizeof(int) * OBJECT_EXT_STATE_COUNT; + + // if ((state & GP_STATE_FACTION) != 0) + // sz += sizeof(int) + sizeof(byte); + + // if ((state & GP_STATE_BOOTH) != 0) + // sz += sizeof(byte); + + // if ((state & GP_STATE_EFFECT) != 0) + // { + // if (bufSize < sz + 1) + // return false; + + // byte count = buffer[offset + sz]; + // sz += sizeof(byte); + // sz += count * sizeof(short); + // } + + // if ((state & GP_STATE_PARIAH) != 0) + // sz += sizeof(byte); + + // if ((state & GP_STATE_IN_MOUNT) != 0) + // sz += sizeof(ushort) + sizeof(int); + + // if ((state & GP_STATE_IN_BIND) != 0) + // sz += sizeof(byte) + sizeof(int); + + // if ((state & GP_STATE_SPOUSE) != 0) + // sz += sizeof(int); + + // if ((state & GP_STATE_EQUIPDISABLED) != 0) + // sz += sizeof(long); + + // if ((state & GP_STATE_PLAYERFORCE) != 0) + // sz += sizeof(int); + + // if ((state & GP_STATE_MULTIOBJ_EFFECT) != 0) + // { + // if (bufSize < sz + sizeof(int)) + // return false; + + // int count = BitConverter.ToInt32(buffer, offset + sz); + // sz += sizeof(int); + // sz += count * (sizeof(int) + sizeof(byte)); + // } + + // if ((state & GP_STATE_COUNTRY) != 0) + // sz += sizeof(int); + + // if ((state2 & GP_STATE2_TITLE) != 0) + // sz += sizeof(ushort); + + // if ((state2 & GP_STATE2_REINCARNATION) != 0) + // sz += sizeof(byte); + + // if ((state2 & GP_STATE2_REALM) != 0) + // sz += sizeof(byte); + + // if ((state2 & GP_STATE2_FACTION_PVP_MASK) != 0) + // sz += sizeof(byte); + + // return bufSize >= sz; + //} + + //public byte GetGender() + //{ + // return (state2 & GP_STATE2_GENDER) != 0 ? GENDER_FEMALE : GENDER_MALE; + //} + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_own_ivtr_info + { + public byte byPackage; + public byte ivtr_size; + public uint content_length; + public byte[] content; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_own_ivtr_detail_info + { + public byte byPackage; + public byte ivtr_size; + public uint content_length; + public byte[] content; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_own_item_info + { + public byte byPackage; + public byte bySlot; + public int type; + public int expire_date; + public int state; + public uint count; + public ushort crc; + public ushort content_length; + public byte[] content; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_unfreeze_ivtr_slot + { + public byte where; + public ushort index; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_equip_item + { + public byte index_inv; + public byte index_equip; + public uint count_inv; + public uint count_equip; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct cmd_move_equip_item + { + public byte index_inv; + public byte index_equip; + public uint amount; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct cmd_player_drop_item + { + public byte byPackage; + public byte bySlot; + public int count; + public int tid; + public byte reason; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_matter_info_list + { + public int count; + public info_matter Info; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_matter_enter_world + { + public info_matter Info; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct cmd_pickup_item + { + public int tid; + public int expire_date; + public uint iAmount; + public uint iSlotAmount; + public byte byPackage; + public byte bySlot; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct info_matter + { + public int mid; + public int tid; + public A3DVECTOR3 pos; + public byte dir0; + public byte dir1; + public byte rad; + public byte state; + public byte value; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_player_info_1_list + { + public ushort count; + public byte placeholder; // info_player_1 list + } + public enum ChatChannel + { + //Õâ¸öö¾Ù¶¨ÒåÈç¹û¸Ä¶¯µÄ»°£¬ÒªÍ¨ÖªËùÓÐÈË£¬°üÀ¨·þÎñÆ÷³ÌÐòÔ± + //Èç·Ç±ØÒª£¬¾¡¿ÉÄÜÔÚºóÃæÌí¼Ó£¬±ÜÃâɾ³ýºÍ¸ü¸ÄÇ°ÃæchannelµÄ˳Ðò + GP_CHAT_LOCAL = 0, + GP_CHAT_FARCRY, + GP_CHAT_TEAM, + GP_CHAT_FACTION, + GP_CHAT_WHISPER, + GP_CHAT_DAMAGE, + GP_CHAT_FIGHT, + GP_CHAT_TRADE, + GP_CHAT_SYSTEM, + GP_CHAT_BROADCAST, + GP_CHAT_MISC, + GP_CHAT_INSTANCE, + GP_CHAT_SUPERFARCRY, + GP_CHAT_BATTLE, + GP_CHAT_COUNTRY, + GP_CHAT_MAX, + }; + // Player and NPC state + public static class PlayerNPCState + { + public const int GP_STATE_SHAPE = 0x00000001, + GP_STATE_EMOTE = 0x00000002, + GP_STATE_INVADER = 0x00000004, + GP_STATE_SITDOWN = 0x00000020, + GP_STATE_EXTEND_PROPERTY = 0x00000040, + GP_STATE_CORPSE = 0x00000080, + + // Used only by player + GP_STATE_PARIAH = 0x00000008, + GP_STATE_FLY = 0x00000010, + GP_STATE_TEAM = 0x00000100, + GP_STATE_TEAMLEADER = 0x00000200, + GP_STATE_ADV_MODE = 0x00000400, + GP_STATE_FACTION = 0x00000800, + GP_STATE_BOOTH = 0x00001000, + GP_STATE_FASHION = 0x00002000, + GP_STATE_GMFLAG = 0x00004000, + GP_STATE_PVPFLAG = 0x00008000, + GP_STATE_EFFECT = 0x00010000, + GP_STATE_INPVPCOMBAT = 0x00020000, + GP_STATE_IN_DUEL = 0x00040000, // ÊÇ·ñÕýÔÚ¾ö¶·ÖÐ + GP_STATE_IN_MOUNT = 0x00080000, // ÕýÔÚÆï³ËÖÐ + GP_STATE_IN_BIND = 0x00100000, // ºÍ±ðÈ˰óÔÚÒ»Æð + GP_STATE_BC_INVADER = 0x00200000, // Battle camp: invader + GP_STATE_BC_DEFENDER = 0x00400000, // Battle camp: defender + GP_STATE_SPOUSE = 0x00800000, // Åäżid + GP_STATE_GOBLINREFINE = 0x01000000, // С¾«ÁéÊÇ·ñÒѾ­¼¤»î + GP_STATE_SHIELDUSER = 0x02000000, // ÊÇ·ñÍêÃÀÉñ¶ÜÓû§ + GP_STATE_INVISIBLE = 0x04000000, // ÒþÉí + GP_STATE_EQUIPDISABLED = 0x08000000, // Equipment disabled + GP_STATE_FORBIDBESELECTED = 0x10000000, // ½ûÖ¹±»Ñ¡ÖÐ (NPCÒ²ÓÐЧ) + GP_STATE_PLAYERFORCE = 0x20000000, // ÒѼÓÈëÊÆÁ¦ + GP_STATE_MULTIOBJ_EFFECT = 0x40000000; // ÓëÆäËû¶ÔÏó´æÔÚÌØÊâЧ¹û + public const uint GP_STATE_COUNTRY = 0x80000000; //ÒѼÓÈë¹ú¼Ò + + // Used only by NPC + public const int GP_STATE_NPC_DELAYDEAD = 0x00000008, + GP_STATE_NPC_ADDON1 = 0x00000100, + GP_STATE_NPC_ADDON2 = 0x00000200, + GP_STATE_NPC_ADDON3 = 0x00000400, + GP_STATE_NPC_ADDON4 = 0x00000800, + GP_STATE_NPC_ALLADDON = 0x00000F00, + GP_STATE_NPC_PET = 0x00001000, // Pet flag + GP_STATE_NPC_NAME = 0x00002000, + GP_STATE_NPC_FIXDIR = 0x00004000, // ·½Ïò¹Ì¶¨ + GP_STATE_NPC_MAFIA = 0x00008000, // ËùÊô°ïÅÉ£¨ÓÃÓÚ°ïÅÉPVPÖп󳵵ȣ© + GP_STATE_NPC_FLY = 0x00010000, + GP_STATE_NPC_SWIM = 0x00020000; + }; + + // Player and NPC state2 + public static class PlayerNPCState2 + { + public const int GP_STATE2_ISKING = 0x00000001, // Íæ¼ÒÊÇ·ñ¹úÍõ + GP_STATE2_TITLE = 0x00000002, // ³ÆºÅ + GP_STATE2_REINCARNATION = 0x00000004, // תÉú + GP_STATE2_REALM = 0x00000008, // ¾³½ç + GP_STATE2_IN_BATTLE = 0x00000010, // Õ½¶·×´Ì¬ + GP_STATE2_FACTION_PVP_MASK = 0X00000020, // °ïÅÉ PVP Mask + GP_STATE2_GENDER = 0x00000040; // ÐÔ±ð + } + + [Flags] + // Move mode + public enum MoveMode + + { + MOVE_STAND = 0, + MOVE_MOVE, // Normal move, walk, run, swim or fly + MOVE_JUMP, + MOVE_FREEFALL, + MOVE_SLIDE, + }; + + [Flags] + // Move environment + public enum MoveEnvironment + + { + MOVEENV_GROUND = 0, // Move on ground + MOVEENV_WATER, + MOVEENV_AIR, + }; + + public static class NumberDWORDsPlayerNPC + { + public const int OBJECT_EXT_STATE_COUNT = 6; // Íæ¼Ò/NPC ÉíÉÏ״̬¹âЧ DWORD ¸öÊý = Number of DWORDs for player/NPC status effects + }; + + public static class GPDataTypeHelper + { + public static T FromBytes(byte[] data, int startIndex = 0) where T : struct + { + int size = Marshal.SizeOf(); + if (data.Length - startIndex < size) + throw new ArgumentException("Buffer không đủ dữ liệu"); + + IntPtr ptr = Marshal.AllocHGlobal(size); + try + { + Marshal.Copy(data, startIndex, ptr, size); + return Marshal.PtrToStructure(ptr); + } + finally + { + Marshal.FreeHGlobal(ptr); + } + } + } + +[StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_npc_info_list + { + public ushort count; + public byte placeholder; // chỉ để giữ layout, dữ liệu thực nằm trong buffer + + public static bool CheckValid(ReadOnlySpan buffer, out int sz) + { + sz = 0; + + // cần ít nhất 2 byte cho count + if (buffer.Length < sizeof(ushort)) + return false; + + int sz_org = buffer.Length; + + // đọc count (little-endian) + ushort count = BinaryPrimitives.ReadUInt16LittleEndian(buffer); + + // bỏ qua sizeof(count) = 2 + int offset = sizeof(ushort); + int buf_size = buffer.Length - offset; + + for (int i = 0; i < count; i++) + { + // gọi CheckValid của info_npc trên buffer con + if (!info_npc.CheckValid(buffer.Slice(offset, buf_size), out int npcSize)) + return false; + + offset += npcSize; + buf_size -= npcSize; + } + + sz = sz_org - buf_size; + return true; + } + } + public struct cmd_npc_visible_tid_notify + { + public int nid; + public int vis_tid; + }; + public struct cmd_npc_info_00 + { + public int idNPC; + public int iHP; + public int iMaxHP; + public int iTargetID; + }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] // sizeof = 36 với padding 1 byte sau dir + public struct info_npc + { + public int nid; + public int tid; // template id + public int vis_tid; // + public A3DVECTOR3 pos; + public ushort seed; // seed of customize data + public byte dir; + // (1 byte padding ở đây để int tiếp theo align 4) + public int state; + public int state2; + + // ====== Cờ & hằng số protocol (điền giá trị đúng theo dự án của bạn) ====== + + // Offset và kích thước header theo layout ở trên (Pack=4) + public static readonly int HEADER_SIZE = Marshal.SizeOf(); // sizeof(info_npc) với padding MSVC + public static readonly int STATE_OFFSET = Marshal.OffsetOf(nameof(state)).ToInt32(); // offset của 'state' trong header + + /// + /// Bản chuyển C# tương đương CheckValid: kiểm tra buffer và tính kích thước tổng (sz). + /// buffer phải trỏ đúng từ đầu struct (tức vị trí của 'this' trong C++). + /// + public static bool CheckValid(ReadOnlySpan buffer, out int sz) + { + sz = 0; + + // Cần đủ bytes cho header cố định + if (buffer.Length < HEADER_SIZE) + return false; + + // Đọc state (little-endian) + int state = BinaryPrimitives.ReadInt32LittleEndian(buffer.Slice(STATE_OFFSET, sizeof(int))); + + sz = HEADER_SIZE; + + // If (state & GP_STATE_EXTEND_PROPERTY), OBJECT_EXT_STATE_COUNT DWORD inserted here + if ((state & PlayerNPCState.GP_STATE_EXTEND_PROPERTY) != 0) + { + sz += sizeof(uint) * (int)OBJECT_EXT_STATE.OBJECT_EXT_STATE_COUNT; // DWORD = 4 bytes + } + + // If (state & GP_STATE_NPC_PET), 1 int inserted here + if ((state & PlayerNPCState.GP_STATE_NPC_PET) != 0) + { + sz += sizeof(int); + } + + // If (state & GP_STATE_NPC_NAME), 1 BYTE + name string here + if ((state & PlayerNPCState.GP_STATE_NPC_NAME) != 0) + { + // cần ít nhất 1 byte để đọc độ dài + if (buffer.Length < sz + sizeof(byte)) + return false; + + byte len = buffer[sz]; // độ dài tên + sz += sizeof(byte) + len; // 1 byte length + len bytes nội dung + } + + // If (state & GP_STATE_MULTIOBJ_EFFECT) + if ((state & PlayerNPCState.GP_STATE_MULTIOBJ_EFFECT) != 0) + { + // cần 4 byte để đọc số lượng + if (buffer.Length < sz + sizeof(int)) + return false; + + int count = BinaryPrimitives.ReadInt32LittleEndian(buffer.Slice(sz, sizeof(int))); + sz += sizeof(int); + + if (count < 0) // tránh tràn + return false; + + // mỗi effect: 1 int + 1 "char" 1 byte (trong C++ sizeof(char) = 1) + sz += count * (sizeof(int) + 1); + } + + // If (state & GP_STATE_NPC_MAFIA), 1 int inserted here + if ((state & PlayerNPCState.GP_STATE_NPC_MAFIA) != 0) + { + sz += sizeof(int); + } + + // cuối cùng: buffer có đủ không? + return buffer.Length >= sz; + } + } + public enum OBJECT_EXT_STATE + { + OBJECT_EXT_STATE_COUNT = 6, // Íæ¼Ò/NPC ÉíÉÏ״̬¹âЧ DWORD ¸öÊý + }; +} + diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs.meta new file mode 100644 index 0000000000..e8701c0b25 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 04ef696be8b0447a8b5528a2e5ea8bce \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs new file mode 100644 index 0000000000..ed9c2a4e25 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -0,0 +1,731 @@ +using System.Text; +using System; +using CSNetwork.Protocols; +using CSNetwork.Protocols.RPCData; +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using CommandID = CSNetwork.GPDataType.CommandID; +using System.IO; +using System.Diagnostics; +using System.Numerics; +using CSNetwork.C2SCommand; +using CSNetwork.GPDataType; + +namespace CSNetwork +{ + public class GameSession : IDisposable + { + private static IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(GameSession)); // Get class-specific logger + + private NetworkManager _networkManager; + private string _host; + private int _port; + private string _username; + private string _password; + private int _currentUserId = -1; // To store the UserID after successful login + private int m_iCharID; + + // State management for async operations and callbacks + private Action _loginCallback; + private Action> _roleListCallback; + private List _accumulatedRoles; + private Action _selectRoleCallback; + private RoleInfo _selectedRole; + public bool IsConnected => _networkManager?.IsConnected ?? false; + + public GameSession() + { + _networkManager = new NetworkManager(); + _networkManager.ProtocolReceived += OnProtocolReceived; + _networkManager.ErrorOccurred += OnErrorOccurred; + _networkManager.Disconnected += OnDisconnected; + } + + public void SetLogPath(string path) + { + LoggerFactory.SetFileLoggerImplementation(new FileLogger()); + _logger = LoggerFactory.GetCustomLogger(path, nameof(GameSession) + GetHashCode(), LoggerType.File); + _networkManager.SetLogPath(path); + } + /// + /// Connects to the game server asynchronously. + /// + /// Server hostname or IP address. + /// Server port. + /// Task representing the asynchronous connect operation. Check IsConnected property or handle Disconnected event for status. + public async Task ConnectAsync(string host, int port) + { + if (IsConnected) + { + _logger.Log(LogType.Warning, "ConnectAsync called but already connected."); + return; + } + _host = host; + _port = port; + _logger.Log(LogType.Info, $"Attempting to connect to {_host}:{_port}..."); + try + { + await _networkManager.ConnectAsync(_host, _port); + if (IsConnected) + { + _logger.Log(LogType.Info, "Connection established."); + } + else + { + _logger.Log(LogType.Warning, "Connection failed after ConnectAsync completed (check NetworkManager logs/events)."); + } + } + catch (Exception ex) + { + _logger.Log(LogType.Error, $"Connection exception: {ex.Message}"); + _logger.LogException(ex); + OnDisconnected(); + } + } + + + public void Disconnect() + { + _networkManager.Disconnect(); + } + + /// + /// Initiates the login process asynchronously. + /// + /// Account username. + /// Account password. + /// Action invoked with true on successful login (OnlineAnnounce received), false otherwise. + public void LoginAsync(string username, string password, Action callback) + { + if (!IsConnected) + { + _logger.Log(LogType.Warning, "LoginAsync called but not connected."); + callback?.Invoke(false); + return; + } + if (_loginCallback != null) + { + _logger.Log(LogType.Warning, "LoginAsync called while another login is already in progress."); + callback?.Invoke(false); + return; + } + + _username = username; + _password = password; + _loginCallback = callback; + _currentUserId = -1; // Reset user ID + + _logger.Log(LogType.Info, $"Initiating login for user '{_username}'..."); + } + + /// + /// Initiates fetching the role list asynchronously. Requires successful login. + /// + /// Action invoked with the complete list of roles, or null/empty list on failure. + public void GetRoleListAsync(Action> callback) + { + if (!IsConnected) + { + _logger.Log(LogType.Warning, "GetRoleListAsync called but not connected."); + callback?.Invoke(null); + return; + } + if (_currentUserId == -1) + { + _logger.Log(LogType.Warning, "GetRoleListAsync called but not logged in."); + callback?.Invoke(null); + return; + } + if (_roleListCallback != null) + { + _logger.Log(LogType.Warning, "GetRoleListAsync called while another role list retrieval is already in progress."); + callback?.Invoke(null); + return; + } + + _roleListCallback = callback; + _accumulatedRoles = new List(); + _logger.Log(LogType.Info, "Requesting role list..."); + RequestRoleListInternal(); + } + + public void SelectRoleAsync(RoleInfo role, Action callback) + { + _selectedRole = role; + _selectRoleCallback = callback; + SetCharacterID(role.roleid); + SendProtocol(new selectrole() + { + Roleid = role.roleid, + Flag = 0 + }); + + } + public void EnterWorldAsync(RoleInfo role, Action callback) + { + SendProtocol(new enterworld() + { + Roleid = _selectedRole.roleid, + Provider_link_id = 0, + }, callback); + } + public void RequestDropIvtrItem(byte index, int amount) + { + gamedatasend gamedatasendRequest = new gamedatasend(); + gamedatasendRequest.Data = C2SCommandFactory.CreateDropIvtrItem(index, amount); + SendProtocol(gamedatasendRequest); + } + public void RequestDropEquipItem(byte index) + { + gamedatasend gamedatasendRequest = new gamedatasend(); + gamedatasendRequest.Data = C2SCommandFactory.CreateDropEquipItem(index); + SendProtocol(gamedatasendRequest); + } + + public void RequestPickupItem(int idItem, int tid) + { + gamedatasend gamedatasendRequest = new gamedatasend(); + gamedatasendRequest.Data = C2SCommandFactory.CreatePickupItem(idItem, tid); + SendProtocol(gamedatasendRequest); + } + public void RequestInventoryAsync(byte byPackage, Action callback) + { + gamedatasend gamedatasendRequest = new gamedatasend(); + gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.CreateGetInventoryDetail(byPackage); + SendProtocol(gamedatasendRequest, callback); + } + + public void RequestCheckSecurityPassWd(string password) + { + gamedatasend gamedatasendRequest = new gamedatasend(); + gamedatasendRequest.Data = C2SCommandFactory.CreateCheckSecurityPassWd(password); + SendProtocol(gamedatasendRequest); + } + + public void RequestEquipItem(byte iIvtrIdx, byte iEquipIdx, Action callback) + { + gamedatasend gamedatasendRequest = new gamedatasend(); + gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.CreateEquipItem(iIvtrIdx, iEquipIdx); + SendProtocol(gamedatasendRequest, callback); + } + public void RequestOwnItemInfoAsync( + byte byPackage, + byte bySlot, + int type, + int expire_date, + int state, + uint count, + ushort crc, + ushort content_length, + byte[] content, + Action callback) + { + gamedatasend gamedatasendRequest = new gamedatasend(); + gamedatasendRequest.Data = C2SCommandFactory.CreateOwnItemInfo(byPackage, bySlot, type, expire_date, state, count, crc, content_length, content); + SendProtocol(gamedatasendRequest, callback); + } + + // --- Protocol Sending --- + public void SendProtocol(Protocol protocol, Action complete = null) + { + if (IsConnected) + { + _logger.Log(LogType.Debug, $"Sending protocol: {protocol.GetType().Name} (Detail: {protocol.ToString})"); + _networkManager.Send(protocol); + complete?.Invoke(); + } + else + { + _logger.Log(LogType.Warning, $"Cannot send protocol ({protocol.GetType().Name}), not connected."); + } + } + + // --- Event Handlers (from NetworkManager) --- + + private void OnProtocolReceived(Protocol protocol) + { + + _logger.Log(LogType.Debug, $"Received protocol: {protocol.GetType().Name} (Type: {protocol.Type})"); + if (protocol is null) + return; + + + + // Route protocol to appropriate handler + switch (protocol.GetPType()) + { + case ProtocolType.PROTOCOL_CHALLENGE: + HandleChallenge((challenge)protocol); + break; + case ProtocolType.PROTOCOL_KEYEXCHANGE: + HandleKeyExchange((KeyExchange)protocol); + break; + case ProtocolType.PROTOCOL_ONLINEANNOUNCE: + HandleOnlineAnnounce((onlineannounce)protocol); + break; + case ProtocolType.PROTOCOL_ROLELIST_RE: + HandleRoleListResponse((RoleListResponse)protocol); + break; + // Add cases for other protocols GameSession might need to handle + case ProtocolType.PROTOCOL_SELECTROLE_RE: + HandleSelectRoleResponse((SelectRole_Re)protocol); + //_networkManager.IgnoreBytes = 2; + break; + case ProtocolType.PROTOCOL_S2CGAMEDATASEND: + case ProtocolType.PROTOCOL_GAMEDATASEND: + HandleServerDataSend((gamedatasend)protocol); + break; + case ProtocolType.PROTOCOL_CHATMESSAGE: + _logger.Log(LogType.Warning, $"HoangDev :ProtocolType.PROTOCOL_CHATMESSAGE {protocol.GetPType()}"); + OnPrtcChatMessage(protocol, false); + break; + default: + _logger.Log(LogType.Warning, $"Received unhandled protocol type: {protocol.GetPType()}"); + break; + } + } + + private void HandleServerDataSend(gamedatasend protocol) + { + _logger.Info($"### GameDataSend: {protocol.Data.ByteArray[0]}"); + int lenghtHeader = Marshal.SizeOf(); + var pDataBuf = new byte[protocol.Data.ByteArray.Length - lenghtHeader]; + var byteArrHeader = new byte[lenghtHeader]; + long dwDataSize = protocol.Data.Size; + + if (dwDataSize < Marshal.SizeOf()) + { + _logger.Error($"### GameDataSend: size invalid {dwDataSize}"); + return; + } + + dwDataSize -= Marshal.SizeOf(); // subtract the header size (ushort) + for (int i = 0; i < protocol.Data.ByteArray.Length; i++) + { + if (i < lenghtHeader) + { + byteArrHeader[i] = protocol.Data.ByteArray[i]; + } + else + { + pDataBuf[i - lenghtHeader] = protocol.Data.ByteArray[i]; + } + } + var pCmdHeader = BitConverter.ToUInt16(byteArrHeader); + + _logger.Info($"### GameDataSend: CMDID {pCmdHeader}"); + int iHostID = _selectedRole.roleid; + switch (pCmdHeader) + { + case CommandID.PLAYER_INFO_2: + case CommandID.PLAYER_INFO_3: + case CommandID.PLAYER_INFO_4: + case CommandID.PLAYER_INFO_2_LIST: + case CommandID.PLAYER_INFO_3_LIST: + case CommandID.PLAYER_INFO_23_LIST: + + break; + + case CommandID.PLAYER_INFO_1: + case CommandID.PLAYER_ENTER_WORLD: + case CommandID.PLAYER_ENTER_SLICE: + case CommandID.PLAYER_INFO_1_LIST: + case CommandID.PLAYER_INFO_00: + case CommandID.SELF_INFO_1: + // OnMsgPlayerInfo(-1, pDataBuf, pCmdHeader); + _logger.Info($"HoangDev : EC_MsgDef.MSG_PM_PLAYERINFO"); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERINFO, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader, iHostID, _selectedRole); + break; + case CommandID.OBJECT_MOVE: + int lenghtDataType = Marshal.SizeOf(); + byte[] arrByteData = GetBytes(pDataBuf, lenghtDataType, 0); + int idObjMove = BitConverter.ToInt32(arrByteData); + if (IsPlayerId(idObjMove)) + { + EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader, iHostID); + } + else if (ISNPCID(idObjMove)) + { + _logger.Info("HoangDev : NPC OBJECT_MOVE"); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCMOVE, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader); + } + break; + case CommandID.OBJECT_STOP_MOVE: + { + int id = GPDataTypeHelper.FromBytes(pDataBuf); + if (IsPlayerId(id)) + { + EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERSTOPMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader); + } + else if (ISNPCID(id)) + { + _logger.Info("HoangDev : NPC OBJECT_MOVE"); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCSTOPMOVE, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader); + } + break; + } + case CommandID.OWN_IVTR_DATA: + case CommandID.OWN_IVTR_DETAIL_DATA: + case CommandID.GET_OWN_MONEY: + case CommandID.CHANGE_IVTR_SIZE: + _logger.Info($"HUNG INVENTORY2"); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_IVTRINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, iHostID); + break; + case CommandID.EXG_IVTR_ITEM: + case CommandID.MOVE_IVTR_ITEM: + case CommandID.PLAYER_DROP_ITEM: + case CommandID.EXG_EQUIP_ITEM: + case CommandID.EQUIP_ITEM: + case CommandID.MOVE_EQUIP_ITEM: + case CommandID.UNFREEZE_IVTR_SLOT: + case CommandID.PLAYER_EQUIP_TRASHBOX_ITEM: + _logger.Info($"HUNG EQUIP ITEM: " + pCmdHeader); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ITEMOPERATION, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); + break; + case CommandID.MATTER_INFO_LIST: + EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERINFO, (int)MANAGER_INDEX.MAN_MATTER, 0, pDataBuf, pCmdHeader); + break; + case CommandID.MATTER_ENTER_WORLD: + EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERENTWORLD, (int)MANAGER_INDEX.MAN_MATTER, 0, pDataBuf, pCmdHeader); + break; + case CommandID.PICKUP_ITEM: + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PICKUPITEM, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); + break; + case CommandID.HOST_CORRECT_POS: + _logger.Info($"HoangDev HOST_CORRECT_POSHOST_CORRECT_POSHOST_CORRECT_POS"); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CORRECTPOS, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, iHostID); + break; + case CommandID.OWN_ITEM_INFO: + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNITEMINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, iHostID); + break; + case CommandID.NPC_ENTER_SLICE: + case CommandID.NPC_INFO_LIST: + case CommandID.NPC_INFO_00: + case CommandID.NPC_ENTER_WORLD: + case CommandID.NPC_VISIBLE_TID_NOTIFY: + _logger.Info($"HoangDev :NPC_VISIBLE_TID_NOTIFY"); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCINFO, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader, dwDataSize); + break; + case CommandID.TASK_DATA: + case CommandID.TASK_VAR_DATA: + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize); + break; + case CommandID.ERROR_MESSAGE: + _logger.Info($"### GameDataSend: ERROR_MESSAGE: {BitConverter.ToInt32(pDataBuf, 0)}"); + break; + } + } + + public void OnMsgPlayerInfo(int iSubID, byte[] data, ushort pCmdHeader) + { + if (iSubID == 0) + { + + } + else if (iSubID < 0) + { + int iHostID = _selectedRole.roleid; + int lenghtByte = Marshal.SizeOf(); + byte[] byteArray = new byte[lenghtByte]; + for (int i = 0; i < lenghtByte; i++) + { + byteArray[i] = data[i]; + } + int cid = BitConverter.ToInt32(byteArray); + switch (pCmdHeader) + { + case CommandID.PLAYER_INFO_1: + case CommandID.PLAYER_ENTER_WORLD: + case CommandID.PLAYER_ENTER_SLICE: + { + if (cid != iHostID) + { + _logger.Info("### OnMsgPlayerInfo: ElsePlayer join"); + } + break; + } + } + } + else + { + + } + } + + private void HandleSelectRoleResponse(SelectRole_Re protocol) + { + _logger.Info($"Select role response {protocol.result}"); + _selectRoleCallback?.Invoke(_selectedRole); + } + + private void OnErrorOccurred(string errorMessage) + { + _logger.Log(LogType.Error, $"Network Error: {errorMessage}"); + FailLoginInProgress(errorMessage); + FailRoleListInProgress(errorMessage); + } + + private void OnDisconnected() + { + _logger.Log(LogType.Info, "Disconnected from server."); + _currentUserId = -1; + FailLoginInProgress("Disconnected"); + FailRoleListInProgress("Disconnected"); + } + + // --- Protocol Handling Logic --- + + private void HandleChallenge(challenge challenge) + { + if (_loginCallback == null || string.IsNullOrEmpty(_username)) + { + _logger.Log(LogType.Warning, "Received Challenge but not expecting it or username not set."); + return; + } + + _logger.Log(LogType.Info, "Handling Challenge..."); + + response response = new response(); + byte[] usernameBytes = Encoding.ASCII.GetBytes(_username); + byte[] passwordBytes = Encoding.ASCII.GetBytes(_password); + response.identity.Replace(usernameBytes); + response.Setup(new Octets(usernameBytes), new Octets(passwordBytes), challenge.nonce); + + uint clientId = 0xffffffff; + byte[] clientIdBytes = BitConverter.GetBytes(clientId); + response.cli_fingerprint.Replace(clientIdBytes); + response.use_token = 0; + + _networkManager.SetNonce(response.response_data); + SendProtocol(response); + _logger.Log(LogType.Info, "Sent Response."); + } + + private void HandleKeyExchange(KeyExchange keyExchange) + { + if (_loginCallback == null || string.IsNullOrEmpty(_username)) + { + _logger.Log(LogType.Warning, "Received KeyExchange but not expecting it."); + return; + } + + _logger.Log(LogType.Info, "Handling KeyExchange..."); + keyExchange.Setup(_networkManager, _username); + keyExchange.Blkickuser = 1; + SendProtocol(keyExchange); + _logger.Log(LogType.Info, "Sent KeyExchange acknowledgment/response."); + } + + private void HandleOnlineAnnounce(onlineannounce announce) + { + if (_loginCallback == null) + { + _logger.Log(LogType.Warning, "Received OnlineAnnounce but not expecting it."); + return; + } + + _logger.Log(LogType.Info, $"Login successful! UserID: {announce.Userid}, LocalSID: {announce.Localsid}"); + _currentUserId = announce.Userid; + + var callback = _loginCallback; + _loginCallback = null; + callback?.Invoke(true); + } + + private void RequestRoleListInternal(int lastHandle = -1) + { + rolelist rolelistRequest = new rolelist(); + rolelistRequest.Userid = _currentUserId; + rolelistRequest.Localsid = 0; + rolelistRequest.Handle = lastHandle; + + SendProtocol(rolelistRequest); + + + //gamedatasend gamedatasendRequest = new gamedatasend(); + //gamedatasendRequest.Data = C2SCommandFactory.CreatePlayerMove(); + + //SendProtocol(gamedatasendRequest); + } + + private void HandleRoleListResponse(RoleListResponse response) + { + if (_roleListCallback == null || _accumulatedRoles == null) + { + _logger.Log(LogType.Warning, "Received RoleListResponse but not expecting it."); + return; + } + + _logger.Log(LogType.Debug, $"Received RoleListResponse. Handle: {response.handle}, Result: {response.result}, Count: {response.rolelist.Count}"); + + if (response.result == 0) + { + _accumulatedRoles.AddRange(response.rolelist); + + foreach (var role in response.rolelist) + { + try + { + string roleName = Encoding.UTF8.GetString(role.name.ByteArray, 0, role.name.Length); + _logger.Log(LogType.Info, $" - Role ID: {role.roleid}, Name: {roleName}, Level: {role.level}"); + } + catch (Exception ex) + { + _logger.Log(LogType.Error, $" - Error decoding role name: {ex.Message}"); + _logger.LogException(ex); + } + } + + if (response.handle != -1) + { + _logger.Log(LogType.Debug, $"Requesting next batch of roles (handle: {response.handle})..."); + RequestRoleListInternal(response.handle); + } + else + { + _logger.Log(LogType.Info, $"Finished fetching roles. Total count: {_accumulatedRoles.Count}"); + var callback = _roleListCallback; + var result = _accumulatedRoles; + _roleListCallback = null; + _accumulatedRoles = null; + callback?.Invoke(result); + } + } + else + { + _logger.Log(LogType.Error, $"Role list retrieval failed. Result code: {response.result}"); + FailRoleListInProgress($"Role list retrieval failed (Result: {response.result})"); + } + } + + // --- Helper methods for failure handling --- + private void FailLoginInProgress(string reason) + { + if (_loginCallback != null) + { + _logger.Log(LogType.Error, $"Login failed: {reason}"); + var callback = _loginCallback; + _loginCallback = null; + callback?.Invoke(false); + } + } + + private void FailRoleListInProgress(string reason) + { + if (_roleListCallback != null) + { + _logger.Log(LogType.Error, $"Role list retrieval failed: {reason}"); + var callback = _roleListCallback; + _roleListCallback = null; + _accumulatedRoles = null; + callback?.Invoke(null); + } + } + + // --- IDisposable Implementation --- + private bool disposedValue = false; + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + if (_networkManager != null) + { + _logger.Log(LogType.Info, "[DUCK] Disposing GameSession and disconnecting..."); + _networkManager.ProtocolReceived -= OnProtocolReceived; + _networkManager.ErrorOccurred -= OnErrorOccurred; + _networkManager.Disconnected -= OnDisconnected; + _networkManager.Disconnect(); + _networkManager.Dispose(); + _networkManager = null; + } + _loginCallback = null; + _roleListCallback = null; + _accumulatedRoles = null; + } + disposedValue = true; + } + } + + public void Dispose() + { + Dispose(true); + // GC.SuppressFinalize(this); + } + + public bool IsPlayerId(int id) + { + return id != 0 && (id & 0x80000000) == 0; + } + public bool ISNPCID(int id) => ((id & unchecked((int)0x80000000)) != 0) + && ((id & 0x40000000) == 0); + private byte[] GetBytes(byte[] bytes, int length, int index) + { + byte[] arrByteData = new byte[length]; + for (int i = 0; i < length; i++) + { + arrByteData[i] = bytes[i + index]; + } + return arrByteData; + } + public void c2s_CmdPlayerMove(in Vector3 vCurPos, in Vector3 vDest, + int iTime, float fSpeed, int iMoveMode, ushort wStamp) + { + gamedatasend gamedatasend = new gamedatasend(); + + gamedatasend.Data = C2SCommandFactory.CreatePlayerMove(vCurPos, vDest, (ushort)iTime, fSpeed, (byte)iMoveMode, wStamp); + SendProtocol(gamedatasend); + } + public void c2s_SendCmdStopMove(in Vector3 vDest, float fSpeed, int iMoveMode, + byte byDir, ushort wStamp, int iTime) + { + + gamedatasend gamedatasend = new gamedatasend(); + + gamedatasend.Data = C2SCommandFactory.CreatePlayerStop(vDest, fSpeed, (byte)iMoveMode, byDir, wStamp, (ushort)iTime); + SendProtocol(gamedatasend); + } + public void SendChatData(byte cChannel, in string szMsg, int iPack, int iSlot) + { + publicchat publicChat = new publicchat(); + publicChat.Channel = cChannel; + publicChat.Roleid = m_iCharID; + + byte[] unicodeBytes = Encoding.Unicode.GetBytes(szMsg); + publicChat.Msg.Replace(unicodeBytes); + _logger.Log(LogType.Warning, $"HoangDev : publicChat {publicChat}"); + SendProtocol(publicChat); + } + private void SetCharacterID(int iCharID) { m_iCharID = iCharID; } + private void OnPrtcChatMessage(Protocol pProtocol, bool bCalledagain) + { + chatmessage p = (chatmessage)pProtocol; + + string strTemp = System.Text.Encoding.Unicode.GetString(p.Msg.ToArray(), 0, p.Msg.Length); + + _logger.Log(LogType.Warning, $"HoangDev : OnPrtcChatMessage :{strTemp}"); + EventBus.Publish(new ChatMessageEvent(strTemp)); + } + + public struct ChatMessageEvent + { + public string context; + public ChatMessageEvent(string context) { this.context = context; } + } + + public void c2s_SendCmdGetAllData(bool byPack, bool byEquip, bool byTask) + { + gamedatasend gamedatasend = new gamedatasend(); + + gamedatasend.Data = C2SCommandFactory.CreateGetAllDataCommand(byPack, byEquip, byTask); + _logger.Log(LogType.Warning, $"[Dat]- SendCmdGetAllData {byPack},{byEquip},{byTask}"); + SendProtocol(gamedatasend); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs.meta new file mode 100644 index 0000000000..b2fe59db95 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6d80345ab31fd4c76ba29e624f33e6ef \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs new file mode 100644 index 0000000000..35f697c948 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs @@ -0,0 +1,36 @@ +using System; + +namespace CSNetwork +{ + public static class Helper + { + public static byte[] HexStringToByteArray(string hex) + { + if (hex.Length % 2 == 1) + throw new ArgumentException("Hex string must have an even number of digits."); + + int numberChars = hex.Length; + byte[] bytes = new byte[numberChars / 2]; + for (int i = 0; i < numberChars; i += 2) + { + try + { + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); + } + catch (FormatException ex) + { + throw new ArgumentException( + $"Invalid hex character found at position {i}: '{hex.Substring(i, 2)}'", + ex + ); + } + } + return bytes; + } + + public static string ByteToHexString(byte[] bytes) + { + return BitConverter.ToString(bytes).Replace("-", ""); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs.meta new file mode 100644 index 0000000000..d8585ae77d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Helper.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fe3c985875ea4448d95225eb0b8273d2 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger.meta new file mode 100644 index 0000000000..0db48dd8fd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9e33a53771af04f8aa7e6cb86760300b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs new file mode 100644 index 0000000000..7524c1c5d2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs @@ -0,0 +1,27 @@ +using System; + +namespace CSNetwork +{ + public class ConsoleLogger : ILogger + { + public void Log(LogType logType, string prefix, string message) + { + // Check if the message's log level is sufficient + // if (logType >= Manager.MinLogLevel) <-- REMOVED: Filtering done by LoggerFactory/PrefixedLogger + // { + // Format: [LogType] [Prefix] Message + Console.WriteLine($"[{logType}] [{prefix}] {message}"); + // } + } + + public void LogException(string prefix, Exception exception) + { + // Exceptions are logged if Exception level is enabled + // if (LogType.Exception >= Manager.MinLogLevel) <-- REMOVED: Filtering done by LoggerFactory/PrefixedLogger + // { + // Format: [Exception] [Prefix] Exception Details + Console.WriteLine($"[Exception] [{prefix}] {exception}"); // Includes message and stack trace + // } + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs.meta new file mode 100644 index 0000000000..ed5fa29e44 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ConsoleLogger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 10ea71599c91f4898b0222a59215d56c \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs new file mode 100644 index 0000000000..f5cf1717d2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace CSNetwork +{ + public class FileLogger : ILogger + { + private string _filePath; + private readonly object _lockObject = new object(); + + public void SetFilePath(string filePath) + { + // Prevent changing the file path if it's already set + if (!string.IsNullOrEmpty(_filePath)) return; + + _filePath = filePath; + // Ensure directory exists + Directory.CreateDirectory(Path.GetDirectoryName(filePath)); + // Create or clear the file + File.WriteAllText(filePath, string.Empty); + } + + public void Log(LogType logType, string prefix, string message) + { + var logMessage = $"[{logType}] [{prefix}] {message}{Environment.NewLine}"; + lock (_lockObject) + { + File.AppendAllText(_filePath, logMessage); + } + } + + public void LogException(string prefix, Exception exception) + { + var logMessage = $"[Exception] [{prefix}] {exception}{Environment.NewLine}"; + lock (_lockObject) + { + File.AppendAllText(_filePath, logMessage); + } + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs.meta new file mode 100644 index 0000000000..5df0b983fa --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/FileLogger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1d5039dcc202e4a4eb8646cf667a1c38 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs new file mode 100644 index 0000000000..a3803dd9fe --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs @@ -0,0 +1,19 @@ +using System; + +namespace CSNetwork +{ + public enum LogType + { + Debug, + Info, + Warning, + Error, + Exception + } + + public interface ILogger + { + void Log(LogType logType, string prefix, string message); + void LogException(string prefix, Exception exception); + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs.meta new file mode 100644 index 0000000000..0dd799fdb0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/ILogger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f2d723cc0854d43db98999c0b7009a86 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs new file mode 100644 index 0000000000..44e5c5045c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs @@ -0,0 +1,23 @@ +using System; + +namespace CSNetwork +{ + /// + /// Interface for a logger instance that has a pre-defined prefix. + /// + public interface IPrefixedLogger + { + /// + /// Logs a message with the specified log level. + /// + /// The severity level of the message. + /// The message to log. + void Log(LogType logType, string message); + + /// + /// Logs an exception. + /// + /// The exception to log. + void LogException(Exception exception); + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs.meta new file mode 100644 index 0000000000..3c829a6c39 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/IPrefixedLogger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f4f4ff53571f144918c70a7b6001d91b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs new file mode 100644 index 0000000000..2f8a25ad94 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs @@ -0,0 +1,66 @@ +using System; + +namespace CSNetwork +{ + /// + /// Provides extension methods for the IPrefixedLogger interface. + /// + public static class LoggerExtensions + { + /// + /// Logs a message with the Debug level. + /// + public static void Debug(this IPrefixedLogger logger, string message) + { + logger.Log(LogType.Debug, message); + } + + /// + /// Logs a message with the Info level. + /// + public static void Info(this IPrefixedLogger logger, string message) + { + logger.Log(LogType.Info, message); + } + + /// + /// Logs a message with the Warning level. + /// + public static void Warning(this IPrefixedLogger logger, string message) + { + logger.Log(LogType.Warning, message); + } + + /// + /// Logs a message with the Error level. + /// + public static void Error(this IPrefixedLogger logger, string message) + { + logger.Log(LogType.Error, message); + } + + /// + /// Logs an exception with the Exception level. + /// + public static void Exception(this IPrefixedLogger logger, Exception exception, string message = null) + { + if (!string.IsNullOrEmpty(message)) + { + logger.Log(LogType.Exception, $"{message}\n{exception}"); // Log message first, then exception + } + else + { + logger.LogException(exception); + } + } + + /// + /// Logs only an exception message with the Exception level. + /// Use this if you only want the message and not the full stack trace from LogException. + /// + public static void ExceptionMsg(this IPrefixedLogger logger, string message) + { + logger.Log(LogType.Exception, message); + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs.meta new file mode 100644 index 0000000000..a94d30aaa1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerExtensions.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2bbc23303790c431c96db75dd92567d9 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs new file mode 100644 index 0000000000..8282f71340 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs @@ -0,0 +1,118 @@ +using System; + +namespace CSNetwork +{ + public enum LoggerType + { + Console, + File + } + /// + /// Provides instances of loggers and manages the global logging configuration. + /// + public static class LoggerFactory + { + private static ILogger _actualLogger = new ConsoleLogger(); // Default implementation + private static ILogger _fileLogger = new FileLogger(); // Default file logger + private static LogType _minLogLevel = LogType.Debug; // Default level + + /// + /// Sets the underlying logger implementation used by the factory. + /// + /// The logger implementation to use. + public static void SetLoggerImplementation(ILogger loggerImplementation) + { + _actualLogger = loggerImplementation ?? throw new ArgumentNullException(nameof(loggerImplementation)); + } + + public static void SetFileLoggerImplementation(ILogger loggerImplementation) + { + _fileLogger = loggerImplementation ?? throw new ArgumentNullException(nameof(loggerImplementation)); + } + + /// + /// Sets the minimum log level. Messages below this level will be ignored. + /// + /// The minimum log level. + public static void SetMinLogLevel(LogType level) + { + _minLogLevel = level; + } + + /// + /// Gets a logger instance associated with the specified prefix (typically a class name). + /// + /// The prefix for the logger instance. + /// An IPrefixedLogger instance. + public static IPrefixedLogger GetLogger(string prefix) + { + return new PrefixedLogger(prefix ?? string.Empty); + } + + /// + /// Get a custom logger instance based on configuration and type.
+ /// If it's a File logger, the config is the file path (absolute). + ///
+ public static IPrefixedLogger GetCustomLogger(string config, string prefix, LoggerType loggerType = LoggerType.File) + { + switch (loggerType) + { + case LoggerType.File: + if (!string.IsNullOrEmpty(config)) + { + return new CustomFileLogger(config, prefix); + } + return null; + default: + return null; + } + } + + // Internal implementation of IPrefixedLogger + private class PrefixedLogger : IPrefixedLogger + { + private readonly string _prefix; + + internal PrefixedLogger(string prefix) + { + _prefix = prefix; + } + + public void Log(LogType logType, string message) + { + if (logType >= _minLogLevel) // Check level before calling underlying logger + { + _actualLogger.Log(logType, _prefix, message); + } + } + + public void LogException(Exception exception) + { + if (LogType.Exception >= _minLogLevel) // Exception level check + { + _actualLogger.LogException(_prefix, exception); + } + } + } + + private class CustomFileLogger : IPrefixedLogger + { + private readonly string _prefix; + public CustomFileLogger(string filePath, string prefix) + { + (_fileLogger as FileLogger)?.SetFilePath(filePath); + _prefix = prefix; + } + + public void Log(LogType logType, string message) + { + if (logType >= _minLogLevel) _fileLogger.Log(logType, _prefix, message); + } + + public void LogException(Exception exception) + { + if (LogType.Exception >= _minLogLevel) _fileLogger.LogException(_prefix, exception); + } + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs.meta new file mode 100644 index 0000000000..e5f00d4c05 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Logger/LoggerFactory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bb54781bdcaec4df8b30ab87b7b2acbd \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs new file mode 100644 index 0000000000..0bd02f1a5d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CSNetwork.Protocols; + +namespace CSNetwork +{ + public abstract class Manager + { + public abstract void OnAddSession(uint sid); + public abstract void OnDelSession(uint sid); + + public virtual void OnAbortSession(uint sid) { } + + public virtual void OnRecvProtocol(uint sid, Protocol protocol) { } + + public abstract bool Close(uint sid); + public abstract string GetLastError(); + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs.meta new file mode 100644 index 0000000000..607507feb5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Manager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b3e193f7e08334f13a657a45993aa508 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs new file mode 100644 index 0000000000..459516adf6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs @@ -0,0 +1,540 @@ +using System.Collections.Concurrent; +using System.Net.Sockets; +using CSNetwork.Security; // Use the Security namespace +using CSNetwork.Protocols; +using System.Threading; +using System.Threading.Tasks; +using System; +using System.IO; + +namespace CSNetwork +{ + public class NetworkManager + { + private TcpClient? _client; + private NetworkStream? _stream; + private readonly Octets _receiveOctets; // Underlying buffer for receiving + private readonly OctetsStream _receiveBufferStream; // Stream wrapper (less used now) + private BaseSecurity? _inputSecurity = null; // Use abstract Security class + private BaseSecurity? _outputSecurity = null; // Use abstract Security class + private readonly object _securityLock = new object(); // Lock for setting security + private CancellationTokenSource? _cts; + private Task? _receiveTask; + private Task? _sendTask; + private readonly ConcurrentQueue _sendQueue = new ConcurrentQueue(); + private readonly object _streamLock = new object(); // Lock for stream access + + public Octets Nonce; + public int SessionId = 1; + + // Events + public event Action? ProtocolReceived; + public event Action? ErrorOccurred; + public event Action? Disconnected; + public event Action? Connected; + + public bool IsConnected => _client?.Connected ?? false; + private static IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(NetworkManager)); + + public int IgnoreBytes = 0; + + public NetworkManager() + { + // Removed TcpClient initialization here, do it in ConnectAsync + _receiveOctets = new Octets(8192); // Initial buffer size + _receiveBufferStream = new OctetsStream(_receiveOctets); // Keep for reference maybe? + // Initialize security using the factory + _inputSecurity = BaseSecurity.Create(SecurityType.NULLSECURITY); + _outputSecurity = BaseSecurity.Create(SecurityType.NULLSECURITY); + } + + public void SetLogPath(string path) + { + _logger = LoggerFactory.GetCustomLogger(path, nameof(NetworkManager) + GetHashCode(), LoggerType.File); + } + + public async Task ConnectAsync(string host, int port) + { + if (IsConnected) + { + _logger.Log(LogType.Info, "Already connected."); + return; + } + + _client = new TcpClient { NoDelay = true }; + _cts = new CancellationTokenSource(); + try + { + _logger.Log(LogType.Info, $"Connecting to {host}:{port}..."); + await _client.ConnectAsync(host, port); + _stream = _client.GetStream(); + + // Reset security layers on new connection + lock (_securityLock) + { + _inputSecurity = BaseSecurity.Create(SecurityType.NULLSECURITY); + _outputSecurity = BaseSecurity.Create(SecurityType.NULLSECURITY); + } + _logger.Log(LogType.Info, "Connected."); + OnConnected(); + + _receiveTask = Task.Run(() => ProcessReceivedData(_cts.Token), _cts.Token); + _sendTask = Task.Run(() => ProcessSendQueue(_cts.Token), _cts.Token); + } + catch (Exception ex) + { + _logger.Log(LogType.Error, $"Connection failed: {ex.Message}"); + OnErrorOccurred($"Connection failed: {ex.Message}"); + _client?.Dispose(); + _client = null; + _cts?.Dispose(); + _cts = null; + } + } + + public void Disconnect() + { + _logger.Log(LogType.Info, "Try To Disconnecting..."); + if (!IsConnected && _client == null) + { + _logger.Log(LogType.Info, "Already disconnected."); + return; + } + _logger.Log(LogType.Info, "Disconnecting..."); + + _cts?.Cancel(); // Signal tasks to stop + + // Wait briefly for tasks to acknowledge cancellation + // Task.WhenAll(_receiveTask ?? Task.CompletedTask, _sendTask ?? Task.CompletedTask).Wait(500); + + lock (_streamLock) + { + _stream?.Close(); + _stream = null; + } + _client?.Close(); + _client = null; + + // Clean up CTS after tasks are signaled/stopped + _cts?.Dispose(); + _cts = null; + + // Clear the send queue + while (_sendQueue.TryDequeue(out _)) { } + + // Reset buffer length + _receiveOctets.SetSize(0); + _receiveBufferStream.Position = 0; + + _logger.Log(LogType.Info, "Disconnected."); + OnDisconnected(); + } + + // Updated SetSecurity method + public void SetSecurity(BaseSecurity outputSecurity, BaseSecurity inputSecurity) + { + lock (_securityLock) + { + _logger.Log(LogType.Info, + $"Setting Output Security: {outputSecurity?.GetType()?.Name ?? "None"}" + ); + _outputSecurity = outputSecurity ?? BaseSecurity.Create(SecurityType.NULLSECURITY); + _logger.Log(LogType.Info, + $"Setting Input Security: {inputSecurity?.GetType()?.Name ?? "None"}" + ); + _inputSecurity = inputSecurity ?? BaseSecurity.Create(SecurityType.NULLSECURITY); + _logger.Log(LogType.Info, "Security layers activated."); + } + } + + // Enqueue protocol to be sent + public void Send(Protocol protocol) + { + if (!IsConnected) + { + _logger.Log(LogType.Info, "Cannot queue send: Not connected."); + OnErrorOccurred("Cannot queue send: Not connected."); + return; + } + _sendQueue.Enqueue(protocol); + } + + // Internal task to process the send queue + private async Task ProcessSendQueue(CancellationToken token) + { + while (!token.IsCancellationRequested) + { + if (_sendQueue.TryDequeue(out Protocol? protocol)) + { + NetworkStream? stream = null; + BaseSecurity? currentOsec = null; + + lock (_streamLock) + { + stream = _stream; + } + lock (_securityLock) + { + currentOsec = _outputSecurity; + } + + if (stream == null || !IsConnected) + { + _logger.Log(LogType.Info, + $"Send failed: Stream null or disconnected. Re-queueing {protocol.GetType().Name}?" + ); + // Potentially re-queue or drop? + // _sendQueue.Enqueue(protocol); + await Task.Delay(100, token); // Avoid tight loop on disconnect + continue; + } + + try + { + var dataToSend = protocol.Encode(); + var processedData = dataToSend; + + // Apply Output Security (if active and not Null) + if (currentOsec != null && currentOsec.GetType() != typeof(NullSecurity)) + { + try + { + + processedData = currentOsec.Update(dataToSend); + + // _logger.Log(LogType.Info, $"Output security applied. Original size: {dataToSend.Length}, Processed size: {processedData.Length}"); + } + catch (Exception ex) + { + _logger.Log(LogType.Info, + $"Output security update error: {ex.Message}" + ); + ErrorOccurred?.Invoke($"Output security error: {ex.Message}"); + continue; // Skip sending this protocol + } + } + + // Send the (potentially) processed data + await stream.WriteAsync(processedData, 0, processedData.Length, token); + // _logger.Log(LogType.Info, $"Sent {protocol.GetType().Name} ({processedData.Length} bytes)"); + } + catch (IOException ex) when (ex.InnerException is SocketException se) + { + _logger.Log(LogType.Info, + $"SocketException during send: {se.SocketErrorCode} - {se.Message}" + ); + OnErrorOccurred($"Send error: {se.Message}"); + Disconnect(); // Disconnect on send error + break; // Exit send loop + } + catch (ObjectDisposedException) + { + _logger.Log(LogType.Info, "Send failed: Stream disposed."); + OnErrorOccurred("Send failed: Stream disposed."); + Disconnect(); + break; + } + catch (Exception ex) + { + _logger.Log(LogType.Info, + $"Error sending protocol {protocol.GetType().Name}: {ex.Message}" + ); + OnErrorOccurred($"Send error: {ex.Message}"); + Disconnect(); // Disconnect on generic send error too? + break; + } + } + else + { + // Queue is empty, wait a bit + await Task.Delay(10, token); + } + } + _logger.Log(LogType.Info, "Send loop finished."); + } + + // Internal task to read from network and process data + private async Task ProcessReceivedData(CancellationToken token) + { + int currentBufferLength = _receiveOctets.Length; // Start with any residual data + NetworkStream? stream = null; + + try + { + while (!token.IsCancellationRequested) + { + lock (_streamLock) + { + stream = _stream; + } + if (stream == null || !IsConnected) + { + // Stream closed or disconnected, exit loop + _logger.Log(LogType.Info, + "Receive loop exiting: Stream null or disconnected." + ); + break; + } + + // Ensure buffer has space. + if (currentBufferLength >= _receiveOctets.Capacity) + { + // Resize if needed (Consider a max size limit) + int newCapacity = _receiveOctets.Capacity * 2; + if (newCapacity > 1024 * 1024) + { // Example Limit: 1MB + throw new InvalidOperationException( + "Receive buffer exceeded max size limit." + ); + } + _receiveOctets.Reserve(newCapacity); + _logger.Log(LogType.Info, + $"Receive buffer resized to {_receiveOctets.Capacity}" + ); + } + + int bytesRead = 0; + try + { + if (token.IsCancellationRequested) break; + bytesRead = await stream.ReadAsync( + _receiveOctets.RawBuffer, + currentBufferLength, + _receiveOctets.Capacity - currentBufferLength, + token + ); + } + catch (IOException ex) + when (ex.InnerException is SocketException se + && ( + se.SocketErrorCode == SocketError.ConnectionReset + || se.SocketErrorCode == SocketError.ConnectionAborted + ) + ) + { + _logger.Log(LogType.Info, "Connection reset/aborted during read."); + break; // Exit loop gracefully + } + catch (ObjectDisposedException) + { + _logger.Log(LogType.Info, + "Receive failed: Stream disposed during read." + ); + break; // Exit loop + } + + if (bytesRead == 0) + { + var checkConnection = _client?.Client.Poll(0, SelectMode.SelectRead); + // Connection closed gracefully by the server + _logger.Log(LogType.Info, $"Read ZERO Byte (0 bytes read). Buffer Length:{currentBufferLength} -- Capacity:{_receiveOctets.Capacity} -- Token: {token.GetHashCode()} -- Connection:{checkConnection}"); + break; + } + + currentBufferLength += bytesRead; + _receiveOctets.SetSize(currentBufferLength); + + _logger.Log(LogType.Info, $"Process Buffer:: Read {bytesRead} bytes -- Token: {token.GetHashCode()}"); + // Process the data currently in the buffer + ProcessBuffer(); + + // After processing, the buffer might have been compacted, update length + currentBufferLength = _receiveOctets.Length; + } + } + catch (OperationCanceledException) + { + _logger.Log(LogType.Info, "Receive loop cancelled."); + } + catch (Exception ex) + { + _logger.Log(LogType.Info, + $"Unexpected error in receive loop: {ex.GetType().Name} - {ex.Message} {ex.StackTrace}" + ); + OnErrorOccurred($"Receive loop error: {ex.Message}"); + } + finally + { + _logger.Log(LogType.Info, "Receive loop finished."); + Disconnect(); // Ensure disconnection on loop exit + } + } + + // *** Refactored ProcessBuffer *** + private void ProcessBuffer() + { + BaseSecurity? currentIsec = null; + lock (_securityLock) + { + currentIsec = _inputSecurity; + } + + bool securityApplied = + currentIsec != null && currentIsec.GetType() != typeof(NullSecurity); + Octets dataToProcess; // This will hold the data block we decode from + int originalBlockLength = _receiveOctets.Length; // Length before security + int bytesConsumedFromOriginal = 0; // How many bytes of _receiveOctets are processed + + // 1. Apply Input Security (if active) + if (securityApplied) + { + try + { + // Create a temporary Octets with the current buffer content + Octets currentData = new Octets( + _receiveOctets.RawBuffer, + 0, + originalBlockLength + ); + // Update returns a NEW Octets object with processed data + dataToProcess = currentIsec!.Update(currentData); + // _logger.Log(LogType.Info, $"Input security applied. Original size: {originalBlockLength}, Processed size: {dataToProcess.Length}"); + } + catch (Exception ex) + { + _logger.Log(LogType.Info, + $"Input security update error: {ex.Message} - Clearing receive buffer." + ); + OnErrorOccurred($"Input security error: {ex.Message}"); + _receiveOctets.SetSize(0); + return; + } + } + else + { + // No security, process directly from the receive buffer + dataToProcess = _receiveOctets; + } + + // 2. Process Protocols from 'dataToProcess' + OctetsStream processingStream = new OctetsStream(dataToProcess); + bool processedAnyProtocols = false; + int totalConsumedFromProcessedStream = 0; // Track total bytes consumed *from the processed stream* + + while (processingStream.Position < dataToProcess.Length) + { + int streamPosBeforeDecode = processingStream.Position; + var (p, consumedBytes) = (null as Protocol, 0); + + try + { + (p, consumedBytes) = Protocol.Decode(processingStream, IgnoreBytes); // Decode returns protocol and bytes consumed + } + catch (Exception e) + { + _logger.Log(LogType.Info, + $"Protocol Decode Exception: {e.GetType().Name} - {e.Message} at stream pos {streamPosBeforeDecode}/{dataToProcess.Length}. Discarding original block." + ); + OnErrorOccurred($"Protocol decode exception: {e.GetType().Name} - {e.Message}"); + bytesConsumedFromOriginal = originalBlockLength; // Discard the whole original block on decode error + goto EndProcessing; // Use goto to jump to buffer compacting + } + + // Check consumed bytes: If 0, it means Decode couldn't read a complete message (e.g. insufficient data) + if (consumedBytes == 0) + { + // No full protocol read, break and wait for more data + processingStream.Position = streamPosBeforeDecode; // Reset position to before the failed Decode attempt + break; + } + + // If we reach here, consumedBytes > 0 + totalConsumedFromProcessedStream += consumedBytes; + processedAnyProtocols = true; // Mark that we successfully processed/consumed something + + if (p != null) + { + // Successfully decoded a protocol + // _logger.Log(LogType.Info, $"Decoded: {p.GetType().Name}, consumed {consumedBytes} bytes (processed stream)"); + ProtocolReceived?.Invoke(p); // Fire event + } + // else: p is null, but consumedBytes > 0. This means a type 0 protocol was consumed successfully. + // No action needed other than advancing the stream, which Decode already did. + + } + + // 3. Determine how many bytes of the ORIGINAL buffer were consumed + if (securityApplied) + { + // If security was applied and we processed/consumed *any* bytes from the processed stream, + // assume the whole original block was consumed. + bytesConsumedFromOriginal = processedAnyProtocols ? originalBlockLength : 0; + } + else + { + // No security was applied, bytes consumed is simply the final position in the stream + // after successful decodes/consumptions. + bytesConsumedFromOriginal = processingStream.Position; // Use final stream position + } + + EndProcessing: + // 4. Compact the *original* _receiveOctets buffer + CompactOriginalBuffer(bytesConsumedFromOriginal, originalBlockLength); + } + + // *** Helper to compact the original receive buffer *** + private void CompactOriginalBuffer(int bytesToConsume, int originalLength) + { + if (bytesToConsume <= 0 || _receiveOctets == null) // Add null check + { + return; // Nothing to consume/compact + } + + bytesToConsume = Math.Min(bytesToConsume, originalLength); // Cannot consume more than available + + if (bytesToConsume < originalLength) + { + // Move remaining data to the beginning + int remaining = originalLength - bytesToConsume; + // _logger.Log(LogType.Info, $"Compacting original buffer: Consumed {bytesToConsume}, Moving {remaining} bytes from pos {bytesToConsume}"); + Buffer.BlockCopy( + _receiveOctets.RawBuffer, + bytesToConsume, + _receiveOctets.RawBuffer, + 0, + remaining + ); + _receiveOctets.SetSize(remaining); + } + else // Consumed all + { + // All data processed or skipped, clear buffer + // _logger.Log(LogType.Info, $"Clearing original buffer: Consumed {bytesToConsume} >= Original {originalLength}"); + _receiveOctets.SetSize(0); + } + _receiveBufferStream.Position = _receiveOctets.Length; // Reset stream pos just in case + } + + // Helper to raise ErrorOccurred event + private void OnErrorOccurred(string message) + { + ErrorOccurred?.Invoke(message); + } + + // Helper to raise Disconnected event + private void OnDisconnected() + { + Disconnected?.Invoke(); + } + + // Helper to raise Connected event + private void OnConnected() + { + Connected?.Invoke(); + } + + public void Dispose() + { + _client?.Close(); + _client?.Dispose(); + _client = null; + _cts?.Dispose(); + _cts = null; + } + + public void SetNonce(Octets response_data) + { + Nonce = response_data; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs.meta new file mode 100644 index 0000000000..0dccd7328a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/NetworkManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 67c9fc10cf3944daba94a4fa2ce72cef \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs new file mode 100644 index 0000000000..bf1ebb0052 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs @@ -0,0 +1,133 @@ +using System; +namespace CSNetwork +{ + public class Octets : IDisposable + { + private byte[] _buffer; + private int _size; + private int _capacity; + + public int Size => _size; + public int Capacity => _capacity; + public int Length => _size; + + public Octets(int capacity = 0) + { + _capacity = capacity; + _buffer = new byte[capacity]; + _size = 0; + } + + public Octets(byte[] data) + { + if (data == null) + { + throw new ArgumentNullException(nameof(data), "Input byte array cannot be null."); + } + _capacity = data.Length; + _buffer = new byte[_capacity]; + Buffer.BlockCopy(data, 0, _buffer, 0, data.Length); + _size = data.Length; + } + + public Octets(byte[] data, int capacity) + { + _capacity = capacity; + _buffer = new byte[_capacity]; + Buffer.BlockCopy(data, 0, _buffer, 0, capacity); + _size = capacity; + } + + /// + /// Creates an Octets instance by copying a slice from a source buffer. + /// + /// The buffer to copy from. + /// The starting position in the source buffer. + /// The number of bytes to copy. + public Octets(byte[] sourceBuffer, int offset, int length) + { + if (sourceBuffer == null) + throw new ArgumentNullException(nameof(sourceBuffer)); + if (offset < 0 || length < 0 || offset + length > sourceBuffer.Length) + throw new ArgumentOutOfRangeException("Invalid offset or length for source buffer."); + + _capacity = length; + _buffer = new byte[_capacity]; + Buffer.BlockCopy(sourceBuffer, offset, _buffer, 0, length); + _size = length; + } + + public void Reserve(int newCapacity) + { + if (newCapacity <= _capacity) + return; + Array.Resize(ref _buffer, newCapacity); + _capacity = newCapacity; + } + + /// + /// Sets the logical size of the data within the buffer. + /// Throws ArgumentOutOfRangeException if newSize is negative or exceeds capacity. + /// + /// The new logical size. + public void SetSize(int newSize) + { + if (newSize < 0 || newSize > _capacity) + { + throw new ArgumentOutOfRangeException(nameof(newSize), $"newSize must be between 0 and capacity ({_capacity})."); + } + _size = newSize; + } + + public void Replace(byte[] data) + { + Reserve(data.Length); + Buffer.BlockCopy(data, 0, _buffer, 0, data.Length); + _size = data.Length; + } + + public void Insert(int pos, byte[] data) + { + if (data.Length == 0) + return; + + int newSize = _size + data.Length; + Reserve(newSize); + + // Shift existing data + Array.Copy(_buffer, pos, _buffer, pos + data.Length, _size - pos); + + // Insert new data + Buffer.BlockCopy(data, 0, _buffer, pos, data.Length); + _size = newSize; + } + + public void Erase(int pos, int length) + { + if (length == 0) + return; + + // Shift remaining data + Array.Copy(_buffer, pos + length, _buffer, pos, _size - (pos + length)); + _size -= length; + } + + public byte[] ToArray() => _buffer[.._size]; + + public byte[] ByteArray => ToArray(); + public byte[] RawBuffer => _buffer; + + public void Dispose() => _buffer = null; + + public override string ToString() + { + return BitConverter.ToString(_buffer, 0, _size).Replace("-", " "); + } + + internal void Resize(int newSize) + { + Reserve(newSize); + SetSize(newSize); + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs.meta new file mode 100644 index 0000000000..a53973194c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Octets.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eebdce8bdef53410c807e6b624043f72 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs new file mode 100644 index 0000000000..017e42df57 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs @@ -0,0 +1,447 @@ +using CSNetwork.Protocols; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +// using System.Reflection.PortableExecutable; +using System.Text; +using static CSNetwork.Protocols.selectrole; + +namespace CSNetwork +{ + public class OctetsStream : IDisposable + { + private Octets _octets; + private int _position; + private static readonly Encoding GbkEncoding = Encoding.GetEncoding(936); + private const int MaxSpare = 16384; + private int _transactionPosition; + + public enum Transaction + { + Begin, + Commit, + Rollback + } + + public int Length => _octets.Length; + + // Position within the stream for reading/writing + public int Position + { + get => _position; + set + { + // Basic bounds check, could be more robust + if (value < 0 || value > _octets.Length) + throw new ArgumentOutOfRangeException(nameof(value), "Position is outside the bounds of the stream."); + _position = value; + } + } + + // Access to the underlying Octets object + public Octets UnderlyingOctets => _octets; + + // Access to the raw buffer for in-place operations (like ISecurity.Update) + public byte[] RawBuffer => _octets.RawBuffer; + + public bool IsEof => _position >= _octets.Length; + + public OctetsStream(Octets octets = null) + { + _octets = octets ?? new Octets(); + _position = 0; + } + + // Helper methods for big-endian conversion + private byte[] GetBigEndianBytes(ushort value) + { + if (BitConverter.IsLittleEndian) + { + return new[] { (byte)(value >> 8), (byte)value }; + } + return BitConverter.GetBytes(value); + } + + private byte[] GetBigEndianBytes(uint value) + { + if (BitConverter.IsLittleEndian) + { + return new[] + { + (byte)(value >> 24), + (byte)(value >> 16), + (byte)(value >> 8), + (byte)value + }; + } + return BitConverter.GetBytes(value); + } + + // Primitive type support + public void Write(byte value) => _octets.Insert(_position++, new[] { value }); + + public void Write(short value) + { + var bytes = GetBigEndianBytes((ushort)value); + _octets.Insert(_position, bytes); + _position += 2; + } + + public void Write(ushort value) + { + var bytes = GetBigEndianBytes(value); + _octets.Insert(_position, bytes); + _position += 2; + } + + public void Write(int value) + { + var bytes = GetBigEndianBytes((uint)value); + _octets.Insert(_position, bytes); + _position += 4; + } + + public void Write(uint value) + { + var bytes = GetBigEndianBytes(value); + _octets.Insert(_position, bytes); + _position += 4; + } + + public void Write(float value) + { + var bytes = BitConverter.GetBytes(value); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + _octets.Insert(_position, bytes); + _position += 4; + } + + public void Write(double value) + { + var bytes = BitConverter.GetBytes(value); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + _octets.Insert(_position, bytes); + _position += 8; + } + + // Read methods for primitive types + public byte ReadByte() + { + if (_position + 1 > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + return ReadBytes(1)[0]; + } + + public short ReadInt16() + { + if (_position + 2 > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + var bytes = ReadBytes(2); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + return BitConverter.ToInt16(bytes, 0); + } + + public ushort ReadUInt16() + { + if (_position + 2 > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + var bytes = ReadBytes(2); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + return BitConverter.ToUInt16(bytes, 0); + } + + public int ReadInt32() + { + if (_position + 4 > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + var bytes = ReadBytes(4); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + return BitConverter.ToInt32(bytes, 0); + } + + public uint ReadUInt32() + { + if (_position + 4 > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + var bytes = ReadBytes(4); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + return BitConverter.ToUInt32(bytes, 0); + } + + public float ReadFloat() + { + if (_position + 4 > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + var bytes = ReadBytes(4); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + return BitConverter.ToSingle(bytes, 0); + } + + public double ReadDouble() + { + if (_position + 8 > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + var bytes = ReadBytes(8); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + return BitConverter.ToDouble(bytes, 0); + } + + // Compact integer support + public void WriteCompactInt(int value) + { + if (value >= 0) + { + WriteCompactUInt((uint)value); + } + else + { + uint unsignedValue = (uint)(-value); + unsignedValue = (unsignedValue << 1) | 1; + WriteCompactUInt(unsignedValue); + } + } + + public int ReadCompactInt() + { + uint value = ReadCompactUInt(); + if ((value & 1) == 0) + return (int)(value >> 1); + else + return -(int)(value >> 1); + } + + // Transaction support + public void HandleTransaction(Transaction trans) + { + switch (trans) + { + case Transaction.Begin: + _transactionPosition = _position; + break; + case Transaction.Rollback: + _position = _transactionPosition; + break; + case Transaction.Commit: + if (_position >= MaxSpare) + { + // Optimize memory usage + var newOctets = new byte[_octets.Length - _position]; + Array.Copy(_octets.ToArray(), _position, newOctets, 0, newOctets.Length); + _octets.Dispose(); + _octets = new Octets(newOctets.Length); + _position = 0; + } + break; + } + } + + // Container support + public void WriteList(IList list) + where T : IMarshallable + { + WriteCompactUInt((uint)list.Count); + foreach (var item in list) + { + item.Marshal(this); + } + } + + public void ReadList(IList list) + where T : IMarshallable, new() + { + uint count = ReadCompactUInt(); + for (int i = 0; i < count; i++) + { + var item = new T(); + item.Unmarshal(this); + list.Add(item); + } + } + + public void WriteCompactUInt(uint value) + { + if (value < 0x80) + { + _octets.Insert(_position, new[] { (byte)value }); + _position++; + } + else if (value < 0x4000) + { + var bytes = GetBigEndianBytes((ushort)(value | 0x8000)); + _octets.Insert(_position, bytes); + _position += 2; + } + else if (value < 0x20000000) + { + var bytes = GetBigEndianBytes(value | 0xc0000000); + _octets.Insert(_position, bytes); + _position += 4; + } + else + { + _octets.Insert(_position, new[] { (byte)0xe0 }); + _octets.Insert(_position + 1, GetBigEndianBytes(value)); + _position += 5; + } + } + + public void GetFirstBytes() + { + IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(Protocol)); + var tempBytes = ReadByteWithoutAdvancePos(41); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 41; i++) + { + sb.Append(tempBytes[i]); + sb.Append(' '); + } + _logger.Debug($"Try Decode: Protocol 10 first bytes : {sb}"); + } + + public uint ReadCompactUInt() + { + byte flag = ReadBytes(1)[0]; + IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(Protocol)); + if ((flag & 0xE0) == 0xE0) + { + var bytes = ReadBytes(4); + return BitConverter.IsLittleEndian + ? ((uint)bytes[0] << 24) + | ((uint)bytes[1] << 16) + | ((uint)bytes[2] << 8) + | bytes[3] + : BitConverter.ToUInt32(bytes, 0); + } + else if ((flag & 0xE0) == 0xC0) + { + var bytes = ReadBytes(3); + uint value = 0; + if (BitConverter.IsLittleEndian) + { + value = ((uint)bytes[0] << 16) | ((uint)bytes[1] << 8) | bytes[2]; + } + else + { + value = BitConverter.ToUInt32(bytes, 0); + } + + return (value | ((uint)flag << 24)) & ~0xC0000000; + } + else if ((flag & 0xE0) == 0x80 || (flag & 0xE0) == 0xA0) + { + var bytes = ReadBytes(1); + return (uint)((bytes[0] | (flag << 8)) & ~0x8000); + } + return flag; + } + + + public void WriteString(string value) + { + var bytes = GbkEncoding.GetBytes(value); + WriteCompactUInt((uint)bytes.Length); + _octets.Insert(_position, bytes); + _position += bytes.Length; + } + + public string ReadString() + { + uint length = ReadCompactUInt(); + var bytes = ReadBytes((int)length); + return GbkEncoding.GetString(bytes); + } + + public byte[] ReadBytes(int count) + { + if (_position + count > _octets.Length) + throw new IndexOutOfRangeException("Attempt to read beyond the end of the stream."); + var result = new byte[count]; + Array.Copy(_octets.ToArray(), _position, result, 0, count); + _position += count; + return result; + } + + public byte[] ReadByteWithoutAdvancePos(int count) + { + if (_position + count > _octets.Length) + return new byte[count]; + var result = new byte[count]; + Array.Copy(_octets.ToArray(), _position, result, 0, count); + return result; + } + + public byte[] ToArray() => _octets.ToArray(); + + public void Dispose() => _octets?.Dispose(); + + public void WriteBytes(byte[] data) + { + _octets.Insert(_position, data); + _position += data.Length; + } + + // Add these methods for Octets support + public void Write(Octets value) + { + WriteCompactUInt((uint)value.Size); + WriteBytes(value.ToArray()); + } + + public Octets ReadOctets() + { + uint size = ReadCompactUInt(); + byte[] data = ReadBytes((int)size); + return new Octets(data); + } + + public void Write(List list) + { + WriteCompactUInt((uint)list.Count); + foreach (var octets in list) + { + Write(octets); + } + } + + public List ReadOctetsList() + { + uint count = ReadCompactUInt(); + var list = new List(); + for (int i = 0; i < count; i++) + { + list.Add(ReadOctets()); + } + return list; + } + + // Erase a section of the underlying buffer + public void Erase(int pos, int length) + { + _octets.Erase(pos, length); + // Adjust position if the erasure happened before the current position + if (pos < _position) + { + _position = Math.Max(pos, _position - length); + } + } + + // Compact the stream by removing processed data (0 to Position) + public void Compact() + { + if (_position > 0) + { + _octets.Erase(0, _position); + _position = 0; // Reset position after compacting + } + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs.meta new file mode 100644 index 0000000000..7cb7baa15a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/OctetsStream.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 089ce5809f78f40c5bfaa6acfa61c49a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols.meta new file mode 100644 index 0000000000..181f60fd96 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c690c872e4183450caadd0dc34fe124e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs new file mode 100644 index 0000000000..cae89925f3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs @@ -0,0 +1,84 @@ +namespace CSNetwork.Protocols +{ + public class ACAnswer : Protocol + { + public int RoleId { get; set; } + public int QType { get; set; } + public int Seq { get; set; } + public int Reserved { get; set; } + public int Answer { get; set; } + + public ACAnswer() : base(ProtocolType.PROTOCOL_ACANSWER) { } + + public override Protocol Clone() => new ACAnswer + { + RoleId = RoleId, + QType = QType, + Seq = Seq, + Reserved = Reserved, + Answer = Answer + }; + + public override void Marshal(OctetsStream os) + { + os.Write(RoleId); + os.Write(QType); + os.Write(Seq); + os.Write(Reserved); + os.Write(Answer); + } + + public override void Unmarshal(OctetsStream os) + { + RoleId = os.ReadInt32(); + QType = os.ReadInt32(); + Seq = os.ReadInt32(); + Reserved = os.ReadInt32(); + Answer = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + public override bool SizePolicy(int size) => size <= 8192; + } + + public class AccountLoginRecord : Protocol + { + public int UserId { get; set; } + public uint LocalSid { get; set; } + public int LoginTime { get; set; } + public int LoginIp { get; set; } + public int CurrentIp { get; set; } + + public AccountLoginRecord() : base(ProtocolType.PROTOCOL_ACCOUNTLOGINRECORD) { } + + public override Protocol Clone() => new AccountLoginRecord + { + UserId = UserId, + LocalSid = LocalSid, + LoginTime = LoginTime, + LoginIp = LoginIp, + CurrentIp = CurrentIp + }; + + public override void Marshal(OctetsStream os) + { + os.Write(UserId); + os.Write(LocalSid); + os.Write(LoginTime); + os.Write(LoginIp); + os.Write(CurrentIp); + } + + public override void Unmarshal(OctetsStream os) + { + UserId = os.ReadInt32(); + LocalSid = os.ReadUInt32(); + LoginTime = os.ReadInt32(); + LoginIp = os.ReadInt32(); + CurrentIp = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs.meta new file mode 100644 index 0000000000..54276b952e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/AccountProtocols.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0d4f72ef208ce412cbb3018d9c33a431 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs new file mode 100644 index 0000000000..444a3fa6a2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs @@ -0,0 +1,78 @@ +using CSNetwork.Security; +using System; + +namespace CSNetwork.Protocols +{ + public class KeyExchange : Protocol + { + public Octets Nonce { get; set; } + public byte Blkickuser { get; set; } + + public KeyExchange() + : base(ProtocolType.PROTOCOL_KEYEXCHANGE) + { + Nonce = new Octets(); // Initialize Nonce + } + + public override Protocol Clone() => + new KeyExchange { Nonce = new Octets(Nonce.ToArray()), Blkickuser = Blkickuser }; + + public override void Marshal(OctetsStream os) + { + os.Write(Nonce); // Use Write for Octets + os.Write(Blkickuser); // Use Write for byte + } + + public override void Unmarshal(OctetsStream os) + { + Nonce = os.ReadOctets(); // Use ReadOctets + Blkickuser = os.ReadByte(); // Use ReadByte + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 32; + + public override string ToString => $"KeyExchange(Type={Type}, Nonce={BitConverter.ToString(Nonce.ByteArray)}, BlKickUser={Blkickuser})"; + + public void Setup(NetworkManager mgr, string name) + { + // Convert name to Octets + Octets identity = new Octets(System.Text.Encoding.ASCII.GetBytes(name)); + // Generate input security key with modified nonce + + + BaseSecurity oSecurity = BaseSecurity.Create(SecurityType.ARCFOURSECURITY); + oSecurity.SetParameter(GenerateKey(identity, mgr.Nonce, Nonce)); + + Octets modifiedNonce = new Octets(Nonce.ToArray()); + modifiedNonce.Resize(16); + BaseSecurity iSecurity = BaseSecurity.Create(SecurityType.DECOMPRESSARCFOURSECURITY); + iSecurity.SetParameter(GenerateKey(identity, mgr.Nonce, modifiedNonce)); + + mgr.SetSecurity(oSecurity, iSecurity); + } + + private Octets GenerateKey(Octets identity, Octets password, Octets nonce) + { + // Create HMAC-MD5 hash using the ported class + var hmac = new Security.HMAC_MD5Hash(); // Use the ported class + + // Set the key + hmac.SetParameter(identity); // Use SetParameter + + // Update with identity + hmac.Update(password); // Use Update + + // Update with nonce + hmac.Update(nonce); // Use Update + + // Finalize hash + Octets result = new Octets(); + hmac.Final(result); // Use Final, passing an Octets object + + + return result; // Return the result Octets + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs.meta new file mode 100644 index 0000000000..19156243fc --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/KeyExchange.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9632cdb20632a4880b32b28d56c888ed \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs new file mode 100644 index 0000000000..4b9e2b4607 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace CSNetwork.Protocols +{ + public abstract class Protocol + { + private static readonly IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(Protocol)); + public uint Type { get; protected set; } + public ProtocolType GetPType() => (ProtocolType)Type; + private static readonly Dictionary _protocolMap = new Dictionary(); + + protected Protocol(ProtocolType type) => Type = (uint)type; + + public static void Register(uint type) + where T : Protocol, new() => _protocolMap[type] = typeof(T); + + public static void Register(Type type, uint typeId) => _protocolMap[typeId] = type; + + public static Protocol? Create(uint type) => + _protocolMap.TryGetValue(type, out var t) + ? (Protocol?)Activator.CreateInstance(t) + : null; + + public virtual void Process(Manager mgr, uint sid) { } + + public virtual void Notify(Manager mgr, uint sid) + { + mgr.OnRecvProtocol(sid, this); + } + + public abstract Protocol Clone(); + + public virtual void Destroy() { } + + public virtual int PriorPolicy() => 0; + + public virtual bool SizePolicy(int size) => true; + + public abstract void Marshal(OctetsStream os); + public abstract void Unmarshal(OctetsStream os); + + public byte[] Encode() + { + using var os = new OctetsStream(); + os.WriteCompactUInt(Type); + var dataStream = new OctetsStream(); + Marshal(dataStream); + os.WriteCompactUInt((uint)dataStream.Length); + os.WriteBytes(dataStream.ToArray()); + return os.ToArray(); + } + + /// + /// Decodes a protocol from the stream. + /// + /// The stream to decode from. + /// A tuple containing the decoded protocol (or null if decoding failed or no complete protocol was found) + /// and the number of bytes consumed from the stream during this attempt. + public static (Protocol? protocol, int consumedBytes) Decode(OctetsStream stream, int ignoreBytes = 0) + { + if (stream.IsEof) // Check if stream is already at end + return (null, 0); + + int initialPosition = stream.Position; // Store initial position for rollback + + try + { + //stream.HandleTransaction(OctetsStream.Transaction.Begin); + //stream.GetFirstBytes(); + uint type = stream.ReadCompactUInt(); + uint size = stream.ReadCompactUInt(); + int positionAfterHeader = stream.Position; // Position after reading type and size + int headerSize = positionAfterHeader - initialPosition; + + _logger.Debug($"Try Decode: Protocol({type}) {(ProtocolType)type} - size {size}. Stream Pos: {initialPosition}, After Header: {positionAfterHeader}, Stream Length: {stream.Length}"); + + // Check if enough data is available in the stream for the declared payload size + int bytesAvailableForPayload = stream.Length - positionAfterHeader; + if (bytesAvailableForPayload < size) + { + _logger.Debug($"Decode failed: Insufficient data. Need {size} payload bytes, have {bytesAvailableForPayload}. Rolling back."); + stream.HandleTransaction(OctetsStream.Transaction.Rollback); + stream.Position = initialPosition; // Explicitly reset position on insufficient data rollback + return (null, 0); // Not enough data yet, consumed 0 bytes effectively + } + + + if (type == 0) + { + _logger.Info($"Ignoring and consuming type 0 protocol with size {size}."); + // Consume the specified number of bytes from the stream + int bytesToConsume = (int)size; + return (null, stream.Position - initialPosition); + int finalPosition; + if (stream.Position + bytesToConsume <= stream.Length) + { + stream.Position += bytesToConsume; // Advance position + finalPosition = stream.Position; + stream.HandleTransaction(OctetsStream.Transaction.Commit); // Commit the consumption + return (null, finalPosition - initialPosition); // Consumed header + payload + } + else + { + // This case should theoretically not happen if the initial size check passed, + // but handle defensively. Rollback as we couldn't consume fully. + _logger.Warning($"Decode inconsistency: Not enough data to consume type 0 protocol ({bytesToConsume} bytes needed). Rolling back."); + stream.HandleTransaction(OctetsStream.Transaction.Rollback); + stream.Position = initialPosition; // Reset position + return (null, 0); // Consumed 0 bytes effectively due to rollback + } + } + + if (!ValidateProtocol(type, size)) // Keep existing max size validation + { + _logger.Debug($"Decode failed: ValidateProtocol failed for type {type}, size {size}. Rolling back."); + stream.HandleTransaction(OctetsStream.Transaction.Rollback); + stream.Position = initialPosition; // Reset position + return (null, 0); // Consumed 0 bytes effectively + } + + var protocol = Create(type); + if (protocol != null) + { + // Important: Unmarshal should only read 'size' bytes. + // Verify if Unmarshal consumed exactly 'size' bytes. + int positionBeforeUnmarshal = stream.Position; + protocol.Unmarshal(stream); + int positionAfterUnmarshal = stream.Position; + int bytesConsumedByUnmarshal = positionAfterUnmarshal - positionBeforeUnmarshal; + + if (bytesConsumedByUnmarshal != size) + { + _logger.Warning($"Decode Warning: Protocol type {type} Unmarshal consumed {bytesConsumedByUnmarshal} bytes, but header specified size {size}. Committing anyway, but this might indicate an issue."); + // Decide if this should be a hard error (rollback) or just a warning. + // Sticking with commit for now, assuming the unmarshal logic knows best, + // but the discrepancy is logged. + } + + stream.HandleTransaction(OctetsStream.Transaction.Commit); + return (protocol, positionAfterUnmarshal - initialPosition); // Consumed header + payload + } + else + { + // Failed to create protocol instance (unknown type?) + _logger.Warning($"Decode failed: Could not create protocol instance for type {type}. Rolling back."); + stream.HandleTransaction(OctetsStream.Transaction.Rollback); + stream.Position = initialPosition; // Reset position + return (null, 0); // Consumed 0 bytes effectively + } + } + catch (Exception ex) // Catch potential exceptions during read/unmarshal + { + _logger.Error($"Decode exception: {ex.Message} at position {stream.Position}. Rolling back. Stack Trace: {ex.StackTrace}"); + stream.HandleTransaction(OctetsStream.Transaction.Rollback); + stream.Position = initialPosition; // Reset position on error + return (null, 0); // Consumed 0 bytes effectively + } + } + + private static bool ValidateProtocol(uint type, uint size) + { + var stub = _protocolMap.GetValueOrDefault(type); + return stub != null && size <= MaxProtocolSize; + } + + private const int MaxProtocolSize = 16 * 1024 * 1024; // 16MB max size + + public virtual string ToString => $"Protocol Type: {Type}"; + } + + // Add interface for marshallable objects + public interface IMarshallable + { + void Marshal(OctetsStream os); + void Unmarshal(OctetsStream os); + } + + + public class ProtocolFactory + { + public static void RegisterAllProtocols() + { + // Get all types that inherit from Protocol + var protocolTypes = Assembly + .GetExecutingAssembly() + .GetTypes() + .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(Protocol))); + + int count = 0; + foreach (var type in protocolTypes) + { + // Get the protocol type from the constructor + var constructor = type.GetConstructor(Type.EmptyTypes); + if (constructor != null) + { + // Create an instance to get its type + var instance = (Protocol)Activator.CreateInstance(type); + // Call the generic Register method with the correct type and protocol type ID + Protocol.Register(type, instance.Type); + count++; + } + } + + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs.meta new file mode 100644 index 0000000000..b63c575bd2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/Protocol.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6a01ed16b76194f4fa172f138209073f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs new file mode 100644 index 0000000000..87f334c427 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs @@ -0,0 +1,889 @@ +namespace CSNetwork.Protocols +{ + public enum CallID + { + // Rpc for Game + RPC_TRADESTARTRQST = 4003, + RPC_ADDFRIENDRQST = 204, + + // Rpc for QQ + RPC_GAMEZONELIST = 1001, + RPC_ROLEALLLIST = 1004, + RPC_FRIENDALLLIST = 1006, + RPC_USERGETINFO = 1009, + RPC_USERSETINFO = 1010, + RPC_GROUPGETINFO = 1011, + RPC_GROUPSETINFO = 1012, + RPC_FRIENDDEL = 1016, + RPC_FRIENDMOVE = 1017, + RPC_MSGRETRIEVEOFFLINE = 1021, + RPC_FINDROLEBYNAME = 1022, + RPC_QQADDFRIENDRQST = 14, + RPC_FINDROLE = 1024, + RPC_FACTIONINVITEJOIN = 4813, + RPC_PLAYERPOSITIONRESETRQST = 155, + }; + + public enum ProtocolType + { + PROTOCOL_ACACCUSE = 5055, + PROTOCOL_ACACCUSERE = 5056, + PROTOCOL_ACANSWER = 5032, + PROTOCOL_ACBRIEFINFO = 5018, + PROTOCOL_ACCHEATERS = 5013, + PROTOCOL_ACCONNECTRE = 5004, + PROTOCOL_ACCOUNTINGREQUEST = 503, + PROTOCOL_ACCOUNTINGRESPONSE = 504, + PROTOCOL_ACCOUNTLOGINRECORD = 143, + PROTOCOL_ACFORBIDCHEATER = 8008, + PROTOCOL_ACFORBIDPROCESS = 5015, + PROTOCOL_ACKICKOUTUSER = 5035, + PROTOCOL_ACPERIODINFO = 5019, + PROTOCOL_ACPROTOSTAT = 5024, + PROTOCOL_ACQCODERES = 5012, + PROTOCOL_ACQLOGINFO = 5008, + PROTOCOL_ACQMOUSEINFO = 5022, + PROTOCOL_ACQPATTERNS = 5014, + PROTOCOL_ACQPLATFORMINFO = 5016, + PROTOCOL_ACQPROTOCOLSTATS = 5025, + PROTOCOL_ACQSTROWNER = 5021, + PROTOCOL_ACQTHREADTIMES = 5023, + PROTOCOL_ACQUERY = 5007, + PROTOCOL_ACQUESTION = 5031, + PROTOCOL_ACQUSERONLINE = 5009, + PROTOCOL_ACQUSERSTRS = 5010, + PROTOCOL_ACRELOADCONFIG = 5005, + PROTOCOL_ACRELOADCONFIGRE = 5006, + PROTOCOL_ACREMOTECODE = 5003, + PROTOCOL_ACREMOTEEXE = 5027, + PROTOCOL_ACREMOTEEXERE = 5028, + PROTOCOL_ACREPORT = 5001, + PROTOCOL_ACREPORTCHEATER = 5029, + PROTOCOL_ACSENDCODE = 5011, + PROTOCOL_ACSTATUSANNOUNCE = 5026, + PROTOCOL_ACSTATUSANNOUNCE2 = 5034, + PROTOCOL_ACTRIGGERQUESTION = 5030, + PROTOCOL_ACVERSION = 5020, + PROTOCOL_ACWHOAMI = 5002, + PROTOCOL_ADDCASH = 515, + PROTOCOL_ADDCASH_RE = 516, + PROTOCOL_ADDCASHNOTIFY = 142, + PROTOCOL_ADDFRIEND = 202, + PROTOCOL_ADDFRIEND_RE = 203, + PROTOCOL_ADDFRIENDREMARKS = 236, + PROTOCOL_ADDFRIENDREMARKS_RE = 237, + PROTOCOL_ADDICTIONCONTROL = 556, + PROTOCOL_ANNOUNCEAUTHDVERSION = 137, + PROTOCOL_ANNOUNCECENTRALDELIVERY = 1131, + PROTOCOL_ANNOUNCECHALLENGEALGO = 136, + PROTOCOL_ANNOUNCEFORBIDINFO = 123, + PROTOCOL_ANNOUNCEGM = 121, + PROTOCOL_ANNOUNCELINKTYPE = 372, + PROTOCOL_ANNOUNCELINKVERSION = 1130, + PROTOCOL_ANNOUNCENEWMAIL = 4201, + PROTOCOL_ANNOUNCEPROVIDERID = 73, + PROTOCOL_ANNOUNCESELLRESULT = 610, + PROTOCOL_ANNOUNCESERVERATTRIBUTE = 132, + PROTOCOL_ANNOUNCEZONEID = 505, + PROTOCOL_AU2GAME = 8038, + PROTOCOL_AUADDUPMONEYQUERY_RE = 4055, + PROTOCOL_AUCTIONATTENDLIST = 816, + PROTOCOL_AUCTIONATTENDLIST_RE = 817, + PROTOCOL_AUCTIONBID = 802, + PROTOCOL_AUCTIONBID_RE = 803, + PROTOCOL_AUCTIONCLOSE = 806, + PROTOCOL_AUCTIONCLOSE_RE = 807, + PROTOCOL_AUCTIONEXITBID = 818, + PROTOCOL_AUCTIONEXITBID_RE = 819, + PROTOCOL_AUCTIONGET = 808, + PROTOCOL_AUCTIONGET_RE = 809, + PROTOCOL_AUCTIONGETITEM = 820, + PROTOCOL_AUCTIONGETITEM_RE = 821, + PROTOCOL_AUCTIONLIST = 804, + PROTOCOL_AUCTIONLIST_RE = 805, + PROTOCOL_AUCTIONLISTUPDATE = 823, + PROTOCOL_AUCTIONLISTUPDATE_RE = 824, + PROTOCOL_AUCTIONOPEN = 800, + PROTOCOL_AUCTIONOPEN_RE = 801, + PROTOCOL_AUMAILSENDED = 235, + PROTOCOL_AUTHDVERSION = 8010, + PROTOCOL_AUTOLOCKCHANGED = 785, + PROTOCOL_AUTOLOCKSET = 782, + PROTOCOL_AUTOLOCKSET_RE = 783, + PROTOCOL_AUTOTEAMCOMPOSEFAILED = 967, + PROTOCOL_AUTOTEAMCOMPOSESTART = 966, + PROTOCOL_AUTOTEAMCONFIGREGISTER = 961, + PROTOCOL_AUTOTEAMPLAYERLEAVE = 968, + PROTOCOL_AUTOTEAMPLAYERREADY = 964, + PROTOCOL_AUTOTEAMPLAYERREADY_RE = 965, + PROTOCOL_AUTOTEAMSETGOAL = 962, + PROTOCOL_AUTOTEAMSETGOAL_RE = 963, + PROTOCOL_BATTLECHALLENGE = 852, + PROTOCOL_BATTLECHALLENGE_RE = 853, + PROTOCOL_BATTLECHALLENGEMAP = 854, + PROTOCOL_BATTLECHALLENGEMAP_RE = 855, + PROTOCOL_BATTLEENTER = 860, + PROTOCOL_BATTLEENTER_RE = 861, + PROTOCOL_BATTLEENTERNOTICE = 862, + PROTOCOL_BATTLEFACTIONNOTICE = 874, + PROTOCOL_BATTLEGETMAP = 850, + PROTOCOL_BATTLEGETMAP_RE = 851, + PROTOCOL_BATTLEMAPNOTICE = 870, + PROTOCOL_BATTLESERVERREGISTER = 856, + PROTOCOL_BATTLESTART = 857, + PROTOCOL_BATTLESTART_RE = 858, + PROTOCOL_BATTLESTATUS = 866, + PROTOCOL_BATTLESTATUS_RE = 867, + PROTOCOL_BILLINGBALANCE = 9000, + PROTOCOL_BILLINGBALANCESA = 8048, + PROTOCOL_BILLINGBALANCESA_RE = 8049, + PROTOCOL_BILLINGCANCEL = 8054, + PROTOCOL_BILLINGCONFIRM = 8052, + PROTOCOL_BILLINGCONFIRM_RE = 8053, + PROTOCOL_BILLINGREQUEST = 9001, + PROTOCOL_BUYPOINT = 607, + PROTOCOL_BUYPOINT_RE = 608, + PROTOCOL_C2SGAMEDATASEND = 75, + PROTOCOL_CANCELWAITQUEUE = 165, + PROTOCOL_CANCELWAITQUEUE_RE = 166, + PROTOCOL_CASHLOCK = 4260, + PROTOCOL_CASHLOCK_RE = 4261, + PROTOCOL_CASHMONEYEXCHANGENOTIFY = 157, + PROTOCOL_CASHPASSWORDSET = 4263, + PROTOCOL_CASHPASSWORDSET_RE = 4264, + PROTOCOL_CERTKEY = 547, + PROTOCOL_CERTREQUEST = 545, + PROTOCOL_CHALLENGE = 1, + PROTOCOL_CHANGEDS_RE = 1104, + PROTOCOL_CHATBROADCAST = 120, + PROTOCOL_CHATMESSAGE = 80, + PROTOCOL_CHATMULTICAST = 81, + PROTOCOL_CHATROOMCREATE = 219, + PROTOCOL_CHATROOMCREATE_RE = 220, + PROTOCOL_CHATROOMEXPEL = 226, + PROTOCOL_CHATROOMINVITE = 221, + PROTOCOL_CHATROOMINVITE_RE = 222, + PROTOCOL_CHATROOMJOIN = 223, + PROTOCOL_CHATROOMJOIN_RE = 224, + PROTOCOL_CHATROOMLEAVE = 225, + PROTOCOL_CHATROOMLIST = 228, + PROTOCOL_CHATROOMLIST_RE = 229, + PROTOCOL_CHATROOMSPEAK = 227, + PROTOCOL_CHATSINGLECAST = 94, + PROTOCOL_CHECKNEWMAIL = 4200, + PROTOCOL_COLLECTCLIENTMACHINEINFO = 37, + PROTOCOL_COMPLAIN2GM = 370, + PROTOCOL_COMPLAIN2GM_RE = 371, + PROTOCOL_COUNTRYBATTLEAPPLY = 4751, + PROTOCOL_COUNTRYBATTLEAPPLY_RE = 4752, + PROTOCOL_COUNTRYBATTLECONFIGNOTIFY = 4759, + PROTOCOL_COUNTRYBATTLEDESTROYINSTANCE = 4792, + PROTOCOL_COUNTRYBATTLEEND = 4766, + PROTOCOL_COUNTRYBATTLEENTER = 4765, + PROTOCOL_COUNTRYBATTLEENTERMAPNOTICE = 4757, + PROTOCOL_COUNTRYBATTLEGETBATTLELIMIT = 4784, + PROTOCOL_COUNTRYBATTLEGETBATTLELIMIT_RE = 4785, + PROTOCOL_COUNTRYBATTLEGETCONFIG = 4772, + PROTOCOL_COUNTRYBATTLEGETCONFIG_RE = 4773, + PROTOCOL_COUNTRYBATTLEGETKINGCOMMANDPOINT = 4786, + PROTOCOL_COUNTRYBATTLEGETKINGCOMMANDPOINT_RE = 4787, + PROTOCOL_COUNTRYBATTLEGETMAP = 4767, + PROTOCOL_COUNTRYBATTLEGETMAP_RE = 4768, + PROTOCOL_COUNTRYBATTLEGETPLAYERLOCATION = 4770, + PROTOCOL_COUNTRYBATTLEGETSCORE = 4774, + PROTOCOL_COUNTRYBATTLEGETSCORE_RE = 4775, + PROTOCOL_COUNTRYBATTLEJOINNOTICE = 4753, + PROTOCOL_COUNTRYBATTLEKINGASSIGNASSAULT = 4781, + PROTOCOL_COUNTRYBATTLEKINGASSIGNASSAULT_RE = 4782, + PROTOCOL_COUNTRYBATTLEKINGRESETBATTLELIMIT = 4783, + PROTOCOL_COUNTRYBATTLELEAVENOTICE = 4754, + PROTOCOL_COUNTRYBATTLEMOVE = 4760, + PROTOCOL_COUNTRYBATTLEMOVE_RE = 4761, + PROTOCOL_COUNTRYBATTLEOFFLINENOTICE = 4756, + PROTOCOL_COUNTRYBATTLEONLINENOTICE = 4755, + PROTOCOL_COUNTRYBATTLEPREENTER = 4777, + PROTOCOL_COUNTRYBATTLEPREENTERNOTIFY = 4776, + PROTOCOL_COUNTRYBATTLERESULT = 4778, + PROTOCOL_COUNTRYBATTLERETURNCAPITAL = 4779, + PROTOCOL_COUNTRYBATTLESERVERREGISTER = 4758, + PROTOCOL_COUNTRYBATTLESINGLEBATTLERESULT = 4780, + PROTOCOL_COUNTRYBATTLESTART = 4763, + PROTOCOL_COUNTRYBATTLESTART_RE = 4764, + PROTOCOL_COUNTRYBATTLESYNCPLAYERLOCATION = 4762, + PROTOCOL_COUNTRYBATTLESYNCPLAYERPOS = 4769, + PROTOCOL_CREATEFACTIONFORTRESS = 4406, + PROTOCOL_CREATEFACTIONFORTRESS_RE = 4407, + PROTOCOL_CREATEROLE = 84, + PROTOCOL_CREATEROLE_RE = 85, + PROTOCOL_DBFRIENDEXTLIST_RE = 232, + PROTOCOL_DEBUGADDCASH = 521, + PROTOCOL_DEBUGCOMMAND = 873, + PROTOCOL_DELETEMAIL = 4208, + PROTOCOL_DELETEMAIL_RE = 4209, + PROTOCOL_DELETEROLE = 86, + PROTOCOL_DELETEROLE_RE = 87, + PROTOCOL_DELFACTIONANNOUNCE = 4818, + PROTOCOL_DELFRIEND = 212, + PROTOCOL_DELFRIEND_RE = 213, + PROTOCOL_DELROLEANNOUNCE = 3029, + PROTOCOL_DISABLEAUTOLOCK = 8007, + PROTOCOL_DISCONNECTPLAYER = 106, + PROTOCOL_DISCOUNTANNOUNCE = 8064, + PROTOCOL_DOMAINCMD = 771, + PROTOCOL_DOMAINCMD_RE = 772, + PROTOCOL_DOMAINLOGIN = 700, + PROTOCOL_DOMAINVALIDATE = 770, + PROTOCOL_ENTERWORLD = 72, + PROTOCOL_ERRORINFO = 5, + PROTOCOL_EXCHANGECONSUMEPOINTS = 4954, + PROTOCOL_EXCHANGECONSUMEPOINTS_RE = 4955, + PROTOCOL_FACEMODIFY = 125, + PROTOCOL_FACEMODIFY_RE = 127, + PROTOCOL_FACEMODIFYCANCEL = 126, + PROTOCOL_FACTIONACCEPTJOIN = 4812, + PROTOCOL_FACTIONACCEPTJOIN_RE = 4505, + PROTOCOL_FACTIONALLIANCEAPPLY_RE = 4517, + PROTOCOL_FACTIONALLIANCEREPLY_RE = 4518, + PROTOCOL_FACTIONAPPLYJOIN_RE = 4504, + PROTOCOL_FACTIONAPPOINT_RE = 4510, + PROTOCOL_FACTIONBEGINSYNC = 4808, + PROTOCOL_FACTIONBEGINSYNC_RE = 4809, + PROTOCOL_FACTIONBROADCASTNOTICE_RE = 4507, + PROTOCOL_FACTIONCHANGPROCLAIM_RE = 4508, + PROTOCOL_FACTIONCHAT = 4803, + PROTOCOL_FACTIONCONGREGATEREQUEST = 4823, + PROTOCOL_FACTIONCREATE = 4501, + PROTOCOL_FACTIONCREATE_RE = 4502, + PROTOCOL_FACTIONDEGRADE_RE = 4514, + PROTOCOL_FACTIONDELAYEXPELANNOUNCE = 4526, + PROTOCOL_FACTIONDISMISS_RE = 4515, + PROTOCOL_FACTIONENDSYNC = 4810, + PROTOCOL_FACTIONEXPEL_RE = 4506, + PROTOCOL_FACTIONFORBIDUPDATE = 8167, + PROTOCOL_FACTIONFORTRESSBATTLELIST = 4419, + PROTOCOL_FACTIONFORTRESSBATTLELIST_RE = 4420, + PROTOCOL_FACTIONFORTRESSCHALLENGE = 4416, + PROTOCOL_FACTIONFORTRESSCHALLENGE_RE = 4417, + PROTOCOL_FACTIONFORTRESSENTER = 4412, + PROTOCOL_FACTIONFORTRESSENTERNOTICE = 4413, + PROTOCOL_FACTIONFORTRESSGET = 4421, + PROTOCOL_FACTIONFORTRESSGET_RE = 4422, + PROTOCOL_FACTIONFORTRESSLIST = 4414, + PROTOCOL_FACTIONFORTRESSLIST_RE = 4415, + PROTOCOL_FACTIONHOSTILEAPPLY_RE = 4519, + PROTOCOL_FACTIONHOSTILEREPLY_RE = 4520, + PROTOCOL_FACTIONINFOUPDATE = 8164, + PROTOCOL_FACTIONLEAVE_RE = 4512, + PROTOCOL_FACTIONLISTMEMBER_RE = 4503, + PROTOCOL_FACTIONLISTONLINE = 4819, + PROTOCOL_FACTIONLISTONLINE_RE = 4820, + PROTOCOL_FACTIONLISTRELATION_RE = 4523, + PROTOCOL_FACTIONMASTERRESIGN_RE = 4509, + PROTOCOL_FACTIONMEMBERUPDATE = 8163, + PROTOCOL_FACTIONMSG = 8165, + PROTOCOL_FACTIONOPREQUEST = 4804, + PROTOCOL_FACTIONOPREQUEST_RE = 4805, + PROTOCOL_FACTIONRELATIONRECVAPPLY = 4524, + PROTOCOL_FACTIONRELATIONRECVREPLY = 4525, + PROTOCOL_FACTIONREMOVERELATIONAPPLY_RE = 4521, + PROTOCOL_FACTIONREMOVERELATIONREPLY_RE = 4522, + PROTOCOL_FACTIONRENAME_RE = 4516, + PROTOCOL_FACTIONRENAMEANNOUNCE = 4532, + PROTOCOL_FACTIONRENAMEGSVERIFY = 4527, + PROTOCOL_FACTIONRENAMEGSVERIFY_RE = 4528, + PROTOCOL_FACTIONRESIGN_RE = 4511, + PROTOCOL_FACTIONRESOURCEBATTLEEVENTNOTICE = 4429, + PROTOCOL_FACTIONRESOURCEBATTLEGETMAP = 4434, + PROTOCOL_FACTIONRESOURCEBATTLEGETMAP_RE = 4435, + PROTOCOL_FACTIONRESOURCEBATTLEGETRECORD = 4436, + PROTOCOL_FACTIONRESOURCEBATTLEGETRECORD_RE = 4437, + PROTOCOL_FACTIONRESOURCEBATTLELIMITNOTICE = 4433, + PROTOCOL_FACTIONRESOURCEBATTLENOTIFYPLAYEREVENT = 4438, + PROTOCOL_FACTIONRESOURCEBATTLEPLAYERQUERY = 4430, + PROTOCOL_FACTIONRESOURCEBATTLEPLAYERQUERYRESULT = 4431, + PROTOCOL_FACTIONRESOURCEBATTLEREQUESTCONFIG = 4425, + PROTOCOL_FACTIONRESOURCEBATTLEREQUESTCONFIG_RE = 4426, + PROTOCOL_FACTIONRESOURCEBATTLESERVERREGISTER = 4427, + PROTOCOL_FACTIONRESOURCEBATTLESTATUSNOTICE = 4428, + PROTOCOL_FACTIONSERVERREGISTER = 4409, + PROTOCOL_FACTIONUPGRADE_RE = 4513, + PROTOCOL_FINDSELLPOINTINFO = 619, + PROTOCOL_FINDSELLPOINTINFO_RE = 620, + PROTOCOL_FORWARDCHAT = 8000, + PROTOCOL_FRIENDEXTLIST = 230, + PROTOCOL_FRIENDSTATUS = 214, + PROTOCOL_GAME2AU = 8039, + PROTOCOL_GAMEDATASEND = 34, + PROTOCOL_GETCNETSERVERCONFIG = 4788, + PROTOCOL_GETCNETSERVERCONFIG_RE = 4789, + PROTOCOL_GETCUSTOMDATA = 116, + PROTOCOL_GETCUSTOMDATA_RE = 117, + PROTOCOL_GETFACTIONBASEINFO = 4814, + PROTOCOL_GETFACTIONBASEINFO_RE = 4815, + PROTOCOL_GETFRIENDS = 206, + PROTOCOL_GETFRIENDS_RE = 207, + PROTOCOL_GETHELPSTATES = 130, + PROTOCOL_GETHELPSTATES_RE = 131, + PROTOCOL_GETMAIL = 4204, + PROTOCOL_GETMAIL_RE = 4205, + PROTOCOL_GETMAILATTACHOBJ = 4206, + PROTOCOL_GETMAILATTACHOBJ_RE = 4207, + PROTOCOL_GETMAILLIST = 4202, + PROTOCOL_GETMAILLIST_RE = 4203, + PROTOCOL_GETPLAYERBRIEFINFO = 107, + PROTOCOL_GETPLAYERBRIEFINFO_RE = 108, + PROTOCOL_GETPLAYERFACTIONINFO = 4816, + PROTOCOL_GETPLAYERFACTIONINFO_RE = 4817, + PROTOCOL_GETPLAYERFACTIONRELATION = 4821, + PROTOCOL_GETPLAYERFACTIONRELATION_RE = 4822, + PROTOCOL_GETPLAYERIDBYNAME = 118, + PROTOCOL_GETPLAYERIDBYNAME_RE = 119, + PROTOCOL_GETREWARDLIST = 4952, + PROTOCOL_GETREWARDLIST_RE = 4953, + PROTOCOL_SENDMSG = 11, + // Protocol for QQ + PROTOCOL_ROLESTATUSANNOUNCE = 7, + PROTOCOL_DELIVERROLESTATUS = 9, + PROTOCOL_QQADDFRIEND = 12, + PROTOCOL_QQADDFRIEND_RE = 13, + PROTOCOL_TRADEEND = 4016, + PROTOCOL_GETSAVEDMSG = 217, + PROTOCOL_GETSAVEDMSG_RE = 218, + PROTOCOL_GETSELLLIST = 603, + PROTOCOL_GETSELLLIST_RE = 604, + PROTOCOL_GETTASKDATA = 111, + PROTOCOL_GETTASKDATA_RE = 112, + PROTOCOL_GETUICONFIG = 104, + PROTOCOL_GETUICONFIG_RE = 105, + PROTOCOL_GIFTCODEREDEEM = 4056, + PROTOCOL_GIFTCODEREDEEM_RE = 4057, + PROTOCOL_GMAILENDSYNC = 4216, + PROTOCOL_GMCONTROLGAME = 380, + PROTOCOL_GMCONTROLGAME_RE = 381, + PROTOCOL_GMFORBIDROLE = 366, + PROTOCOL_GMFORBIDROLE_RE = 367, + PROTOCOL_GMFORBIDSELLPOINT = 378, + PROTOCOL_GMFORBIDSELLPOINT_RE = 379, + PROTOCOL_GMGETPLAYERCONSUMEINFO = 382, + PROTOCOL_GMGETPLAYERCONSUMEINFO_RE = 383, + PROTOCOL_GMKICKOUTROLE = 360, + PROTOCOL_GMKICKOUTROLE_RE = 361, + PROTOCOL_GMKICKOUTUSER = 354, + PROTOCOL_GMKICKOUTUSER_RE = 355, + PROTOCOL_GMLISTONLINEUSER = 352, + PROTOCOL_GMLISTONLINEUSER_RE = 353, + PROTOCOL_GMONLINENUM = 350, + PROTOCOL_GMONLINENUM_RE = 351, + PROTOCOL_GMRESTARTSERVER = 358, + PROTOCOL_GMRESTARTSERVER_RE = 359, + PROTOCOL_GMSETTIMELESSAUTOLOCK = 385, + PROTOCOL_GMSETTIMELESSAUTOLOCK_RE = 386, + PROTOCOL_GMSHUTUP = 356, + PROTOCOL_GMSHUTUP_RE = 357, + PROTOCOL_GMSHUTUPROLE = 362, + PROTOCOL_GMSHUTUPROLE_RE = 363, + PROTOCOL_GMTOGGLECHAT = 364, + PROTOCOL_GMTOGGLECHAT_RE = 365, + PROTOCOL_GTRADEDISCARD = 4020, + PROTOCOL_GTRADEEND = 4019, + PROTOCOL_GTRADESTART = 4017, + PROTOCOL_GTRADESTART_RE = 4018, + PROTOCOL_INCREASEFORCEACTIVITY = 4705, + PROTOCOL_KECANDIDATEAPPLY = 4854, + PROTOCOL_KECANDIDATEAPPLY_RE = 4855, + PROTOCOL_KEEPALIVE = 90, + PROTOCOL_KEGETSTATUS = 4852, + PROTOCOL_KEGETSTATUS_RE = 4853, + PROTOCOL_KEKINGNOTIFY = 4864, + PROTOCOL_KEVOTING = 4858, + PROTOCOL_KEVOTING_RE = 4859, + PROTOCOL_KEYEXCHANGE = 2, + PROTOCOL_KEYREESTABLISH = 1105, + PROTOCOL_KICKOUTUSER = 10, + PROTOCOL_KICKOUTUSER2 = 1126, + PROTOCOL_MATRIXCHALLENGE = 551, + PROTOCOL_MATRIXFAILURE = 553, + PROTOCOL_MATRIXRESPONSE = 552, + PROTOCOL_MOBILESERVERREGISTER = 159, + PROTOCOL_NOTIFYFACTIONFORTRESSID = 4423, + PROTOCOL_NOTIFYFACTIONFORTRESSINFO2 = 4411, + PROTOCOL_NOTIFYFACTIONFORTRESSSTATE = 4410, + PROTOCOL_NOTIFYFACTIONPLAYERRENAME = 4424, + PROTOCOL_NOTIFYPLAYERJOINORLEAVEFORCE = 4704, + PROTOCOL_ONDIVORCE = 4048, + PROTOCOL_ONLINEANNOUNCE = 4, + PROTOCOL_PLAYERACCUSE = 161, + PROTOCOL_PLAYERACCUSE_RE = 162, + PROTOCOL_PLAYERASKFORPRESENT = 3068, + PROTOCOL_PLAYERASKFORPRESENT_RE = 3069, + PROTOCOL_PLAYERBASEINFO = 91, + PROTOCOL_PLAYERBASEINFO_RE = 92, + PROTOCOL_PLAYERBASEINFOCRC = 98, + PROTOCOL_PLAYERBASEINFOCRC_RE = 99, + PROTOCOL_PLAYERCHANGEDS = 1102, + PROTOCOL_PLAYERCHANGEDS_RE = 1103, + PROTOCOL_PLAYERENTERLEAVEGT = 4463, + PROTOCOL_PLAYERFACTIONINFO = 4801, + PROTOCOL_PLAYERFACTIONINFO_RE = 4802, + PROTOCOL_PLAYERGIVEPRESENT = 3065, + PROTOCOL_PLAYERGIVEPRESENT_RE = 3066, + PROTOCOL_PLAYERHEARTBEAT = 93, + PROTOCOL_PLAYERINFOUPDATE = 4460, + PROTOCOL_PLAYERKICKOUT = 63, + PROTOCOL_PLAYERKICKOUT_RE = 64, + PROTOCOL_PLAYERLOGIN = 65, + PROTOCOL_PLAYERLOGIN_RE = 66, + PROTOCOL_PLAYERLOGOUT = 69, + PROTOCOL_PLAYERNAMEUPDATE = 158, + PROTOCOL_PLAYEROFFLINE = 67, + PROTOCOL_PLAYEROFFLINE_RE = 68, + PROTOCOL_PLAYERPROFILEGETMATCHRESULT = 954, + PROTOCOL_PLAYERPROFILEGETMATCHRESULT_RE = 955, + PROTOCOL_PLAYERPROFILEGETPROFILEDATA = 951, + PROTOCOL_PLAYERPROFILEGETPROFILEDATA_RE = 952, + PROTOCOL_PLAYERPROFILESETPROFILEDATA = 953, + PROTOCOL_PLAYERRENAME = 3059, + PROTOCOL_PLAYERRENAME_RE = 3060, + PROTOCOL_PLAYERREQUITEFRIEND = 3072, + PROTOCOL_PLAYERSENDMAIL = 4212, + PROTOCOL_PLAYERSENDMAIL_RE = 4213, + PROTOCOL_PLAYERSENDMASSMAIL = 4217, + PROTOCOL_PLAYERSTATUSANNOUNCE = 109, + PROTOCOL_PLAYERSTATUSSYNC = 95, + PROTOCOL_PLAYERTEAMMEMBEROP = 4462, + PROTOCOL_PLAYERTEAMOP = 4461, + PROTOCOL_POSTFACTIONRENAME = 4531, + PROTOCOL_POSTPLAYERRENAME = 3063, + PROTOCOL_PRESERVEMAIL = 4210, + PROTOCOL_PRESERVEMAIL_RE = 4211, + PROTOCOL_PRIVATECHAT = 96, + PROTOCOL_PSHOPACTIVE = 914, + PROTOCOL_PSHOPACTIVE_RE = 915, + PROTOCOL_PSHOPBUY = 902, + PROTOCOL_PSHOPBUY_RE = 903, + PROTOCOL_PSHOPCANCELGOODS = 906, + PROTOCOL_PSHOPCANCELGOODS_RE = 907, + PROTOCOL_PSHOPCLEARGOODS = 920, + PROTOCOL_PSHOPCLEARGOODS_RE = 921, + PROTOCOL_PSHOPCREATE = 900, + PROTOCOL_PSHOPCREATE_RE = 901, + PROTOCOL_PSHOPDRAWITEM = 918, + PROTOCOL_PSHOPDRAWITEM_RE = 919, + PROTOCOL_PSHOPLIST = 926, + PROTOCOL_PSHOPLIST_RE = 927, + PROTOCOL_PSHOPLISTITEM = 928, + PROTOCOL_PSHOPLISTITEM_RE = 929, + PROTOCOL_PSHOPMANAGEFUND = 916, + PROTOCOL_PSHOPMANAGEFUND_RE = 917, + PROTOCOL_PSHOPPLAYERBUY = 908, + PROTOCOL_PSHOPPLAYERBUY_RE = 909, + PROTOCOL_PSHOPPLAYERGET = 924, + PROTOCOL_PSHOPPLAYERGET_RE = 925, + PROTOCOL_PSHOPPLAYERSELL = 910, + PROTOCOL_PSHOPPLAYERSELL_RE = 911, + PROTOCOL_PSHOPSELFGET = 922, + PROTOCOL_PSHOPSELFGET_RE = 923, + PROTOCOL_PSHOPSELL = 904, + PROTOCOL_PSHOPSELL_RE = 905, + PROTOCOL_PSHOPSETTYPE = 912, + PROTOCOL_PSHOPSETTYPE_RE = 913, + PROTOCOL_PUBLICCHAT = 79, + PROTOCOL_QPADDCASH = 152, + PROTOCOL_QPADDCASH_RE = 153, + PROTOCOL_QPANNOUNCEDISCOUNT = 149, + PROTOCOL_QPGETACTIVATEDSERVICES = 150, + PROTOCOL_QPGETACTIVATEDSERVICES_RE = 151, + PROTOCOL_QUERYGAMESERVERATTR = 512, + PROTOCOL_QUERYGAMESERVERATTR_RE = 513, + PROTOCOL_QUERYPLAYERSTATUS = 110, + PROTOCOL_QUERYREWARDTYPE = 510, + PROTOCOL_QUERYREWARDTYPE_RE = 511, + PROTOCOL_QUERYUSERFORBID = 508, + PROTOCOL_QUERYUSERFORBID_RE = 509, + PROTOCOL_QUERYUSERPRIVILEGE = 506, + PROTOCOL_QUERYUSERPRIVILEGE_RE = 507, + PROTOCOL_REFGETREFERENCECODE = 4908, + PROTOCOL_REFGETREFERENCECODE_RE = 4909, + PROTOCOL_REFLISTREFERRALS = 4904, + PROTOCOL_REFLISTREFERRALS_RE = 4905, + PROTOCOL_REFWITHDRAWBONUS = 4906, + PROTOCOL_REFWITHDRAWBONUS_RE = 4907, + PROTOCOL_REMOTELOG = 62, + PROTOCOL_REMOTELOGVITAL = 61, + PROTOCOL_REPORT2GM = 368, + PROTOCOL_REPORT2GM_RE = 369, + PROTOCOL_REPORTCHAT = 156, + PROTOCOL_REPORTIP = 35, + PROTOCOL_RESPONSE = 3, + PROTOCOL_REWARDMATURENOTICE = 4956, + PROTOCOL_ROLELIST = 82, + PROTOCOL_ROLELIST_RE = 83, + PROTOCOL_S2CBROADCAST = 78, + PROTOCOL_S2CGAMEDATASEND = 74, + PROTOCOL_S2CMULTICAST = 77, + PROTOCOL_SELECTROLE = 70, + PROTOCOL_SELECTROLE_RE = 71, + PROTOCOL_SELLCANCEL = 605, + PROTOCOL_SELLCANCEL_RE = 606, + PROTOCOL_SELLPOINT = 601, + PROTOCOL_SELLPOINT_RE = 602, + PROTOCOL_SENDAUCTIONBID = 822, + PROTOCOL_SENDAUMAIL = 233, + PROTOCOL_SENDAUMAIL_RE = 234, + PROTOCOL_SENDBATTLECHALLENGE = 869, + PROTOCOL_SENDREFADDBONUS = 4901, + PROTOCOL_SENDREFCASHUSED = 4902, + PROTOCOL_SENDREWARDADDBONUS = 4951, + PROTOCOL_SENDTASKREWARD = 4962, + PROTOCOL_SERVERFORBIDNOTIFY = 160, + PROTOCOL_SERVERTRIGGERNOTIFY = 163, + PROTOCOL_SETCHATEMOTION = 134, + PROTOCOL_SETCUSTOMDATA = 100, + PROTOCOL_SETCUSTOMDATA_RE = 101, + PROTOCOL_SETFRIENDGROUP = 210, + PROTOCOL_SETFRIENDGROUP_RE = 211, + PROTOCOL_SETGROUPNAME = 208, + PROTOCOL_SETGROUPNAME_RE = 209, + PROTOCOL_SETHELPSTATES = 128, + PROTOCOL_SETHELPSTATES_RE = 129, + PROTOCOL_SETMAXONLINENUM_RE = 374, + PROTOCOL_SETTASKDATA = 113, + PROTOCOL_SETTASKDATA_RE = 114, + PROTOCOL_SETUICONFIG = 102, + PROTOCOL_SETUICONFIG_RE = 103, + PROTOCOL_SNSROLEBRIEFUPDATE = 4471, + PROTOCOL_SSOGETTICKET = 147, + PROTOCOL_SSOGETTICKET_RE = 148, + PROTOCOL_SSOGETTICKETREQ = 8016, + PROTOCOL_STATINFO = 60, + PROTOCOL_STATINFOVITAL = 59, + PROTOCOL_STATUSANNOUNCE = 6, + PROTOCOL_STOCKACCOUNT = 407, + PROTOCOL_STOCKACCOUNT_RE = 408, + PROTOCOL_STOCKBILL = 405, + PROTOCOL_STOCKBILL_RE = 406, + PROTOCOL_STOCKCANCEL = 411, + PROTOCOL_STOCKCANCEL_RE = 412, + PROTOCOL_STOCKCOMMISSION = 401, + PROTOCOL_STOCKCOMMISSION_RE = 409, + PROTOCOL_STOCKTRANSACTION = 402, + PROTOCOL_STOCKTRANSACTION_RE = 410, + PROTOCOL_SWITCHSERVERCANCEL = 4102, + PROTOCOL_SWITCHSERVERSTART = 4101, + PROTOCOL_SWITCHSERVERSUCCESS = 4103, + PROTOCOL_SWITCHSERVERTIMEOUT = 4104, + PROTOCOL_SYNCFORCEGLOBALDATA = 4703, + PROTOCOL_SYNCSELLINFO = 609, + PROTOCOL_SYNMUTADATA = 146, + PROTOCOL_SYSAUCTIONACCOUNT = 4355, + PROTOCOL_SYSAUCTIONACCOUNT_RE = 4356, + PROTOCOL_SYSAUCTIONBID = 4357, + PROTOCOL_SYSAUCTIONBID_RE = 4358, + PROTOCOL_SYSAUCTIONCASHTRANSFER = 4359, + PROTOCOL_SYSAUCTIONCASHTRANSFER_RE = 4360, + PROTOCOL_SYSAUCTIONGETITEM = 4353, + PROTOCOL_SYSAUCTIONGETITEM_RE = 4354, + PROTOCOL_SYSAUCTIONLIST = 4351, + PROTOCOL_SYSAUCTIONLIST_RE = 4352, + PROTOCOL_SYSSENDMAIL_RE = 4215, + PROTOCOL_SYSSENDMAIL3_RE = 8069, + PROTOCOL_TANKBATTLEEND = 4879, + PROTOCOL_TANKBATTLEENTER = 4874, + PROTOCOL_TANKBATTLEPLAYERAPPLY = 4872, + PROTOCOL_TANKBATTLEPLAYERAPPLY_RE = 4873, + PROTOCOL_TANKBATTLEPLAYERENTER = 4875, + PROTOCOL_TANKBATTLEPLAYERGETRANK = 4881, + PROTOCOL_TANKBATTLEPLAYERGETRANK_RE = 4882, + PROTOCOL_TANKBATTLEPLAYERLEAVE = 4876, + PROTOCOL_TANKBATTLEPLAYERSCOREUPDATE = 4880, + PROTOCOL_TANKBATTLESERVERREGISTER = 4871, + PROTOCOL_TANKBATTLESTART = 4877, + PROTOCOL_TANKBATTLESTART_RE = 4878, + PROTOCOL_TOUCHPOINTCOST = 4052, + PROTOCOL_TOUCHPOINTCOST_RE = 4053, + PROTOCOL_TOUCHPOINTQUERY = 4050, + PROTOCOL_TOUCHPOINTQUERY_RE = 4051, + PROTOCOL_TRADEADDGOODS = 4004, + PROTOCOL_TRADEADDGOODS_RE = 4005, + PROTOCOL_TRADECONFIRM = 4012, + PROTOCOL_TRADECONFIRM_RE = 4013, + PROTOCOL_TRADEDISCARD = 4014, + PROTOCOL_TRADEDISCARD_RE = 4015, + PROTOCOL_TRADEMOVEOBJ = 4008, + PROTOCOL_TRADEMOVEOBJ_RE = 4009, + PROTOCOL_TRADEREMOVEGOODS = 4006, + PROTOCOL_TRADEREMOVEGOODS_RE = 4007, + PROTOCOL_TRADESTART = 4001, + PROTOCOL_TRADESTART_RE = 4002, + PROTOCOL_TRADESUBMIT = 4010, + PROTOCOL_TRADESUBMIT_RE = 4011, + PROTOCOL_TRANSBUYPOINT = 616, + PROTOCOL_TRYCHANGEDS = 1101, + PROTOCOL_UNDODELETEROLE = 88, + PROTOCOL_UNDODELETEROLE_RE = 89, + PROTOCOL_UNIQUEDATAMODIFYBROADCAST = 3118, + PROTOCOL_UNIQUEDATAMODIFYNOTICE = 3116, + PROTOCOL_UNIQUEDATAMODIFYREQUIRE = 3115, + PROTOCOL_UNIQUEDATASYNCH = 3117, + PROTOCOL_UPDATEREMAINTIME = 36, + PROTOCOL_USERADDCASH = 144, + PROTOCOL_USERADDCASH_RE = 145, + PROTOCOL_USERCOUPON = 138, + PROTOCOL_USERCOUPON_RE = 139, + PROTOCOL_USERCOUPONEXCHANGE = 140, + PROTOCOL_USERCOUPONEXCHANGE_RE = 141, + PROTOCOL_VERIFYMASTER = 519, + PROTOCOL_VERIFYMASTER_RE = 520, + PROTOCOL_WAITQUEUESTATENOTIFY = 164, + PROTOCOL_WEBTRADEATTENDLIST = 4312, + PROTOCOL_WEBTRADEATTENDLIST_RE = 4313, + PROTOCOL_WEBTRADEGETDETAIL = 4314, + PROTOCOL_WEBTRADEGETDETAIL_RE = 4315, + PROTOCOL_WEBTRADEGETITEM = 4310, + PROTOCOL_WEBTRADEGETITEM_RE = 4311, + PROTOCOL_WEBTRADELIST = 4308, + PROTOCOL_WEBTRADELIST_RE = 4309, + PROTOCOL_WEBTRADEPRECANCELPOST = 4305, + PROTOCOL_WEBTRADEPRECANCELPOST_RE = 4306, + PROTOCOL_WEBTRADEPREPOST = 4302, + PROTOCOL_WEBTRADEPREPOST_RE = 4303, + PROTOCOL_WEBTRADEROLEGETDETAIL = 4329, + PROTOCOL_WEBTRADEROLEPRECANCELPOST = 4328, + PROTOCOL_WEBTRADEROLEPREPOST = 4326, + PROTOCOL_WEBTRADEUPDATE = 4324, + PROTOCOL_WEBTRADEUPDATE_RE = 4325, + PROTOCOL_WORLDCHAT = 133, + RPC_ACTIVATEPLAYERDATA = 1107, + RPC_ADDFACTION = 4600, + RPC_ADDFRIENDRQST = 204, + RPC_ADDMEMBER = 4602, + RPC_ANNOUNCEFACTIONROLEDEL = 4811, + RPC_BATTLEEND = 859, + RPC_CANCHANGEROLENAME = 3403, + RPC_CASHSERIAL = 8009, + RPC_CLEARSTOREHOUSEPASSWD = 3402, + RPC_COUPONEXCHANGE = 8063, + RPC_DBAUCTIONBID = 811, + RPC_DBAUCTIONCLOSE = 815, + RPC_DBAUCTIONGET = 813, + RPC_DBAUCTIONLIST = 812, + RPC_DBAUCTIONOPEN = 810, + RPC_DBAUCTIONTIMEOUT = 814, + RPC_DBAUTOLOCKGET = 392, + RPC_DBAUTOLOCKSET = 784, + RPC_DBAUTOLOCKSETOFFLINE = 391, + RPC_DBBATTLEBONUS = 872, + RPC_DBBATTLECHALLENGE = 865, + RPC_DBBATTLEEND = 868, + RPC_DBBATTLELOAD = 863, + RPC_DBBATTLEMAIL = 871, + RPC_DBBATTLESET = 864, + RPC_DBBUYPOINT = 615, + RPC_DBCLEARCONSUMABLE = 7000, + RPC_DBCOPYROLE = 5101, + RPC_DBCOUNTRYBATTLEBONUS = 4771, + RPC_DBCREATEFACTIONFORTRESS = 4408, + RPC_DBCREATEROLE = 3007, + RPC_DBDELETEMAIL = 4256, + RPC_DBDELETEROLE = 3008, + RPC_DBDELFACTIONFORTRESS = 4403, + RPC_DBEXCHANGECONSUMEPOINTS = 4960, + RPC_DBFACTIONALLIANCEAPPLY = 4612, + RPC_DBFACTIONALLIANCEREPLY = 4613, + RPC_DBFACTIONFORTRESSCHALLENGE = 4418, + RPC_DBFACTIONFORTRESSLOAD = 4401, + RPC_DBFACTIONHOSTILEAPPLY = 4614, + RPC_DBFACTIONHOSTILEREPLY = 4615, + RPC_DBFACTIONPROMOTE = 4611, + RPC_DBFACTIONRELATIONAPPLYTIMEOUT = 4619, + RPC_DBFACTIONRELATIONTIMEOUT = 4618, + RPC_DBFACTIONREMOVERELATIONAPPLY = 4616, + RPC_DBFACTIONREMOVERELATIONREPLY = 4617, + RPC_DBFACTIONRENAME = 4530, + RPC_DBFACTIONRESOURCEBATTLEBONUS = 4432, + RPC_DBFACTIONUPGRADE = 4610, + RPC_DBFORBIDUSER = 5037, + RPC_DBFORCELOAD = 4701, + RPC_DBGAMETALKFACTIONINFO = 4453, + RPC_DBGAMETALKROLEINFO = 4455, + RPC_DBGAMETALKROLELIST = 4451, + RPC_DBGAMETALKROLERELATION = 4452, + RPC_DBGAMETALKROLESTATUS = 4454, + RPC_DBGETCONSUMEINFOS = 384, + RPC_DBGETMAIL = 4252, + RPC_DBGETMAILATTACH = 4253, + RPC_DBGETMAILLIST = 4251, + RPC_DBGETPLAYERPROFILEDATA = 956, + RPC_DBGETREWARD = 4957, + RPC_DBKECANDIDATEAPPLY = 4856, + RPC_DBKECANDIDATECONFIRM = 4857, + RPC_DBKEDELETECANDIDATE = 4863, + RPC_DBKEDELETEKING = 4862, + RPC_DBKEKINGCONFIRM = 4861, + RPC_DBKELOAD = 4851, + RPC_DBKEVOTING = 4860, + RPC_DBLOADGLOBALCONTROL = 3111, + RPC_DBMAPPASSWORDLOAD = 3043, + RPC_DBMAPPASSWORDSAVE = 3044, + RPC_DBMODIFYROLEDATA = 8005, + RPC_DBPLAYERASKFORPRESENT = 3070, + RPC_DBPLAYERCHANGEGENDER = 3071, + RPC_DBPLAYERGIVEPRESENT = 3067, + RPC_DBPLAYERPOSITIONRESET = 3110, + RPC_DBPLAYERRENAME = 3062, + RPC_DBPLAYERREQUITEFRIEND = 3073, + RPC_DBPSHOPACTIVE = 937, + RPC_DBPSHOPBUY = 931, + RPC_DBPSHOPCANCELGOODS = 933, + RPC_DBPSHOPCLEARGOODS = 942, + RPC_DBPSHOPCREATE = 930, + RPC_DBPSHOPDRAWITEM = 939, + RPC_DBPSHOPGET = 941, + RPC_DBPSHOPLOAD = 940, + RPC_DBPSHOPMANAGEFUND = 938, + RPC_DBPSHOPPLAYERBUY = 934, + RPC_DBPSHOPPLAYERSELL = 935, + RPC_DBPSHOPSELL = 932, + RPC_DBPSHOPSETTYPE = 936, + RPC_DBPSHOPTIMEOUT = 943, + RPC_DBPUTCONSUMEPOINTS = 4958, + RPC_DBPUTFACTIONFORTRESS = 4402, + RPC_DBPUTFORCE = 4702, + RPC_DBPUTGLOBALCONTROL = 3112, + RPC_DBPUTPLAYERPROFILEDATA = 957, + RPC_DBPUTREWARDBONUS = 4961, + RPC_DBRAWREAD = 3055, + RPC_DBREFGETREFERRAL = 4910, + RPC_DBREFGETREFERRER = 4911, + RPC_DBREFUPDATEREFERRAL = 4912, + RPC_DBREFUPDATEREFERRER = 4913, + RPC_DBREFWITHDRAWTRANS = 4903, + RPC_DBREWARDMATURE = 4959, + RPC_DBROLENAMELIST = 3064, + RPC_DBSELLCANCEL = 614, + RPC_DBSELLPOINT = 611, + RPC_DBSELLTIMEOUT = 613, + RPC_DBSENDMAIL = 4255, + RPC_DBSENDMASSMAIL = 4257, + RPC_DBSETCASHPASSWORD = 3100, + RPC_DBSETMAILATTR = 4254, + RPC_DBSTOCKBALANCE = 413, + RPC_DBSTOCKCANCEL = 417, + RPC_DBSTOCKCOMMISSION = 416, + RPC_DBSTOCKLOAD = 415, + RPC_DBSTOCKTRANSACTION = 414, + RPC_DBSYNCSELLINFO = 612, + RPC_DBSYSAUCTIONCASHSPEND = 4362, + RPC_DBSYSAUCTIONCASHTRANSFER = 4361, + RPC_DBSYSMAIL3 = 4221, + RPC_DBTANKBATTLEBONUS = 4883, + RPC_DBTRANSPOINTDEAL = 618, + RPC_DBUNDODELETEROLE = 3009, + RPC_DBUNIQUEDATALOAD = 3113, + RPC_DBUNIQUEDATASAVE = 3114, + RPC_DBUPDATEPLAYERCROSSINFO = 1125, + RPC_DBVERIFYMASTER = 4609, + RPC_DBWEBTRADECANCELPOST = 4317, + RPC_DBWEBTRADECANCELSHELF = 4319, + RPC_DBWEBTRADEGETROLESIMPLEINFO = 4322, + RPC_DBWEBTRADELOAD = 4301, + RPC_DBWEBTRADELOADSOLD = 4323, + RPC_DBWEBTRADEPOST = 4316, + RPC_DBWEBTRADEPOSTEXPIRE = 4321, + RPC_DBWEBTRADEPRECANCELPOST = 4307, + RPC_DBWEBTRADEPREPOST = 4304, + RPC_DBWEBTRADESHELF = 4318, + RPC_DBWEBTRADESOLD = 4320, + RPC_DELFACTION = 4601, + RPC_DELMEMBER = 4603, + RPC_DELMEMBERSCHEDULE = 4620, + RPC_DELPLAYERDATA = 1124, + RPC_DELROLE = 3006, + RPC_DELUSER = 3003, + RPC_FACTIONINVITEJOIN = 4813, + RPC_FETCHPLAYERDATA = 1106, + RPC_FORBIDUSER = 8004, + RPC_FREEZEPLAYERDATA = 1112, + RPC_GETADDCASHSN = 514, + RPC_GETCASHTOTAL = 3058, + RPC_GETFACTIONDETAIL = 4608, + RPC_GETFACTIONFORTRESS = 4404, + RPC_GETFACTIONINFO = 4606, + RPC_GETFRIENDLIST = 201, + RPC_GETMESSAGE = 216, + RPC_GETMONEYINVENTORY = 3022, + RPC_GETROLE = 3005, + RPC_GETROLEBASE = 3013, + RPC_GETROLEBASESTATUS = 3025, + RPC_GETROLEDATA = 8003, + RPC_GETROLEEQUIPMENT = 3017, + RPC_GETROLEFORBID = 3031, + RPC_GETROLEID = 3033, + RPC_GETROLEINFO = 3051, + RPC_GETROLEPOCKET = 3053, + RPC_GETROLESTATUS = 3015, + RPC_GETROLESTOREHOUSE = 3027, + RPC_GETROLETASK = 3019, + RPC_GETSERVERDATA = 3057, + RPC_GETTASKDATARPC = 115, + RPC_GETUSER = 3002, + RPC_GETUSERCOUPON = 8062, + RPC_GETUSERFACTION = 4607, + RPC_GETUSERROLES = 3401, + RPC_GQUERYPASSWD = 502, + RPC_MATRIXPASSWD = 550, + RPC_MATRIXPASSWD2 = 8066, + RPC_MATRIXTOKEN = 8070, + RPC_MOVEROLECREATE = 3415, + RPC_PLAYERIDENTITYMATCH = 1113, + RPC_PLAYERPOSITIONRESETRQST = 155, + RPC_POSTCREATEFACTION = 3041, + RPC_POSTCREATEFAMILY = 3049, + RPC_POSTCREATEROLE = 3038, + RPC_POSTDELETEFACTION = 3042, + RPC_POSTDELETEFAMILY = 3050, + RPC_POSTDELETEROLE = 3039, + RPC_PRECREATEFACTION = 3040, + RPC_PRECREATEFAMILY = 3046, + RPC_PRECREATEROLE = 3037, + RPC_PREFACTIONRENAME = 4529, + RPC_PREPLAYERRENAME = 3061, + RPC_PUTFACTIONFORTRESS = 4405, + RPC_PUTFRIENDLIST = 200, + RPC_PUTMESSAGE = 215, + RPC_PUTMONEYINVENTORY = 3023, + RPC_PUTROLE = 3024, + RPC_PUTROLEBASE = 3012, + RPC_PUTROLEDATA = 8002, + RPC_PUTROLEEQUIPMENT = 3016, + RPC_PUTROLEFORBID = 3030, + RPC_PUTROLEPOCKET = 3052, + RPC_PUTROLESTATUS = 3014, + RPC_PUTROLESTOREHOUSE = 3026, + RPC_PUTROLETASK = 3018, + RPC_PUTSERVERDATA = 3056, + RPC_PUTSPOUSE = 4047, + RPC_PUTTASKDATARPC = 135, + RPC_PUTUSER = 3001, + RPC_QUERYUSERID = 8001, + RPC_RENAMEROLE = 3404, + RPC_ROLEID2UID = 3412, + RPC_ROLENAMEEXISTS = 3413, + RPC_SAVEPLAYERDATA = 1114, + RPC_SYSAUCTIONPREPAREITEM = 4363, + RPC_TOUCHPLAYERDATA = 1108, + RPC_TRADEINVENTORY = 3020, + RPC_TRADESAVE = 3021, + RPC_TRADESTARTRQST = 4003, + RPC_TRANSACTIONABORT = 3035, + RPC_TRANSACTIONACQUIRE = 3034, + RPC_TRANSACTIONCOMMIT = 3036, + RPC_UID2LOGICUID = 3411, + RPC_UPDATEFACTION = 4605, + RPC_UPDATEUSERFACTION = 4604, + RPC_USERLOGIN = 15, + RPC_USERLOGIN2 = 8067, + RPC_USERLOGOUT = 33, + RPC_USERROLECOUNT = 3414, + }; +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs.meta new file mode 100644 index 0000000000..ad0c53bd04 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ProtocolTypes.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9e255f60e204e4e47b00bd2a2051a9bc \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs new file mode 100644 index 0000000000..c7e549997a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs @@ -0,0 +1,56 @@ +using CSNetwork.Protocols.RPCData; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class RoleListResponse : Protocol + { + public int result; + public int handle; + public int userid; + public uint localsid; + public List rolelist = new List(); + + public RoleListResponse() : base(Protocols.ProtocolType.PROTOCOL_ROLELIST_RE) + { + } + + public RoleListResponse(int l_result, int l_handle, int l_userid, uint l_localsid, List l_rolelist) + : base(ProtocolType.PROTOCOL_ROLELIST_RE) + { + result = l_result; + handle = l_handle; + userid = l_userid; + this.localsid = l_localsid; + rolelist = l_rolelist; + } + + public override Protocol Clone() + { + var clonedList = new List(); + //foreach (var item in rolelist) + //{ + // clonedList.Add((RoleInfo)item.Clone()); + //} + return new RoleListResponse(result, handle, userid, localsid, clonedList); + } + + public override void Marshal(OctetsStream os) + { + os.Write(result); + os.Write(handle); + os.Write(userid); + os.Write(localsid); + os.WriteList(rolelist); + } + + public override void Unmarshal(OctetsStream os) + { + result = os.ReadInt32(); + handle = os.ReadInt32(); + userid = os.ReadInt32(); + localsid = os.ReadUInt32(); + os.ReadList(rolelist); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs.meta new file mode 100644 index 0000000000..2531dd6725 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/RoleListResponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 522924a3f6cbe476f8eeee9c76711e61 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs new file mode 100644 index 0000000000..f1ef1ead11 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs @@ -0,0 +1,54 @@ +namespace CSNetwork.Protocols +{ + public class PShopPlayerSell : Protocol + { + public uint ItemId { get; set; } + public uint Count { get; set; } + public uint Price { get; set; } + + public PShopPlayerSell() + : base(ProtocolType.PROTOCOL_PSHOPPLAYERSELL) { } + + public override Protocol Clone() => + new PShopPlayerSell + { + ItemId = ItemId, + Count = Count, + Price = Price + }; + + public override void Marshal(OctetsStream os) + { + os.WriteCompactUInt(ItemId); + os.WriteCompactUInt(Count); + os.WriteCompactUInt(Price); + } + + public override void Unmarshal(OctetsStream os) + { + ItemId = os.ReadCompactUInt(); + Count = os.ReadCompactUInt(); + Price = os.ReadCompactUInt(); + } + } + + public class PShopDrawItem : Protocol + { + public uint ItemId { get; set; } + + public PShopDrawItem() + : base(ProtocolType.PROTOCOL_PSHOPDRAWITEM) { } + + public override Protocol Clone() => new PShopDrawItem { ItemId = ItemId }; + + public override void Marshal(OctetsStream os) + { + os.WriteCompactUInt(ItemId); + } + + public override void Unmarshal(OctetsStream os) + { + ItemId = os.ReadCompactUInt(); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs.meta new file mode 100644 index 0000000000..4b93598f17 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ShopProtocols.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 77a18a02db1934866bc5f44896774935 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs new file mode 100644 index 0000000000..dcc6433af8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class acanswer : Protocol + { + public int Roleid { get; set; } + public int Qtype { get; set; } + public int Seq { get; set; } + public int Reserved { get; set; } + public int Answer { get; set; } + + public acanswer() + : base(ProtocolType.PROTOCOL_ACANSWER) { } + + public override Protocol Clone() => + new acanswer + { + Roleid = Roleid, + Qtype = Qtype, + Seq = Seq, + Reserved = Reserved, + Answer = Answer + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Qtype); + os.Write(Seq); + os.Write(Reserved); + os.Write(Answer); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Qtype = os.ReadInt32(); + Seq = os.ReadInt32(); + Reserved = os.ReadInt32(); + Answer = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 8192; + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs.meta new file mode 100644 index 0000000000..1e053ac741 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acanswer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c020e278cf3d14fdb8cf02cf5cb44ba9 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs new file mode 100644 index 0000000000..b1391ee444 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class accountloginrecord : Protocol + { + public int Userid { get; set; } + public int Localsid { get; set; } + public int Login_time { get; set; } + public int Login_ip { get; set; } + public int Current_ip { get; set; } + + public accountloginrecord() : base(ProtocolType.PROTOCOL_ACCOUNTLOGINRECORD) + { + + } + + public override Protocol Clone() => new accountloginrecord + { + Userid = Userid, + Localsid = Localsid, + Login_time = Login_time, + Login_ip = Login_ip, + Current_ip = Current_ip + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + os.Write(Login_time); + os.Write(Login_ip); + os.Write(Current_ip); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Login_time = os.ReadInt32(); + Login_ip = os.ReadInt32(); + Current_ip = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs.meta new file mode 100644 index 0000000000..155d5ef477 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/accountloginrecord.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bf5350fb7eeb246719925a633662ba7e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs new file mode 100644 index 0000000000..fa93202cbf --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class acquestion : Protocol + { + public int Roleid { get; set; } + public int Qtype { get; set; } + public int Seq { get; set; } + public int Reserved { get; set; } + + public acquestion() + : base(ProtocolType.PROTOCOL_ACQUESTION) { } + + public override Protocol Clone() => + new acquestion + { + Roleid = Roleid, + Qtype = Qtype, + Seq = Seq, + Reserved = Reserved + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Qtype); + os.Write(Seq); + os.Write(Reserved); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Qtype = os.ReadInt32(); + Seq = os.ReadInt32(); + Reserved = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 8192; + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs.meta new file mode 100644 index 0000000000..b1a254654b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acquestion.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 658e7c69e9357422f860997a0bd1710e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs new file mode 100644 index 0000000000..e300e00ed9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class acremotecode : Protocol + { + public int Dstroleid { get; set; } + public List Content { get; set; } + + public acremotecode() : base(ProtocolType.PROTOCOL_ACREMOTECODE) + { + Content = new List(); + } + + public override Protocol Clone() => new acremotecode + { + Dstroleid = Dstroleid, + Content = new List(Content) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Dstroleid); + os.Write(Content); + } + + public override void Unmarshal(OctetsStream os) + { + Dstroleid = os.ReadInt32(); + Content = os.ReadOctetsList(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 8192; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs.meta new file mode 100644 index 0000000000..c2cc6d998c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acremotecode.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0d5c63d1fe34446e9876ff678206c44b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs new file mode 100644 index 0000000000..32fbd5d622 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class acreport : Protocol + { + public int Roleid { get; set; } + public Octets Report { get; set; } + + public acreport() : base(ProtocolType.PROTOCOL_ACREPORT) + { + Report = new Octets(); + } + + public override Protocol Clone() => new acreport + { + Roleid = Roleid, + Report = new Octets(Report.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Report); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Report = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 8192; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs.meta new file mode 100644 index 0000000000..dc4b2d64e3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/acreport.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8f45ff5bce92742e68d26c68a9e5b128 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs new file mode 100644 index 0000000000..7ceb999e25 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class addfriend : Protocol + { + public int Srcroleid { get; set; } + public int Dstroleid { get; set; } + public Octets Dstname { get; set; } + public int Srclsid { get; set; } + + public addfriend() : base(ProtocolType.PROTOCOL_ADDFRIEND) + { + Dstname = new Octets(); + } + + public override Protocol Clone() => new addfriend + { + Srcroleid = Srcroleid, + Dstroleid = Dstroleid, + Dstname = new Octets(Dstname.ToArray()), + Srclsid = Srclsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Srcroleid); + os.Write(Dstroleid); + os.Write(Dstname); + os.Write(Srclsid); + } + + public override void Unmarshal(OctetsStream os) + { + Srcroleid = os.ReadInt32(); + Dstroleid = os.ReadInt32(); + Dstname = os.ReadOctets(); + Srclsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs.meta new file mode 100644 index 0000000000..6b2b2cb670 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriend.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1da6a1381aa374bce957e8a3a64ace83 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs new file mode 100644 index 0000000000..e7f66e7e29 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class addfriendremarks : Protocol + { + public int Roleid { get; set; } + public int Friendroleid { get; set; } + public Octets Friendremarks { get; set; } + public int Srclsid { get; set; } + + public addfriendremarks() : base(ProtocolType.PROTOCOL_ADDFRIENDREMARKS) + { + Friendremarks = new Octets(); + } + + public override Protocol Clone() => new addfriendremarks + { + Roleid = Roleid, + Friendroleid = Friendroleid, + Friendremarks = new Octets(Friendremarks.ToArray()), + Srclsid = Srclsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Friendroleid); + os.Write(Friendremarks); + os.Write(Srclsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Friendroleid = os.ReadInt32(); + Friendremarks = os.ReadOctets(); + Srclsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs.meta new file mode 100644 index 0000000000..ce8ed1fd53 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/addfriendremarks.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e3905603a43bc45bf84298688ea2b362 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs new file mode 100644 index 0000000000..3380bb296c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class announceforbidinfo : Protocol + { + public int Userid { get; set; } + public int Localsid { get; set; } + + public announceforbidinfo() : base(ProtocolType.PROTOCOL_ANNOUNCEFORBIDINFO) + { + + } + + public override Protocol Clone() => new announceforbidinfo + { + Userid = Userid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 384; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs.meta new file mode 100644 index 0000000000..616c7f2123 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announceforbidinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 340c8b40b53fc41559b323dafc4e644f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs new file mode 100644 index 0000000000..04ed39ab32 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class announcenewmail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Remain_time { get; set; } + public byte Present_type { get; set; } + public byte L_present_type { get; set; } + + public announcenewmail() : base(ProtocolType.PROTOCOL_ANNOUNCENEWMAIL) + { + + } + + public override Protocol Clone() => new announcenewmail + { + Roleid = Roleid, + Localsid = Localsid, + Remain_time = Remain_time, + Present_type = Present_type, + L_present_type = L_present_type + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Remain_time); + os.Write(Present_type); + os.Write(L_present_type); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Remain_time = os.ReadInt32(); + Present_type = os.ReadByte(); + L_present_type = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs.meta new file mode 100644 index 0000000000..f8dab0b3df --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcenewmail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7141c5a30572f4163b62efc2a06f909a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs new file mode 100644 index 0000000000..81afd7fb33 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class announcesellresult : Protocol + { + public int Retcode { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Sellid { get; set; } + public int Seller { get; set; } + public int Point { get; set; } + public int Price { get; set; } + public int L_sellid { get; set; } + + public announcesellresult() : base(ProtocolType.PROTOCOL_ANNOUNCESELLRESULT) + { + + } + + public override Protocol Clone() => new announcesellresult + { + Retcode = Retcode, + Roleid = Roleid, + Localsid = Localsid, + Sellid = Sellid, + Seller = Seller, + Point = Point, + Price = Price, + L_sellid = L_sellid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Retcode); + os.Write(Roleid); + os.Write(Localsid); + os.Write(Sellid); + os.Write(Seller); + os.Write(Point); + os.Write(Price); + os.Write(L_sellid); + } + + public override void Unmarshal(OctetsStream os) + { + Retcode = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Sellid = os.ReadInt32(); + Seller = os.ReadInt32(); + Point = os.ReadInt32(); + Price = os.ReadInt32(); + L_sellid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs.meta new file mode 100644 index 0000000000..fee6e95657 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/announcesellresult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2a7729779b2ec479689e86a7aba9df2a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs new file mode 100644 index 0000000000..c96a20ecf9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionattendlist : Protocol + { + public int Roleid { get; set; } + public int Gettype { get; set; } + public int Localsid { get; set; } + + public auctionattendlist() : base(ProtocolType.PROTOCOL_AUCTIONATTENDLIST) + { + + } + + public override Protocol Clone() => new auctionattendlist + { + Roleid = Roleid, + Gettype = Gettype, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Gettype); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Gettype = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs.meta new file mode 100644 index 0000000000..eca40c0858 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionattendlist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f9aa55bc722364d389706c081cf6ca8b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs new file mode 100644 index 0000000000..683cbf49fa --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionbid : Protocol + { + public int Roleid { get; set; } + public int Auctionid { get; set; } + public int Bidprice { get; set; } + public byte Bin { get; set; } + public int Localsid { get; set; } + public int Money { get; set; } + public int L_auctionid { get; set; } + + public auctionbid() : base(ProtocolType.PROTOCOL_AUCTIONBID) + { + + } + + public override Protocol Clone() => new auctionbid + { + Roleid = Roleid, + Auctionid = Auctionid, + Bidprice = Bidprice, + Bin = Bin, + Localsid = Localsid, + Money = Money, + L_auctionid = L_auctionid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Auctionid); + os.Write(Bidprice); + os.Write(Bin); + os.Write(Localsid); + os.Write(Money); + os.Write(L_auctionid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Auctionid = os.ReadInt32(); + Bidprice = os.ReadInt32(); + Bin = os.ReadByte(); + Localsid = os.ReadInt32(); + Money = os.ReadInt32(); + L_auctionid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs.meta new file mode 100644 index 0000000000..9b317163f0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionbid.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2dbe62fd70be541efa4d818c46b267f1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs new file mode 100644 index 0000000000..b58117397f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionclose : Protocol + { + public int Roleid { get; set; } + public int Auctionid { get; set; } + public byte Reason { get; set; } + public int Localsid { get; set; } + + public auctionclose() : base(ProtocolType.PROTOCOL_AUCTIONCLOSE) + { + + } + + public override Protocol Clone() => new auctionclose + { + Roleid = Roleid, + Auctionid = Auctionid, + Reason = Reason, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Auctionid); + os.Write(Reason); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Auctionid = os.ReadInt32(); + Reason = os.ReadByte(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs.meta new file mode 100644 index 0000000000..daa1b936ef --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionclose.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3c386f6d396bb43e6b02b9906d727641 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs new file mode 100644 index 0000000000..647e1432ed --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionexitbid : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Auctionid { get; set; } + + public auctionexitbid() : base(ProtocolType.PROTOCOL_AUCTIONEXITBID) + { + + } + + public override Protocol Clone() => new auctionexitbid + { + Roleid = Roleid, + Localsid = Localsid, + Auctionid = Auctionid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Auctionid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Auctionid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs.meta new file mode 100644 index 0000000000..26b0570926 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionexitbid.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0374254cedbb84a8996b68cd57595c69 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs new file mode 100644 index 0000000000..2faf4b65cc --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionget : Protocol + { + public int Roleid { get; set; } + public int Auctionid { get; set; } + public int Localsid { get; set; } + public int L_auctionid { get; set; } + + public auctionget() : base(ProtocolType.PROTOCOL_AUCTIONGET) + { + + } + + public override Protocol Clone() => new auctionget + { + Roleid = Roleid, + Auctionid = Auctionid, + Localsid = Localsid, + L_auctionid = L_auctionid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Auctionid); + os.Write(Localsid); + os.Write(L_auctionid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Auctionid = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_auctionid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs.meta new file mode 100644 index 0000000000..e1e7590798 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionget.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3fb148b7ae0d64423b50f0012b09ac44 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs new file mode 100644 index 0000000000..e2afe51093 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctiongetitem : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public auctiongetitem() : base(ProtocolType.PROTOCOL_AUCTIONGETITEM) + { + + } + + public override Protocol Clone() => new auctiongetitem + { + Roleid = Roleid, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs.meta new file mode 100644 index 0000000000..35e9c6ce8b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctiongetitem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 710fc6794c9f64da5af84708663ffaca \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs new file mode 100644 index 0000000000..ca7f4de8d4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionlist : Protocol + { + public int Roleid { get; set; } + public short Category { get; set; } + public int Item_id { get; set; } + public int Begin { get; set; } + public byte Reverse { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public auctionlist() : base(ProtocolType.PROTOCOL_AUCTIONLIST) + { + + } + + public override Protocol Clone() => new auctionlist + { + Roleid = Roleid, + Category = Category, + Item_id = Item_id, + Begin = Begin, + Reverse = Reverse, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Category); + os.Write(Item_id); + os.Write(Begin); + os.Write(Reverse); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Category = os.ReadInt16(); + Item_id = os.ReadInt32(); + Begin = os.ReadInt32(); + Reverse = os.ReadByte(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs.meta new file mode 100644 index 0000000000..37a2612953 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: afd3ac7d14fe641419ed7be941950bd1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs new file mode 100644 index 0000000000..a21f93d124 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionlistupdate : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public auctionlistupdate() : base(ProtocolType.PROTOCOL_AUCTIONLISTUPDATE) + { + + } + + public override Protocol Clone() => new auctionlistupdate + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs.meta new file mode 100644 index 0000000000..ffc0c05265 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionlistupdate.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bec9344958c044986bfeb10d6268be11 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs new file mode 100644 index 0000000000..93b2267062 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class auctionopen : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public short Category { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_num { get; set; } + public int Baseprice { get; set; } + public int Binprice { get; set; } + public int Elapse_time { get; set; } + public int Deposit { get; set; } + public Octets Syncdata { get; set; } + public int L_localsid { get; set; } + + public auctionopen() : base(ProtocolType.PROTOCOL_AUCTIONOPEN) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new auctionopen + { + Roleid = Roleid, + Localsid = Localsid, + Category = Category, + Item_id = Item_id, + Item_pos = Item_pos, + Item_num = Item_num, + Baseprice = Baseprice, + Binprice = Binprice, + Elapse_time = Elapse_time, + Deposit = Deposit, + Syncdata = new Octets(Syncdata.ToArray()), + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Category); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_num); + os.Write(Baseprice); + os.Write(Binprice); + os.Write(Elapse_time); + os.Write(Deposit); + os.Write(Syncdata); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Category = os.ReadInt16(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_num = os.ReadInt32(); + Baseprice = os.ReadInt32(); + Binprice = os.ReadInt32(); + Elapse_time = os.ReadInt32(); + Deposit = os.ReadInt32(); + Syncdata = os.ReadOctets(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs.meta new file mode 100644 index 0000000000..61fdca350a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/auctionopen.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6ae18bfd5a85a48319d23fa0d19ec486 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs new file mode 100644 index 0000000000..dee84386d1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class autolockset : Protocol + { + public int Roleid { get; set; } + public int Userid { get; set; } + public int Timeout { get; set; } + public int Localsid { get; set; } + + public autolockset() + : base(ProtocolType.PROTOCOL_AUTOLOCKSET) { } + + public override Protocol Clone() => + new autolockset + { + Roleid = Roleid, + Userid = Userid, + Timeout = Timeout, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Userid); + os.Write(Timeout); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Userid = os.ReadInt32(); + Timeout = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs.meta new file mode 100644 index 0000000000..ef776664fa --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autolockset.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8cb1622b7f7f746c9ae0ef6b7298e429 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs new file mode 100644 index 0000000000..d3e4e65460 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class autoteamplayerleave : Protocol + { + public int Roleid { get; set; } + public byte Reason { get; set; } + public int Localsid { get; set; } + + public autoteamplayerleave() : base(ProtocolType.PROTOCOL_AUTOTEAMPLAYERLEAVE) + { + + } + + public override Protocol Clone() => new autoteamplayerleave + { + Roleid = Roleid, + Reason = Reason, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Reason); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Reason = os.ReadByte(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs.meta new file mode 100644 index 0000000000..afc6af5d72 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/autoteamplayerleave.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 765875f944f034f149443ef1b6e1d2a7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs new file mode 100644 index 0000000000..d92acb0eb9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class battlechallenge : Protocol + { + public int Roleid { get; set; } + public short Id { get; set; } + public int Factionid { get; set; } + public int Deposit { get; set; } + public int Authentication { get; set; } + public int Localsid { get; set; } + public int L_factionid { get; set; } + + public battlechallenge() : base(ProtocolType.PROTOCOL_BATTLECHALLENGE) + { + + } + + public override Protocol Clone() => new battlechallenge + { + Roleid = Roleid, + Id = Id, + Factionid = Factionid, + Deposit = Deposit, + Authentication = Authentication, + Localsid = Localsid, + L_factionid = L_factionid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Id); + os.Write(Factionid); + os.Write(Deposit); + os.Write(Authentication); + os.Write(Localsid); + os.Write(L_factionid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Id = os.ReadInt16(); + Factionid = os.ReadInt32(); + Deposit = os.ReadInt32(); + Authentication = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_factionid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs.meta new file mode 100644 index 0000000000..6f45f6b25b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallenge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c40a9a40562774bebb913a2b26d8521a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs new file mode 100644 index 0000000000..8bf010c111 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class battlechallengemap : Protocol + { + public int Roleid { get; set; } + public int Factionid { get; set; } + public int Localsid { get; set; } + + public battlechallengemap() : base(ProtocolType.PROTOCOL_BATTLECHALLENGEMAP) + { + + } + + public override Protocol Clone() => new battlechallengemap + { + Roleid = Roleid, + Factionid = Factionid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Factionid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Factionid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs.meta new file mode 100644 index 0000000000..582ca8b56b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlechallengemap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b5666eead365841419fa6fcb33496f85 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs new file mode 100644 index 0000000000..b1fdcaaf8a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class battleenter : Protocol + { + public int Roleid { get; set; } + public int Battle_id { get; set; } + public int Localsid { get; set; } + + public battleenter() : base(ProtocolType.PROTOCOL_BATTLEENTER) + { + + } + + public override Protocol Clone() => new battleenter + { + Roleid = Roleid, + Battle_id = Battle_id, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Battle_id); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Battle_id = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs.meta new file mode 100644 index 0000000000..6d0e873d77 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battleenter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7640bb56a24984fe596b4d74589d8927 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs new file mode 100644 index 0000000000..3a26ac1e69 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class battlegetmap : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public battlegetmap() : base(ProtocolType.PROTOCOL_BATTLEGETMAP) + { + + } + + public override Protocol Clone() => new battlegetmap + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs.meta new file mode 100644 index 0000000000..6bafa0f2e3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlegetmap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c1d74a0834c9d4756bc1b17ca07260ec \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs new file mode 100644 index 0000000000..3d37cc66b6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class battlestatus : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public battlestatus() : base(ProtocolType.PROTOCOL_BATTLESTATUS) + { + + } + + public override Protocol Clone() => new battlestatus + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs.meta new file mode 100644 index 0000000000..dc768e0c77 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/battlestatus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7ae57d7354c794bac8a8d98a672c1411 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs new file mode 100644 index 0000000000..2c6a2a382b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class buypoint : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Sellid { get; set; } + public int Seller { get; set; } + + public buypoint() : base(ProtocolType.PROTOCOL_BUYPOINT) + { + + } + + public override Protocol Clone() => new buypoint + { + Roleid = Roleid, + Localsid = Localsid, + Sellid = Sellid, + Seller = Seller + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Sellid); + os.Write(Seller); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Sellid = os.ReadInt32(); + Seller = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs.meta new file mode 100644 index 0000000000..6065ad6903 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/buypoint.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 146db61741bd445de95e94f961c64ede \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs new file mode 100644 index 0000000000..23be817d37 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class cancelwaitqueue : Protocol + { + public int Userid { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public cancelwaitqueue() : base(ProtocolType.PROTOCOL_CANCELWAITQUEUE) + { + + } + + public override Protocol Clone() => new cancelwaitqueue + { + Userid = Userid, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs.meta new file mode 100644 index 0000000000..c34893f1c9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cancelwaitqueue.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 27da9141909894fbba762a8e2a70f1b0 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs new file mode 100644 index 0000000000..37c84d3b63 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class cashlock : Protocol + { + public int Userid { get; set; } + public Octets Cash_password { get; set; } + public int Localsid { get; set; } + public byte Lock { get; set; } + public int L_localsid { get; set; } + + public cashlock() : base(ProtocolType.PROTOCOL_CASHLOCK) + { + Cash_password = new Octets(); + } + + public override Protocol Clone() => new cashlock + { + Userid = Userid, + Cash_password = new Octets(Cash_password.ToArray()), + Localsid = Localsid, + Lock = Lock, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Cash_password); + os.Write(Localsid); + os.Write(Lock); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Cash_password = os.ReadOctets(); + Localsid = os.ReadInt32(); + Lock = os.ReadByte(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs.meta new file mode 100644 index 0000000000..6af5bb0fe5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashlock.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 56eec6e5076674fd49aae1511fdba7da \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs new file mode 100644 index 0000000000..2eb3859bac --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class cashpasswordset : Protocol + { + public int Userid { get; set; } + public Octets Cash_password { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public cashpasswordset() : base(ProtocolType.PROTOCOL_CASHPASSWORDSET) + { + Cash_password = new Octets(); + } + + public override Protocol Clone() => new cashpasswordset + { + Userid = Userid, + Cash_password = new Octets(Cash_password.ToArray()), + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Cash_password); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Cash_password = os.ReadOctets(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs.meta new file mode 100644 index 0000000000..aa0e25042b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/cashpasswordset.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4370751fd92024b7b8d1e850afce78d1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs new file mode 100644 index 0000000000..014f584613 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs @@ -0,0 +1,60 @@ +using System; + +namespace CSNetwork.Protocols +{ + // Corresponds to GNET::Challenge (Type 1) + // Reverted to original structure, inheriting from Protocol + public class challenge : Protocol + { + // Properties based on C++ definition (inl/challenge) + public Octets nonce { get; set; } // GNET::Octets nonce + public uint version { get; set; } // unsigned int version + public byte algo { get; set; } // unsigned int algo + public Octets edition { get; set; } // unsigned int edition + public byte exp_rate { get; set; } // unsigned int exp_rate + + // Original constructor using ProtocolType enum + public challenge() + : base(ProtocolType.PROTOCOL_CHALLENGE) // Assuming PROTOCOL_CHALLENGE is defined + { + nonce = new Octets(); // Initialize nonce + } + + // Restore original Clone method + public override Protocol Clone() => + new challenge + { + nonce = new Octets(nonce.ToArray()), + version = version, + algo = algo, + edition = edition, + exp_rate = exp_rate + }; + + // Restore original Marshal method based on C++ + public override void Marshal(OctetsStream os) + { + os.Write(nonce); + os.Write(version); + os.Write(algo); + os.Write(edition); + os.Write(exp_rate); + } + + // Restore original Unmarshal method based on C++ + public override void Unmarshal(OctetsStream os) + { + nonce = os.ReadOctets(); + version = os.ReadUInt32(); + algo = os.ReadByte(); // Corrected read method for uint + edition = os.ReadOctets(); + exp_rate = os.ReadByte(); + } + + // Restore original PriorPolicy + public override int PriorPolicy() => 100; // Assuming default or original value + + // Restore original ToString method + public override string ToString => $"Challenge(Type={Type}, Nonce={BitConverter.ToString(nonce.ToArray())}, Version={version}, Algo={algo}, Edition={edition}, ExpRate={exp_rate})"; + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs.meta new file mode 100644 index 0000000000..5018d4e509 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/challenge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b3e7d3d12a8e749a8971ab9eb87cba1f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs new file mode 100644 index 0000000000..0b245bb73c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatmessage : Protocol + { + public byte Channel { get; set; } + public byte Emotion { get; set; } + public int Srcroleid { get; set; } + public Octets Msg { get; set; } + public Octets Data { get; set; } + public int Srclevel { get; set; } + + public chatmessage() : base(ProtocolType.PROTOCOL_CHATMESSAGE) + { + Msg = new Octets(); + Data = new Octets(); + } + + public override Protocol Clone() => new chatmessage + { + Channel = Channel, + Emotion = Emotion, + Srcroleid = Srcroleid, + Msg = new Octets(Msg.ToArray()), + Data = new Octets(Data.ToArray()), + Srclevel = Srclevel + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Channel); + os.Write(Emotion); + os.Write(Srcroleid); + os.Write(Msg); + os.Write(Data); + os.Write(Srclevel); + } + + public override void Unmarshal(OctetsStream os) + { + Channel = os.ReadByte(); + Emotion = os.ReadByte(); + Srcroleid = os.ReadInt32(); + Msg = os.ReadOctets(); + Data = os.ReadOctets(); + Srclevel = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs.meta new file mode 100644 index 0000000000..3ae43da95c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatmessage.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e466b960dfce646a1a9993d0fe57ba36 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs new file mode 100644 index 0000000000..824ffb14b3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatroomcreate : Protocol + { + public int Roleid { get; set; } + public Octets Subject { get; set; } + public short Capacity { get; set; } + public Octets Password { get; set; } + public int Localsid { get; set; } + + public chatroomcreate() : base(ProtocolType.PROTOCOL_CHATROOMCREATE) + { + Subject = new Octets(); + Password = new Octets(); + } + + public override Protocol Clone() => new chatroomcreate + { + Roleid = Roleid, + Subject = new Octets(Subject.ToArray()), + Capacity = Capacity, + Password = new Octets(Password.ToArray()), + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Subject); + os.Write(Capacity); + os.Write(Password); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Subject = os.ReadOctets(); + Capacity = os.ReadInt16(); + Password = os.ReadOctets(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 48; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs.meta new file mode 100644 index 0000000000..14c71699ad --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomcreate.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2627f9283f063405ab672d748e4eed71 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs new file mode 100644 index 0000000000..f2584d8940 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatroomexpel : Protocol + { + public short Roomid { get; set; } + public int Roleid { get; set; } + public int Owner { get; set; } + public int Localsid { get; set; } + + public chatroomexpel() : base(ProtocolType.PROTOCOL_CHATROOMEXPEL) + { + + } + + public override Protocol Clone() => new chatroomexpel + { + Roomid = Roomid, + Roleid = Roleid, + Owner = Owner, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roomid); + os.Write(Roleid); + os.Write(Owner); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roomid = os.ReadInt16(); + Roleid = os.ReadInt32(); + Owner = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs.meta new file mode 100644 index 0000000000..63c0798fbd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomexpel.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d1322d57c7072475da87e3ea062a1a13 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs new file mode 100644 index 0000000000..e5ec9d1b50 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatroominvite : Protocol + { + public short Roomid { get; set; } + public int Invitee { get; set; } + public int Inviter { get; set; } + public Octets Name { get; set; } + public Octets Subject { get; set; } + public short Capacity { get; set; } + public short Number { get; set; } + public Octets Password { get; set; } + public int Localsid { get; set; } + + public chatroominvite() : base(ProtocolType.PROTOCOL_CHATROOMINVITE) + { + Name = new Octets(); + Subject = new Octets(); + Password = new Octets(); + } + + public override Protocol Clone() => new chatroominvite + { + Roomid = Roomid, + Invitee = Invitee, + Inviter = Inviter, + Name = new Octets(Name.ToArray()), + Subject = new Octets(Subject.ToArray()), + Capacity = Capacity, + Number = Number, + Password = new Octets(Password.ToArray()), + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roomid); + os.Write(Invitee); + os.Write(Inviter); + os.Write(Name); + os.Write(Subject); + os.Write(Capacity); + os.Write(Number); + os.Write(Password); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roomid = os.ReadInt16(); + Invitee = os.ReadInt32(); + Inviter = os.ReadInt32(); + Name = os.ReadOctets(); + Subject = os.ReadOctets(); + Capacity = os.ReadInt16(); + Number = os.ReadInt16(); + Password = os.ReadOctets(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs.meta new file mode 100644 index 0000000000..bd4003abaa --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroominvite.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 19c304f4fac314663b66cbca1305dde2 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs new file mode 100644 index 0000000000..29de180103 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatroomjoin : Protocol + { + public short Roomid { get; set; } + public int Ownerid { get; set; } + public Octets Ownername { get; set; } + public int Roleid { get; set; } + public Octets Password { get; set; } + public int Localsid { get; set; } + + public chatroomjoin() : base(ProtocolType.PROTOCOL_CHATROOMJOIN) + { + Ownername = new Octets(); + Password = new Octets(); + } + + public override Protocol Clone() => new chatroomjoin + { + Roomid = Roomid, + Ownerid = Ownerid, + Ownername = new Octets(Ownername.ToArray()), + Roleid = Roleid, + Password = new Octets(Password.ToArray()), + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roomid); + os.Write(Ownerid); + os.Write(Ownername); + os.Write(Roleid); + os.Write(Password); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roomid = os.ReadInt16(); + Ownerid = os.ReadInt32(); + Ownername = os.ReadOctets(); + Roleid = os.ReadInt32(); + Password = os.ReadOctets(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 48; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs.meta new file mode 100644 index 0000000000..7f653fd1f2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomjoin.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7e92e25bd25f6403e924a434b9d63ff0 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs new file mode 100644 index 0000000000..ffdb45fdfe --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatroomleave : Protocol + { + public short Roomid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + + public chatroomleave() : base(ProtocolType.PROTOCOL_CHATROOMLEAVE) + { + + } + + public override Protocol Clone() => new chatroomleave + { + Roomid = Roomid, + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roomid); + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roomid = os.ReadInt16(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs.meta new file mode 100644 index 0000000000..bd1a2d1e64 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomleave.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c8234cd2c2a10432abdf9237f5f1863d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs new file mode 100644 index 0000000000..c9f76accbd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatroomlist : Protocol + { + public short Begin { get; set; } + public byte Reverse { get; set; } + public int Localsid { get; set; } + + public chatroomlist() : base(ProtocolType.PROTOCOL_CHATROOMLIST) + { + + } + + public override Protocol Clone() => new chatroomlist + { + Begin = Begin, + Reverse = Reverse, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Begin); + os.Write(Reverse); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Begin = os.ReadInt16(); + Reverse = os.ReadByte(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs.meta new file mode 100644 index 0000000000..a5396df0e9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomlist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: afb17be81adb64a41b90862e2867568c \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs new file mode 100644 index 0000000000..2f63795b6a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class chatroomspeak : Protocol + { + public short Roomid { get; set; } + public byte Emotion { get; set; } + public Octets Message { get; set; } + public int Src { get; set; } + public int Dst { get; set; } + public int Localsid { get; set; } + + public chatroomspeak() : base(ProtocolType.PROTOCOL_CHATROOMSPEAK) + { + Message = new Octets(); + } + + public override Protocol Clone() => new chatroomspeak + { + Roomid = Roomid, + Emotion = Emotion, + Message = new Octets(Message.ToArray()), + Src = Src, + Dst = Dst, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roomid); + os.Write(Emotion); + os.Write(Message); + os.Write(Src); + os.Write(Dst); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roomid = os.ReadInt16(); + Emotion = os.ReadByte(); + Message = os.ReadOctets(); + Src = os.ReadInt32(); + Dst = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs.meta new file mode 100644 index 0000000000..fcd4f2a9fd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/chatroomspeak.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6f924bcab5f9549cd93965cee9844fe0 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs new file mode 100644 index 0000000000..3fcad5be14 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class checknewmail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public checknewmail() : base(ProtocolType.PROTOCOL_CHECKNEWMAIL) + { + + } + + public override Protocol Clone() => new checknewmail + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs.meta new file mode 100644 index 0000000000..1229ac1ec6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/checknewmail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: faef8a98349604c13b16747a922496bb \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs new file mode 100644 index 0000000000..39adf019e5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class collectclientmachineinfo : Protocol + { + public int Userid { get; set; } + public Octets Machineinfo { get; set; } + + public collectclientmachineinfo() : base(ProtocolType.PROTOCOL_COLLECTCLIENTMACHINEINFO) + { + Machineinfo = new Octets(); + } + + public override Protocol Clone() => new collectclientmachineinfo + { + Userid = Userid, + Machineinfo = new Octets(Machineinfo.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Machineinfo); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Machineinfo = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 2048; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs.meta new file mode 100644 index 0000000000..5d6e38e549 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/collectclientmachineinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4007cf9bc15ba48bcb6f7b40c8b231ad \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs new file mode 100644 index 0000000000..ade763ae55 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class complain2gm : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public Octets Rolename { get; set; } + public Octets Comp_rolename { get; set; } + public int Zoneid { get; set; } + public Octets Mapzone { get; set; } + public Octets Content { get; set; } + + public complain2gm() : base(ProtocolType.PROTOCOL_COMPLAIN2GM) + { + Rolename = new Octets(); + Comp_rolename = new Octets(); + Mapzone = new Octets(); + Content = new Octets(); + } + + public override Protocol Clone() => new complain2gm + { + Roleid = Roleid, + Localsid = Localsid, + Rolename = new Octets(Rolename.ToArray()), + Comp_rolename = new Octets(Comp_rolename.ToArray()), + Zoneid = Zoneid, + Mapzone = new Octets(Mapzone.ToArray()), + Content = new Octets(Content.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Rolename); + os.Write(Comp_rolename); + os.Write(Zoneid); + os.Write(Mapzone); + os.Write(Content); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Rolename = os.ReadOctets(); + Comp_rolename = os.ReadOctets(); + Zoneid = os.ReadInt32(); + Mapzone = os.ReadOctets(); + Content = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs.meta new file mode 100644 index 0000000000..788d25fff7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/complain2gm.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 02f34df765d71408a8e8ed11fdca9b17 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs new file mode 100644 index 0000000000..3104852873 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlegetbattlelimit : Protocol + { + public int Roleid { get; set; } + public int Domain_id { get; set; } + + public countrybattlegetbattlelimit() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEGETBATTLELIMIT) + { + + } + + public override Protocol Clone() => new countrybattlegetbattlelimit + { + Roleid = Roleid, + Domain_id = Domain_id + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Domain_id); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Domain_id = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs.meta new file mode 100644 index 0000000000..025751d5c1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetbattlelimit.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a52baeb75c4684a319ac00cb636b6458 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs new file mode 100644 index 0000000000..24f1f9f386 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlegetconfig : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public countrybattlegetconfig() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEGETCONFIG) + { + + } + + public override Protocol Clone() => new countrybattlegetconfig + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs.meta new file mode 100644 index 0000000000..bdebb73db2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetconfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3ac2c65277d6e4403b027614bae6f83d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs new file mode 100644 index 0000000000..7b5a0dfffd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlegetkingcommandpoint : Protocol + { + public int Roleid { get; set; } + + public countrybattlegetkingcommandpoint() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEGETKINGCOMMANDPOINT) + { + + } + + public override Protocol Clone() => new countrybattlegetkingcommandpoint + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs.meta new file mode 100644 index 0000000000..ce8ee690b3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetkingcommandpoint.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0da4342e08b614c4eb73103ea4e3cc02 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs new file mode 100644 index 0000000000..fc1d4a4d55 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlegetmap : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public countrybattlegetmap() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEGETMAP) + { + + } + + public override Protocol Clone() => new countrybattlegetmap + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs.meta new file mode 100644 index 0000000000..6365026c24 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetmap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: db038734535cc408c95f5635ab0ec238 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs new file mode 100644 index 0000000000..0fec903121 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlegetplayerlocation : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public countrybattlegetplayerlocation() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEGETPLAYERLOCATION) + { + + } + + public override Protocol Clone() => new countrybattlegetplayerlocation + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs.meta new file mode 100644 index 0000000000..92dfc6e76e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetplayerlocation.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f867d00a743c54c32b45dbbd465d07a5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs new file mode 100644 index 0000000000..be7ac21d9d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlegetscore : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public countrybattlegetscore() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEGETSCORE) + { + + } + + public override Protocol Clone() => new countrybattlegetscore + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs.meta new file mode 100644 index 0000000000..5113d9b864 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlegetscore.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 310c76bb0119d474089ed3b490939647 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs new file mode 100644 index 0000000000..ac9bf9e7a0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlekingassignassault : Protocol + { + public int King_roleid { get; set; } + public int Domain_id { get; set; } + public byte Assault_type { get; set; } + + public countrybattlekingassignassault() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEKINGASSIGNASSAULT) + { + + } + + public override Protocol Clone() => new countrybattlekingassignassault + { + King_roleid = King_roleid, + Domain_id = Domain_id, + Assault_type = Assault_type + }; + + public override void Marshal(OctetsStream os) + { + os.Write(King_roleid); + os.Write(Domain_id); + os.Write(Assault_type); + } + + public override void Unmarshal(OctetsStream os) + { + King_roleid = os.ReadInt32(); + Domain_id = os.ReadInt32(); + Assault_type = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs.meta new file mode 100644 index 0000000000..d50be29176 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingassignassault.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dad0f79d562854462b84ffe3b6c084bc \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs new file mode 100644 index 0000000000..070b98c9da --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlekingresetbattlelimit : Protocol + { + public int King_roleid { get; set; } + public int Domain_id { get; set; } + public byte Op { get; set; } + + public countrybattlekingresetbattlelimit() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEKINGRESETBATTLELIMIT) + { + + } + + public override Protocol Clone() => new countrybattlekingresetbattlelimit + { + King_roleid = King_roleid, + Domain_id = Domain_id, + Op = Op + }; + + public override void Marshal(OctetsStream os) + { + os.Write(King_roleid); + os.Write(Domain_id); + os.Write(Op); + } + + public override void Unmarshal(OctetsStream os) + { + King_roleid = os.ReadInt32(); + Domain_id = os.ReadInt32(); + Op = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs.meta new file mode 100644 index 0000000000..9764a4e7d1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlekingresetbattlelimit.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ea5f32cd7d7e94d9ca44f0a9ec174a59 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs new file mode 100644 index 0000000000..0592400581 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlemove : Protocol + { + public int Roleid { get; set; } + public int Dest { get; set; } + public int Localsid { get; set; } + + public countrybattlemove() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEMOVE) + { + + } + + public override Protocol Clone() => new countrybattlemove + { + Roleid = Roleid, + Dest = Dest, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Dest); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Dest = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs.meta new file mode 100644 index 0000000000..fecc2853c9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlemove.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b5b57aa16287049d2a38b764a265e02e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs new file mode 100644 index 0000000000..c71fb55d3a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlepreenter : Protocol + { + public int Battle_id { get; set; } + public int Roleid { get; set; } + + public countrybattlepreenter() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEPREENTER) + { + + } + + public override Protocol Clone() => new countrybattlepreenter + { + Battle_id = Battle_id, + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Battle_id); + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Battle_id = os.ReadInt32(); + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs.meta new file mode 100644 index 0000000000..9908351dbb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a703b9e44c1ea41c1bc97d9af4414427 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs new file mode 100644 index 0000000000..094ac3c2f1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlepreenternotify : Protocol + { + public int Battle_id { get; set; } + public int Roleid { get; set; } + public int Timeout { get; set; } + public int Localsid { get; set; } + + public countrybattlepreenternotify() : base(ProtocolType.PROTOCOL_COUNTRYBATTLEPREENTERNOTIFY) + { + + } + + public override Protocol Clone() => new countrybattlepreenternotify + { + Battle_id = Battle_id, + Roleid = Roleid, + Timeout = Timeout, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Battle_id); + os.Write(Roleid); + os.Write(Timeout); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Battle_id = os.ReadInt32(); + Roleid = os.ReadInt32(); + Timeout = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs.meta new file mode 100644 index 0000000000..d27b613b78 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlepreenternotify.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bc0a2c30a82ce4dfa932732f15acaadf \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs new file mode 100644 index 0000000000..4d8e2cf094 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattleresult : Protocol + { + public int Player_bonus { get; set; } + public int Localsid { get; set; } + + public countrybattleresult() : base(ProtocolType.PROTOCOL_COUNTRYBATTLERESULT) + { + + } + + public override Protocol Clone() => new countrybattleresult + { + Player_bonus = Player_bonus, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Player_bonus); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Player_bonus = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs.meta new file mode 100644 index 0000000000..251ff707fd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattleresult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 72255b6f2d22744cb8d0f08b2add84db \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs new file mode 100644 index 0000000000..3a4da747d9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlereturncapital : Protocol + { + public int Roleid { get; set; } + + public countrybattlereturncapital() : base(ProtocolType.PROTOCOL_COUNTRYBATTLERETURNCAPITAL) + { + + } + + public override Protocol Clone() => new countrybattlereturncapital + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs.meta new file mode 100644 index 0000000000..ad98a0c1a3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlereturncapital.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 39006d02a2a154f98b1e6e8e106c2ced \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs new file mode 100644 index 0000000000..efb1c77f12 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlesinglebattleresult : Protocol + { + public int Domain_id { get; set; } + public int Single_battle_total_score { get; set; } + public int Player_single_battle_score { get; set; } + public int Player_rank { get; set; } + public int Localsid { get; set; } + + public countrybattlesinglebattleresult() : base(ProtocolType.PROTOCOL_COUNTRYBATTLESINGLEBATTLERESULT) + { + + } + + public override Protocol Clone() => new countrybattlesinglebattleresult + { + Domain_id = Domain_id, + Single_battle_total_score = Single_battle_total_score, + Player_single_battle_score = Player_single_battle_score, + Player_rank = Player_rank, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Domain_id); + os.Write(Single_battle_total_score); + os.Write(Player_single_battle_score); + os.Write(Player_rank); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Domain_id = os.ReadInt32(); + Single_battle_total_score = os.ReadInt32(); + Player_single_battle_score = os.ReadInt32(); + Player_rank = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs.meta new file mode 100644 index 0000000000..ddc4a14971 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesinglebattleresult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f2718a6ae946b4b86ab8bab311fdfa40 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs new file mode 100644 index 0000000000..8264afeb5d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class countrybattlesyncplayerlocation : Protocol + { + public int Roleid { get; set; } + public int Domain_id { get; set; } + public int Reason { get; set; } + public int Localsid { get; set; } + + public countrybattlesyncplayerlocation() : base(ProtocolType.PROTOCOL_COUNTRYBATTLESYNCPLAYERLOCATION) + { + + } + + public override Protocol Clone() => new countrybattlesyncplayerlocation + { + Roleid = Roleid, + Domain_id = Domain_id, + Reason = Reason, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Domain_id); + os.Write(Reason); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Domain_id = os.ReadInt32(); + Reason = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs.meta new file mode 100644 index 0000000000..775f4ca7a2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/countrybattlesyncplayerlocation.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eddbaafaeee1f423db52d4897158091e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs new file mode 100644 index 0000000000..2c0eb38bd5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class createfactionfortress : Protocol + { + public int Roleid { get; set; } + public int Factionid { get; set; } + public Octets Item_cost { get; set; } + public Octets Fortress_info { get; set; } + public Octets Syncdata { get; set; } + + public createfactionfortress() : base(ProtocolType.PROTOCOL_CREATEFACTIONFORTRESS) + { + Item_cost = new Octets(); + Fortress_info = new Octets(); + Syncdata = new Octets(); + } + + public override Protocol Clone() => new createfactionfortress + { + Roleid = Roleid, + Factionid = Factionid, + Item_cost = new Octets(Item_cost.ToArray()), + Fortress_info = new Octets(Fortress_info.ToArray()), + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Factionid); + os.Write(Item_cost); + os.Write(Fortress_info); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Factionid = os.ReadInt32(); + Item_cost = os.ReadOctets(); + Fortress_info = os.ReadOctets(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131071; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs.meta new file mode 100644 index 0000000000..64a7636a8b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createfactionfortress.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7b7fa4384f8ce4446b98962f4c7e44ba \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs new file mode 100644 index 0000000000..5bfe6615bf --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class createrole : Protocol + { + public int Userid { get; set; } + public int Localsid { get; set; } + public Octets Referid { get; set; } + + public createrole() : base(ProtocolType.PROTOCOL_CREATEROLE) + { + Referid = new Octets(); + } + + public override Protocol Clone() => new createrole + { + Userid = Userid, + Localsid = Localsid, + Referid = new Octets(Referid.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + os.Write(Referid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Referid = os.ReadOctets(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 8192; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs.meta new file mode 100644 index 0000000000..0c36e1e469 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 38049c2c6cf0a42af85bb9f3fba7d884 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs new file mode 100644 index 0000000000..2ce739292e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class deletemail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public byte Mail_id { get; set; } + + public deletemail() : base(ProtocolType.PROTOCOL_DELETEMAIL) + { + + } + + public override Protocol Clone() => new deletemail + { + Roleid = Roleid, + Localsid = Localsid, + Mail_id = Mail_id + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Mail_id); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Mail_id = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs.meta new file mode 100644 index 0000000000..8baa14b6bd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deletemail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2e93204d7b5cd4d37a762d7021cefc38 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs new file mode 100644 index 0000000000..d5a89a3ea1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class deleterole : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public deleterole() : base(ProtocolType.PROTOCOL_DELETEROLE) + { + + } + + public override Protocol Clone() => new deleterole + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs.meta new file mode 100644 index 0000000000..b65a8c5843 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deleterole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 178c5799d47624d7790b6573c4a5c685 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs new file mode 100644 index 0000000000..ce9eb87dcd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class delfriend : Protocol + { + public int Roleid { get; set; } + public int Friendid { get; set; } + public int Localsid { get; set; } + + public delfriend() : base(ProtocolType.PROTOCOL_DELFRIEND) + { + + } + + public override Protocol Clone() => new delfriend + { + Roleid = Roleid, + Friendid = Friendid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Friendid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Friendid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs.meta new file mode 100644 index 0000000000..927bdaac37 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0de507db2414843be9af5c2644fd1b7b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs new file mode 100644 index 0000000000..e0f06f6470 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class deliverrolestatus : Protocol + { + public int Dstroleid { get; set; } + public byte Dstzoneid { get; set; } + public int Srcroleid { get; set; } + public byte Srczoneid { get; set; } + public byte Status { get; set; } + public int Localsid { get; set; } + + public deliverrolestatus() : base(ProtocolType.PROTOCOL_DELIVERROLESTATUS) + { + + } + + public override Protocol Clone() => new deliverrolestatus + { + Dstroleid = Dstroleid, + Dstzoneid = Dstzoneid, + Srcroleid = Srcroleid, + Srczoneid = Srczoneid, + Status = Status, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Dstroleid); + os.Write(Dstzoneid); + os.Write(Srcroleid); + os.Write(Srczoneid); + os.Write(Status); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Dstroleid = os.ReadInt32(); + Dstzoneid = os.ReadByte(); + Srcroleid = os.ReadInt32(); + Srczoneid = os.ReadByte(); + Status = os.ReadByte(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs.meta new file mode 100644 index 0000000000..657b03138c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/deliverrolestatus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 97a54b8a25277404fa7204bde041419b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs new file mode 100644 index 0000000000..66a16cf3d1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class enterworld : Protocol + { + public int Roleid { get; set; } + public int Provider_link_id { get; set; } + public int Locktime { get; set; } + public int Timeout { get; set; } + public int Settime { get; set; } + public uint Localsid { get; set; } + public int L_timeout { get; set; } + + public enterworld() : base(ProtocolType.PROTOCOL_ENTERWORLD) + { + + } + + public override Protocol Clone() => new enterworld + { + Roleid = Roleid, + Provider_link_id = Provider_link_id, + Locktime = Locktime, + Timeout = Timeout, + Settime = Settime, + Localsid = Localsid, + L_timeout = L_timeout + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Provider_link_id); + os.Write(Locktime); + os.Write(Timeout); + os.Write(Settime); + os.Write(Localsid); + os.Write(L_timeout); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Provider_link_id = os.ReadInt32(); + Locktime = os.ReadInt32(); + Timeout = os.ReadInt32(); + Settime = os.ReadInt32(); + Localsid = os.ReadUInt32(); + L_timeout = os.ReadInt32(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs.meta new file mode 100644 index 0000000000..78961a6f1d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/enterworld.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2484048ba0d7a45e1a40d03572fc5938 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs new file mode 100644 index 0000000000..e79acae7df --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class errorinfo : Protocol + { + public int Errcode { get; set; } + public Octets Info { get; set; } + + public errorinfo() : base(ProtocolType.PROTOCOL_ERRORINFO) + { + Info = new Octets(); + } + + public override Protocol Clone() => new errorinfo + { + Errcode = Errcode, + Info = new Octets(Info.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Errcode); + os.Write(Info); + } + + public override void Unmarshal(OctetsStream os) + { + Errcode = os.ReadInt32(); + Info = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs.meta new file mode 100644 index 0000000000..57f1de5bd3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/errorinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e80116b2bf22147a88fb7af68d318fb4 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs new file mode 100644 index 0000000000..ce4b5c9e4d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class exchangeconsumepoints : Protocol + { + public int Roleid { get; set; } + public int Rewardtype { get; set; } + public int Localsid { get; set; } + + public exchangeconsumepoints() : base(ProtocolType.PROTOCOL_EXCHANGECONSUMEPOINTS) + { + + } + + public override Protocol Clone() => new exchangeconsumepoints + { + Roleid = Roleid, + Rewardtype = Rewardtype, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Rewardtype); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Rewardtype = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs.meta new file mode 100644 index 0000000000..ebce425220 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/exchangeconsumepoints.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d1718ba35028e4a5782895aecc2206e4 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs new file mode 100644 index 0000000000..69fa6c1b55 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionacceptjoin : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Factionid { get; set; } + public int Invited_roleid { get; set; } + + public factionacceptjoin() : base(ProtocolType.PROTOCOL_FACTIONACCEPTJOIN) + { + + } + + public override Protocol Clone() => new factionacceptjoin + { + Roleid = Roleid, + Localsid = Localsid, + Factionid = Factionid, + Invited_roleid = Invited_roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Factionid); + os.Write(Invited_roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Factionid = os.ReadInt32(); + Invited_roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs.meta new file mode 100644 index 0000000000..7040a539b2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionacceptjoin.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ca2384728536c40a984f016872ff0e03 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs new file mode 100644 index 0000000000..2a19c16cf8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionchat : Protocol + { + public byte Channel { get; set; } + public byte Emotion { get; set; } + public int Src_roleid { get; set; } + public Octets Msg { get; set; } + public Octets Data { get; set; } + public int Dst_localsid { get; set; } + public byte L_emotion { get; set; } + + public factionchat() : base(ProtocolType.PROTOCOL_FACTIONCHAT) + { + Msg = new Octets(); + Data = new Octets(); + } + + public override Protocol Clone() => new factionchat + { + Channel = Channel, + Emotion = Emotion, + Src_roleid = Src_roleid, + Msg = new Octets(Msg.ToArray()), + Data = new Octets(Data.ToArray()), + Dst_localsid = Dst_localsid, + L_emotion = L_emotion + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Channel); + os.Write(Emotion); + os.Write(Src_roleid); + os.Write(Msg); + os.Write(Data); + os.Write(Dst_localsid); + os.Write(L_emotion); + } + + public override void Unmarshal(OctetsStream os) + { + Channel = os.ReadByte(); + Emotion = os.ReadByte(); + Src_roleid = os.ReadInt32(); + Msg = os.ReadOctets(); + Data = os.ReadOctets(); + Dst_localsid = os.ReadInt32(); + L_emotion = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs.meta new file mode 100644 index 0000000000..978feb50a3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionchat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1f4a1c0307c624b56a5470d1b73d113d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs new file mode 100644 index 0000000000..a22ef56c37 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factiondelayexpelannounce : Protocol + { + public int Retcode { get; set; } + public byte Opt_type { get; set; } + public int Operater { get; set; } + public int Expelroleid { get; set; } + public int Time { get; set; } + public int Localsid { get; set; } + + public factiondelayexpelannounce() : base(ProtocolType.PROTOCOL_FACTIONDELAYEXPELANNOUNCE) + { + + } + + public override Protocol Clone() => new factiondelayexpelannounce + { + Retcode = Retcode, + Opt_type = Opt_type, + Operater = Operater, + Expelroleid = Expelroleid, + Time = Time, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Retcode); + os.Write(Opt_type); + os.Write(Operater); + os.Write(Expelroleid); + os.Write(Time); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Retcode = os.ReadInt32(); + Opt_type = os.ReadByte(); + Operater = os.ReadInt32(); + Expelroleid = os.ReadInt32(); + Time = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs.meta new file mode 100644 index 0000000000..b5cfffa3b2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factiondelayexpelannounce.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ac9dd2635828742e2a3d5cc5b3cf069d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs new file mode 100644 index 0000000000..a38170a2e9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionfortressbattlelist : Protocol + { + public int Roleid { get; set; } + + public factionfortressbattlelist() : base(ProtocolType.PROTOCOL_FACTIONFORTRESSBATTLELIST) + { + + } + + public override Protocol Clone() => new factionfortressbattlelist + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs.meta new file mode 100644 index 0000000000..51211e380f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressbattlelist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9020ad8c877d449c5ab5b9558e1e4e9b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs new file mode 100644 index 0000000000..02062164be --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionfortresschallenge : Protocol + { + public int Roleid { get; set; } + public int Factionid { get; set; } + public int Target_factionid { get; set; } + public Octets Syncdata { get; set; } + + public factionfortresschallenge() : base(ProtocolType.PROTOCOL_FACTIONFORTRESSCHALLENGE) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new factionfortresschallenge + { + Roleid = Roleid, + Factionid = Factionid, + Target_factionid = Target_factionid, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Factionid); + os.Write(Target_factionid); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Factionid = os.ReadInt32(); + Target_factionid = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs.meta new file mode 100644 index 0000000000..8f4032a487 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresschallenge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3082f1d2a184e4c47b314e0238e62cee \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs new file mode 100644 index 0000000000..faa9601946 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionfortressenter : Protocol + { + public int Roleid { get; set; } + public int Factionid { get; set; } + public int Dst_factionid { get; set; } + + public factionfortressenter() : base(ProtocolType.PROTOCOL_FACTIONFORTRESSENTER) + { + + } + + public override Protocol Clone() => new factionfortressenter + { + Roleid = Roleid, + Factionid = Factionid, + Dst_factionid = Dst_factionid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Factionid); + os.Write(Dst_factionid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Factionid = os.ReadInt32(); + Dst_factionid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs.meta new file mode 100644 index 0000000000..602c254e6f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressenter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 62a54cebd480d4fc2ae3d0084b1ad04b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs new file mode 100644 index 0000000000..70b3201b02 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionfortressget : Protocol + { + public int Roleid { get; set; } + public int Factionid { get; set; } + + public factionfortressget() : base(ProtocolType.PROTOCOL_FACTIONFORTRESSGET) + { + + } + + public override Protocol Clone() => new factionfortressget + { + Roleid = Roleid, + Factionid = Factionid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Factionid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Factionid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs.meta new file mode 100644 index 0000000000..401d23c19a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortressget.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 62c692f5764d84795a4d638b4f5a80c7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs new file mode 100644 index 0000000000..2f7238ce5f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionfortresslist : Protocol + { + public int Roleid { get; set; } + public int Begin { get; set; } + + public factionfortresslist() : base(ProtocolType.PROTOCOL_FACTIONFORTRESSLIST) + { + + } + + public override Protocol Clone() => new factionfortresslist + { + Roleid = Roleid, + Begin = Begin + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Begin); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Begin = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs.meta new file mode 100644 index 0000000000..88f9d07f11 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionfortresslist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cfc8dd85e4fa941dfbc68cc9e38cbbbd \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs new file mode 100644 index 0000000000..2e4be3ff01 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionlistonline : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public factionlistonline() : base(ProtocolType.PROTOCOL_FACTIONLISTONLINE) + { + + } + + public override Protocol Clone() => new factionlistonline + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs.meta new file mode 100644 index 0000000000..b47d049eae --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionlistonline.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 48eb959eff3ef4f3498e98e9b2322ed8 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs new file mode 100644 index 0000000000..4b60e28a72 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionoprequest : Protocol + { + public int Optype { get; set; } + public int Roleid { get; set; } + public Octets Params { get; set; } + + public factionoprequest() : base(ProtocolType.PROTOCOL_FACTIONOPREQUEST) + { + Params = new Octets(); + } + + public override Protocol Clone() => new factionoprequest + { + Optype = Optype, + Roleid = Roleid, + Params = new Octets(Params.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Optype); + os.Write(Roleid); + os.Write(Params); + } + + public override void Unmarshal(OctetsStream os) + { + Optype = os.ReadInt32(); + Roleid = os.ReadInt32(); + Params = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs.meta new file mode 100644 index 0000000000..3ed1de54e8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionoprequest.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9a85c1b7812b4401190cf52ba6f70355 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs new file mode 100644 index 0000000000..9b4d225015 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionrelationrecvapply : Protocol + { + public int Apply_type { get; set; } + public int Src_fid { get; set; } + public int Localsid { get; set; } + + public factionrelationrecvapply() : base(ProtocolType.PROTOCOL_FACTIONRELATIONRECVAPPLY) + { + + } + + public override Protocol Clone() => new factionrelationrecvapply + { + Apply_type = Apply_type, + Src_fid = Src_fid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Apply_type); + os.Write(Src_fid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Apply_type = os.ReadInt32(); + Src_fid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs.meta new file mode 100644 index 0000000000..222bee6945 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvapply.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b76099789a247493ea814be4cda8c718 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs new file mode 100644 index 0000000000..dfddf9295c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionrelationrecvreply : Protocol + { + public int Pre_apply_type { get; set; } + public byte Agree { get; set; } + public int Src_fid { get; set; } + public int Localsid { get; set; } + + public factionrelationrecvreply() : base(ProtocolType.PROTOCOL_FACTIONRELATIONRECVREPLY) + { + + } + + public override Protocol Clone() => new factionrelationrecvreply + { + Pre_apply_type = Pre_apply_type, + Agree = Agree, + Src_fid = Src_fid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Pre_apply_type); + os.Write(Agree); + os.Write(Src_fid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Pre_apply_type = os.ReadInt32(); + Agree = os.ReadByte(); + Src_fid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs.meta new file mode 100644 index 0000000000..7a209c0bbf --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrelationrecvreply.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 80f9ab41fdee24e5a8ffa1b99baca081 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs new file mode 100644 index 0000000000..920f979b53 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionrenameannounce : Protocol + { + public int Retcode { get; set; } + public int Operater { get; set; } + public Octets Newname { get; set; } + public int Localsid { get; set; } + + public factionrenameannounce() : base(ProtocolType.PROTOCOL_FACTIONRENAMEANNOUNCE) + { + Newname = new Octets(); + } + + public override Protocol Clone() => new factionrenameannounce + { + Retcode = Retcode, + Operater = Operater, + Newname = new Octets(Newname.ToArray()), + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Retcode); + os.Write(Operater); + os.Write(Newname); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Retcode = os.ReadInt32(); + Operater = os.ReadInt32(); + Newname = os.ReadOctets(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs.meta new file mode 100644 index 0000000000..2f664880c9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionrenameannounce.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d4b141c23f9fd4cf3b16f812ddf320a2 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs new file mode 100644 index 0000000000..2e37c89f5e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionresourcebattlegetmap : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public factionresourcebattlegetmap() : base(ProtocolType.PROTOCOL_FACTIONRESOURCEBATTLEGETMAP) + { + + } + + public override Protocol Clone() => new factionresourcebattlegetmap + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs.meta new file mode 100644 index 0000000000..cd27f97421 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetmap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5b83cf8aabc1e401380fcfca5c7dd54d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs new file mode 100644 index 0000000000..3fd03bd135 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionresourcebattlegetrecord : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public factionresourcebattlegetrecord() : base(ProtocolType.PROTOCOL_FACTIONRESOURCEBATTLEGETRECORD) + { + + } + + public override Protocol Clone() => new factionresourcebattlegetrecord + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs.meta new file mode 100644 index 0000000000..75ba1663c6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlegetrecord.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9617e72e0dbca401083bbcf387f9ba50 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs new file mode 100644 index 0000000000..d6296cddea --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionresourcebattlenotifyplayerevent : Protocol + { + public byte Event_type { get; set; } + public int Roleid { get; set; } + public int Score { get; set; } + public int Localsid { get; set; } + + public factionresourcebattlenotifyplayerevent() : base(ProtocolType.PROTOCOL_FACTIONRESOURCEBATTLENOTIFYPLAYEREVENT) + { + + } + + public override Protocol Clone() => new factionresourcebattlenotifyplayerevent + { + Event_type = Event_type, + Roleid = Roleid, + Score = Score, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Event_type); + os.Write(Roleid); + os.Write(Score); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Event_type = os.ReadByte(); + Roleid = os.ReadInt32(); + Score = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs.meta new file mode 100644 index 0000000000..b084a4bbcd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattlenotifyplayerevent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 98af99454ce0345798b540491c62ea22 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs new file mode 100644 index 0000000000..010faa2d88 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class factionresourcebattleplayerqueryresult : Protocol + { + public int Faction_id { get; set; } + public int Score { get; set; } + public short Rob_horse_count { get; set; } + public short Rob_resource_count { get; set; } + public byte Can_get_bonus { get; set; } + + public factionresourcebattleplayerqueryresult() : base(ProtocolType.PROTOCOL_FACTIONRESOURCEBATTLEPLAYERQUERYRESULT) + { + + } + + public override Protocol Clone() => new factionresourcebattleplayerqueryresult + { + Faction_id = Faction_id, + Score = Score, + Rob_horse_count = Rob_horse_count, + Rob_resource_count = Rob_resource_count, + Can_get_bonus = Can_get_bonus + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Faction_id); + os.Write(Score); + os.Write(Rob_horse_count); + os.Write(Rob_resource_count); + os.Write(Can_get_bonus); + } + + public override void Unmarshal(OctetsStream os) + { + Faction_id = os.ReadInt32(); + Score = os.ReadInt32(); + Rob_horse_count = os.ReadInt16(); + Rob_resource_count = os.ReadInt16(); + Can_get_bonus = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 65536; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs.meta new file mode 100644 index 0000000000..d29efeed59 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/factionresourcebattleplayerqueryresult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5169e57c7990f48009f7d88ec1e35170 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs new file mode 100644 index 0000000000..889e052c09 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class findsellpointinfo : Protocol + { + public int Startid { get; set; } + public int Localsid { get; set; } + public byte Forward { get; set; } + + public findsellpointinfo() : base(ProtocolType.PROTOCOL_FINDSELLPOINTINFO) + { + + } + + public override Protocol Clone() => new findsellpointinfo + { + Startid = Startid, + Localsid = Localsid, + Forward = Forward + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Startid); + os.Write(Localsid); + os.Write(Forward); + } + + public override void Unmarshal(OctetsStream os) + { + Startid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Forward = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs.meta new file mode 100644 index 0000000000..8bad890f1a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/findsellpointinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3546eae13bdb5430f829928c1b5c925b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs new file mode 100644 index 0000000000..30c038650e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class friendextlist : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public friendextlist() : base(ProtocolType.PROTOCOL_FRIENDEXTLIST) + { + + } + + public override Protocol Clone() => new friendextlist + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32768; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs.meta new file mode 100644 index 0000000000..d2eb16ac8a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendextlist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8b42d484002f24d0aa7ea55ab7eff710 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs new file mode 100644 index 0000000000..cada88dfac --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class friendstatus : Protocol + { + public int Roleid { get; set; } + public byte Status { get; set; } + public int Localsid { get; set; } + + public friendstatus() : base(ProtocolType.PROTOCOL_FRIENDSTATUS) + { + + } + + public override Protocol Clone() => new friendstatus + { + Roleid = Roleid, + Status = Status, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Status); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Status = os.ReadByte(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs.meta new file mode 100644 index 0000000000..b4a5799785 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/friendstatus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6144473c4ee1e465c9993db94d922d6e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs new file mode 100644 index 0000000000..c527de42ea --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CSNetwork.C2SCommand; + +namespace CSNetwork.Protocols +{ + public class gamedatasend : Protocol + { + public Octets Data { get; set; } + public CommandID CMDID { get; set; } + public gamedatasend() : base(ProtocolType.PROTOCOL_GAMEDATASEND) + { + Data = new Octets(); + } + + public override Protocol Clone() => new gamedatasend + { + Data = new Octets(Data.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Data); + } + + public override void Unmarshal(OctetsStream os) + { + Data = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 65535; + + public override string ToString => $" Type={Type} - CMD_ID: {Enum.GetName(typeof(CommandID), BitConverter.ToUInt16(Data.ByteArray.Take(2).ToArray()))}"; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs.meta new file mode 100644 index 0000000000..23ac99fa3d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gamedatasend.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5d0b8c48103284b05975d0021c3262f5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs new file mode 100644 index 0000000000..d0f42ea0f8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getcnetserverconfig : Protocol + { + public int Roleid { get; set; } + + public getcnetserverconfig() : base(ProtocolType.PROTOCOL_GETCNETSERVERCONFIG) + { + + } + + public override Protocol Clone() => new getcnetserverconfig + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs.meta new file mode 100644 index 0000000000..39ff834dd6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcnetserverconfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 697530eba868841049046f1e3860db88 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs new file mode 100644 index 0000000000..0cfe5ab66d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getcustomdata : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public getcustomdata() : base(ProtocolType.PROTOCOL_GETCUSTOMDATA) + { + + } + + public override Protocol Clone() => new getcustomdata + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 2048; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs.meta new file mode 100644 index 0000000000..3bd4d87908 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getcustomdata.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c783a52f7d7d64c0e9b9484f77ae0b53 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs new file mode 100644 index 0000000000..dd31179ad1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getfactionbaseinfo : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public getfactionbaseinfo() : base(ProtocolType.PROTOCOL_GETFACTIONBASEINFO) + { + + } + + public override Protocol Clone() => new getfactionbaseinfo + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 4096; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs.meta new file mode 100644 index 0000000000..c246b3fe66 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfactionbaseinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3fbc2e11707d74df8863317f40ea6684 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs new file mode 100644 index 0000000000..ae90a10137 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getfriends : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public getfriends() : base(ProtocolType.PROTOCOL_GETFRIENDS) + { + + } + + public override Protocol Clone() => new getfriends + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 4096; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs.meta new file mode 100644 index 0000000000..947f00265a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getfriends.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 518f818de65ee48a4b9782caa0ee8452 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs new file mode 100644 index 0000000000..befda61672 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gethelpstates : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public gethelpstates() : base(ProtocolType.PROTOCOL_GETHELPSTATES) + { + + } + + public override Protocol Clone() => new gethelpstates + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs.meta new file mode 100644 index 0000000000..59a4d6384c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gethelpstates.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b9fbff82e576c45d6940d30dc9f49b64 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs new file mode 100644 index 0000000000..0537427a57 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getmail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public byte Mail_id { get; set; } + + public getmail() : base(ProtocolType.PROTOCOL_GETMAIL) + { + + } + + public override Protocol Clone() => new getmail + { + Roleid = Roleid, + Localsid = Localsid, + Mail_id = Mail_id + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Mail_id); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Mail_id = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs.meta new file mode 100644 index 0000000000..1a64a784f2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2d7c610b30a2a4164a2241deffd12766 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs new file mode 100644 index 0000000000..1fad4dd11d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getmailattachobj : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public byte Mail_id { get; set; } + public byte Obj_type { get; set; } + public Octets Syncdata { get; set; } + + public getmailattachobj() : base(ProtocolType.PROTOCOL_GETMAILATTACHOBJ) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new getmailattachobj + { + Roleid = Roleid, + Localsid = Localsid, + Mail_id = Mail_id, + Obj_type = Obj_type, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Mail_id); + os.Write(Obj_type); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Mail_id = os.ReadByte(); + Obj_type = os.ReadByte(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 102400; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs.meta new file mode 100644 index 0000000000..863ae5883b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmailattachobj.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 57fcbc8dd560f4a5caaf23adfd672379 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs new file mode 100644 index 0000000000..690fd09caa --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getmaillist : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public getmaillist() : base(ProtocolType.PROTOCOL_GETMAILLIST) + { + + } + + public override Protocol Clone() => new getmaillist + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs.meta new file mode 100644 index 0000000000..583f53e783 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getmaillist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c3189cdb82ac645dfb0cd50b77401ef2 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs new file mode 100644 index 0000000000..7e3e343026 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getplayerbriefinfo : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public byte Reason { get; set; } + + public getplayerbriefinfo() : base(ProtocolType.PROTOCOL_GETPLAYERBRIEFINFO) + { + + } + + public override Protocol Clone() => new getplayerbriefinfo + { + Roleid = Roleid, + Localsid = Localsid, + Reason = Reason + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Reason); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Reason = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 2048; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs.meta new file mode 100644 index 0000000000..5e0b07ee9f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerbriefinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 09760d058b53f4e0d9af8147e2743798 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs new file mode 100644 index 0000000000..e84b9aa74c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getplayerfactioninfo : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public getplayerfactioninfo() : base(ProtocolType.PROTOCOL_GETPLAYERFACTIONINFO) + { + + } + + public override Protocol Clone() => new getplayerfactioninfo + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 4096; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs.meta new file mode 100644 index 0000000000..1f4d4f55b8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayerfactioninfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f5f9390cc63be4914a12a68caa7b7e3e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs new file mode 100644 index 0000000000..cee612c5bb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getplayeridbyname : Protocol + { + public Octets Rolename { get; set; } + public int Localsid { get; set; } + public byte Reason { get; set; } + public byte L_reason { get; set; } + + public getplayeridbyname() : base(ProtocolType.PROTOCOL_GETPLAYERIDBYNAME) + { + Rolename = new Octets(); + } + + public override Protocol Clone() => new getplayeridbyname + { + Rolename = new Octets(Rolename.ToArray()), + Localsid = Localsid, + Reason = Reason, + L_reason = L_reason + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Rolename); + os.Write(Localsid); + os.Write(Reason); + os.Write(L_reason); + } + + public override void Unmarshal(OctetsStream os) + { + Rolename = os.ReadOctets(); + Localsid = os.ReadInt32(); + Reason = os.ReadByte(); + L_reason = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs.meta new file mode 100644 index 0000000000..d96a51034e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getplayeridbyname.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1169009bd90b1403fa08de2fba614609 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs new file mode 100644 index 0000000000..da3ba9d18b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getrewardlist : Protocol + { + public int Roleid { get; set; } + public int Start_index { get; set; } + public int Localsid { get; set; } + + public getrewardlist() : base(ProtocolType.PROTOCOL_GETREWARDLIST) + { + + } + + public override Protocol Clone() => new getrewardlist + { + Roleid = Roleid, + Start_index = Start_index, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Start_index); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Start_index = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs.meta new file mode 100644 index 0000000000..5ddab3a05f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getrewardlist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d9cc414015a874efea82f4ec97612e51 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs new file mode 100644 index 0000000000..c0f660f4b5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getsavedmsg : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public getsavedmsg() : base(ProtocolType.PROTOCOL_GETSAVEDMSG) + { + + } + + public override Protocol Clone() => new getsavedmsg + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs.meta new file mode 100644 index 0000000000..ac50e6561c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getsavedmsg.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2458d930f0f254c12ac03cb940d24b85 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs new file mode 100644 index 0000000000..8b1a2d7d06 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getselllist : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public getselllist() : base(ProtocolType.PROTOCOL_GETSELLLIST) + { + + } + + public override Protocol Clone() => new getselllist + { + Roleid = Roleid, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs.meta new file mode 100644 index 0000000000..fcfb01582e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getselllist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1d75bd74f3ece45bf801e493c3578b63 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs new file mode 100644 index 0000000000..d154154a44 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class getuiconfig : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public getuiconfig() : base(ProtocolType.PROTOCOL_GETUICONFIG) + { + + } + + public override Protocol Clone() => new getuiconfig + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs.meta new file mode 100644 index 0000000000..6598ec3168 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/getuiconfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5782071a2cb4f4456b9a62e24c8dffdb \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs new file mode 100644 index 0000000000..7c906040e7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmforbidrole : Protocol + { + public byte Fbd_type { get; set; } + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Dstroleid { get; set; } + public int Forbid_time { get; set; } + public Octets Reason { get; set; } + + public gmforbidrole() : base(ProtocolType.PROTOCOL_GMFORBIDROLE) + { + Reason = new Octets(); + } + + public override Protocol Clone() => new gmforbidrole + { + Fbd_type = Fbd_type, + Gmroleid = Gmroleid, + Localsid = Localsid, + Dstroleid = Dstroleid, + Forbid_time = Forbid_time, + Reason = new Octets(Reason.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Fbd_type); + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Dstroleid); + os.Write(Forbid_time); + os.Write(Reason); + } + + public override void Unmarshal(OctetsStream os) + { + Fbd_type = os.ReadByte(); + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Dstroleid = os.ReadInt32(); + Forbid_time = os.ReadInt32(); + Reason = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs.meta new file mode 100644 index 0000000000..41c3fbc87a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmforbidrole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a1e0fcec5b4954c70ba4db43ab713836 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs new file mode 100644 index 0000000000..fa55d721f0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmgetplayerconsumeinfo : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public byte Reason { get; set; } + + public gmgetplayerconsumeinfo() : base(ProtocolType.PROTOCOL_GMGETPLAYERCONSUMEINFO) + { + + } + + public override Protocol Clone() => new gmgetplayerconsumeinfo + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Reason = Reason + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Reason); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Reason = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs.meta new file mode 100644 index 0000000000..75f7bb458c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmgetplayerconsumeinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 921f1587eadf64858abd4141b93d6626 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs new file mode 100644 index 0000000000..6900eeb070 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmkickoutrole : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Kickroleid { get; set; } + public int Forbid_time { get; set; } + public Octets Reason { get; set; } + public int L_forbid_time { get; set; } + + public gmkickoutrole() : base(ProtocolType.PROTOCOL_GMKICKOUTROLE) + { + Reason = new Octets(); + } + + public override Protocol Clone() => new gmkickoutrole + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Kickroleid = Kickroleid, + Forbid_time = Forbid_time, + Reason = new Octets(Reason.ToArray()), + L_forbid_time = L_forbid_time + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Kickroleid); + os.Write(Forbid_time); + os.Write(Reason); + os.Write(L_forbid_time); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Kickroleid = os.ReadInt32(); + Forbid_time = os.ReadInt32(); + Reason = os.ReadOctets(); + L_forbid_time = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs.meta new file mode 100644 index 0000000000..1eb6ae5a7d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutrole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f0b0d9cbbf4e6443fb5611743921fe93 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs new file mode 100644 index 0000000000..efd3337605 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmkickoutuser : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Kickuserid { get; set; } + public int Forbid_time { get; set; } + public Octets Reason { get; set; } + public int L_forbid_time { get; set; } + + public gmkickoutuser() : base(ProtocolType.PROTOCOL_GMKICKOUTUSER) + { + Reason = new Octets(); + } + + public override Protocol Clone() => new gmkickoutuser + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Kickuserid = Kickuserid, + Forbid_time = Forbid_time, + Reason = new Octets(Reason.ToArray()), + L_forbid_time = L_forbid_time + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Kickuserid); + os.Write(Forbid_time); + os.Write(Reason); + os.Write(L_forbid_time); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Kickuserid = os.ReadInt32(); + Forbid_time = os.ReadInt32(); + Reason = os.ReadOctets(); + L_forbid_time = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs.meta new file mode 100644 index 0000000000..5ca5c8694c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmkickoutuser.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6f901630301ca49c7ac8f9c335f3497a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs new file mode 100644 index 0000000000..e5bbe4a6a2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmlistonlineuser : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Handler { get; set; } + public Octets Cond { get; set; } + + public gmlistonlineuser() : base(ProtocolType.PROTOCOL_GMLISTONLINEUSER) + { + Cond = new Octets(); + } + + public override Protocol Clone() => new gmlistonlineuser + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Handler = Handler, + Cond = new Octets(Cond.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Handler); + os.Write(Cond); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Handler = os.ReadInt32(); + Cond = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs.meta new file mode 100644 index 0000000000..d79fc8e21c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmlistonlineuser.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f24de6364e55d464285aa456efd4dfb6 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs new file mode 100644 index 0000000000..bd761b8300 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmonlinenum : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + + public gmonlinenum() : base(ProtocolType.PROTOCOL_GMONLINENUM) + { + + } + + public override Protocol Clone() => new gmonlinenum + { + Gmroleid = Gmroleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs.meta new file mode 100644 index 0000000000..b3a71de4e7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmonlinenum.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5c8cf099f66b04cc9ad73e448458b3db \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs new file mode 100644 index 0000000000..255e54cf50 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmrestartserver : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Gsid { get; set; } + public int Restart_time { get; set; } + + public gmrestartserver() : base(ProtocolType.PROTOCOL_GMRESTARTSERVER) + { + + } + + public override Protocol Clone() => new gmrestartserver + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Gsid = Gsid, + Restart_time = Restart_time + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Gsid); + os.Write(Restart_time); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Gsid = os.ReadInt32(); + Restart_time = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs.meta new file mode 100644 index 0000000000..da46b16b4b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmrestartserver.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c06f020e74a6545f596a438c0dd2fbaa \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs new file mode 100644 index 0000000000..38e0835683 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmsettimelessautolock : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Dstroleid { get; set; } + public byte Enable { get; set; } + + public gmsettimelessautolock() : base(ProtocolType.PROTOCOL_GMSETTIMELESSAUTOLOCK) + { + + } + + public override Protocol Clone() => new gmsettimelessautolock + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Dstroleid = Dstroleid, + Enable = Enable + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Dstroleid); + os.Write(Enable); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Dstroleid = os.ReadInt32(); + Enable = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs.meta new file mode 100644 index 0000000000..7c2b6cf469 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmsettimelessautolock.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7828c60371389439698d87b8f74a7af8 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs new file mode 100644 index 0000000000..68c8680042 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmshutup : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Dstuserid { get; set; } + public int Forbid_time { get; set; } + public Octets Reason { get; set; } + + public gmshutup() : base(ProtocolType.PROTOCOL_GMSHUTUP) + { + Reason = new Octets(); + } + + public override Protocol Clone() => new gmshutup + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Dstuserid = Dstuserid, + Forbid_time = Forbid_time, + Reason = new Octets(Reason.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Dstuserid); + os.Write(Forbid_time); + os.Write(Reason); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Dstuserid = os.ReadInt32(); + Forbid_time = os.ReadInt32(); + Reason = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs.meta new file mode 100644 index 0000000000..9f32705bda --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutup.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9d8368989b6d6416fab841b06974bd89 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs new file mode 100644 index 0000000000..7727d71c7b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmshutuprole : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public int Dstroleid { get; set; } + public int Forbid_time { get; set; } + public Octets Reason { get; set; } + + public gmshutuprole() : base(ProtocolType.PROTOCOL_GMSHUTUPROLE) + { + Reason = new Octets(); + } + + public override Protocol Clone() => new gmshutuprole + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Dstroleid = Dstroleid, + Forbid_time = Forbid_time, + Reason = new Octets(Reason.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Dstroleid); + os.Write(Forbid_time); + os.Write(Reason); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Dstroleid = os.ReadInt32(); + Forbid_time = os.ReadInt32(); + Reason = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 256; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs.meta new file mode 100644 index 0000000000..e9e9500858 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmshutuprole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 92dff41805ec5491c98bdf6faf02365a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs new file mode 100644 index 0000000000..7aae9ef9b7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class gmtogglechat : Protocol + { + public int Gmroleid { get; set; } + public int Localsid { get; set; } + public byte Enable { get; set; } + + public gmtogglechat() : base(ProtocolType.PROTOCOL_GMTOGGLECHAT) + { + + } + + public override Protocol Clone() => new gmtogglechat + { + Gmroleid = Gmroleid, + Localsid = Localsid, + Enable = Enable + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gmroleid); + os.Write(Localsid); + os.Write(Enable); + } + + public override void Unmarshal(OctetsStream os) + { + Gmroleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Enable = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs.meta new file mode 100644 index 0000000000..89c9c7b980 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/gmtogglechat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 456085895a4624a6aab46425f558dd90 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs new file mode 100644 index 0000000000..f59eb1cb6d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class kecandidateapply : Protocol + { + public int Roleid { get; set; } + public int Item_id { get; set; } + public int Item_num { get; set; } + public Octets Syncdata { get; set; } + + public kecandidateapply() : base(ProtocolType.PROTOCOL_KECANDIDATEAPPLY) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new kecandidateapply + { + Roleid = Roleid, + Item_id = Item_id, + Item_num = Item_num, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Item_id); + os.Write(Item_num); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_num = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs.meta new file mode 100644 index 0000000000..b7d0e82e63 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kecandidateapply.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dda98adfe6b3e42d5bd61e939bb49e10 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs new file mode 100644 index 0000000000..1df55f0176 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class kegetstatus : Protocol + { + public int Roleid { get; set; } + + public kegetstatus() : base(ProtocolType.PROTOCOL_KEGETSTATUS) + { + + } + + public override Protocol Clone() => new kegetstatus + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs.meta new file mode 100644 index 0000000000..4bcb766088 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kegetstatus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5ba5cfea371d0482280ea11357be6a9c \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs new file mode 100644 index 0000000000..1a279d87a2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class kevoting : Protocol + { + public int Roleid { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_num { get; set; } + public int Candidate_roleid { get; set; } + public Octets Syncdata { get; set; } + + public kevoting() : base(ProtocolType.PROTOCOL_KEVOTING) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new kevoting + { + Roleid = Roleid, + Item_id = Item_id, + Item_pos = Item_pos, + Item_num = Item_num, + Candidate_roleid = Candidate_roleid, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_num); + os.Write(Candidate_roleid); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_num = os.ReadInt32(); + Candidate_roleid = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs.meta new file mode 100644 index 0000000000..3e5225bff5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/kevoting.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 943791455500941efb4199de3bad4c0a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs new file mode 100644 index 0000000000..14376cf6a1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class keyreestablish : Protocol + { + public int Roleid { get; set; } + public int Userid { get; set; } + public byte Flag { get; set; } + public int Src_zoneid { get; set; } + public Octets Random { get; set; } + public int L_src_zoneid { get; set; } + + public keyreestablish() : base(ProtocolType.PROTOCOL_KEYREESTABLISH) + { + Random = new Octets(); + } + + public override Protocol Clone() => new keyreestablish + { + Roleid = Roleid, + Userid = Userid, + Flag = Flag, + Src_zoneid = Src_zoneid, + Random = new Octets(Random.ToArray()), + L_src_zoneid = L_src_zoneid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Userid); + os.Write(Flag); + os.Write(Src_zoneid); + os.Write(Random); + os.Write(L_src_zoneid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Userid = os.ReadInt32(); + Flag = os.ReadByte(); + Src_zoneid = os.ReadInt32(); + Random = os.ReadOctets(); + L_src_zoneid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs.meta new file mode 100644 index 0000000000..b8dfa575da --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/keyreestablish.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 37d40734e704042388464186ce9f6e75 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs new file mode 100644 index 0000000000..8dc600b0b3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class matrixchallenge : Protocol + { + public int Algorithm { get; set; } + public int Nonce { get; set; } + public int L_nonce { get; set; } + + public matrixchallenge() : base(ProtocolType.PROTOCOL_MATRIXCHALLENGE) + { + + } + + public override Protocol Clone() => new matrixchallenge + { + Algorithm = Algorithm, + Nonce = Nonce, + L_nonce = L_nonce + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Algorithm); + os.Write(Nonce); + os.Write(L_nonce); + } + + public override void Unmarshal(OctetsStream os) + { + Algorithm = os.ReadInt32(); + Nonce = os.ReadInt32(); + L_nonce = os.ReadInt32(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs.meta new file mode 100644 index 0000000000..c5fa645585 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixchallenge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7aad8b2ba6dfa436eaa8c6faeba5ead5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs new file mode 100644 index 0000000000..d52e571ca2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class matrixresponse : Protocol + { + public int Response { get; set; } + + public matrixresponse() : base(ProtocolType.PROTOCOL_MATRIXRESPONSE) + { + + } + + public override Protocol Clone() => new matrixresponse + { + Response = Response + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Response); + } + + public override void Unmarshal(OctetsStream os) + { + Response = os.ReadInt32(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs.meta new file mode 100644 index 0000000000..c5484ecd56 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/matrixresponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6666830670b9b4f1397a811efa05a238 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs new file mode 100644 index 0000000000..40cb09b02a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class onlineannounce : Protocol + { + + + public int Userid { get; set; } + public uint Localsid { get; set; } + public int Remain_time { get; set; } + public byte Zoneid { get; set; } + public int Free_time_left { get; set; } + public int Free_time_end { get; set; } + public int Creatime { get; set; } + public byte Referrer_flag { get; set; } + public byte Passwd_flag { get; set; } + public byte Usbbind { get; set; } + public byte Accountinfo_flag { get; set; } + + public onlineannounce() : base(ProtocolType.PROTOCOL_ONLINEANNOUNCE) + { + + } + + public override Protocol Clone() => new onlineannounce + { + Userid = Userid, + Localsid = Localsid, + Remain_time = Remain_time, + Zoneid = Zoneid, + Free_time_left = Free_time_left, + Free_time_end = Free_time_end, + Creatime = Creatime, + Referrer_flag = Referrer_flag, + Passwd_flag = Passwd_flag, + Usbbind = Usbbind, + Accountinfo_flag = Accountinfo_flag, + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + os.Write(Remain_time); + os.Write(Zoneid); + os.Write(Free_time_left); + os.Write(Free_time_end); + os.Write(Creatime); + os.Write(Referrer_flag); + os.Write(Passwd_flag); + os.Write(Usbbind); + os.Write(Accountinfo_flag); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadUInt32(); + Remain_time = os.ReadInt32(); + Zoneid = os.ReadByte(); + Free_time_left = os.ReadInt32(); + Free_time_end = os.ReadInt32(); + Creatime = os.ReadInt32(); + Referrer_flag = os.ReadByte(); + Passwd_flag = os.ReadByte(); + Usbbind = os.ReadByte(); + Accountinfo_flag = os.ReadByte(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 64; + + public override string ToString => $"Userid: {Userid}, Localsid: {Localsid}, Remain_time: {Remain_time}, Zoneid: {Zoneid}, Free_time_left: {Free_time_left}, Free_time_end: {Free_time_end}, Creatime: {Creatime}, Referrer_flag: {Referrer_flag}, Passwd_flag: {Passwd_flag}, Usbbind: {Usbbind}, Accountinfo_flag: {Accountinfo_flag}"; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs.meta new file mode 100644 index 0000000000..876fc9bb02 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/onlineannounce.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5debf91bf72494cef90e1a49927abd02 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs new file mode 100644 index 0000000000..6bbd2ee58a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playeraccuse : Protocol + { + public int Roleid { get; set; } + public int Dst_roleid { get; set; } + public Octets Content { get; set; } + + public playeraccuse() : base(ProtocolType.PROTOCOL_PLAYERACCUSE) + { + Content = new Octets(); + } + + public override Protocol Clone() => new playeraccuse + { + Roleid = Roleid, + Dst_roleid = Dst_roleid, + Content = new Octets(Content.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Dst_roleid); + os.Write(Content); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Dst_roleid = os.ReadInt32(); + Content = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs.meta new file mode 100644 index 0000000000..479ad93aa3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playeraccuse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b3a7073bc8b534153a3aa73becab33ee \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs new file mode 100644 index 0000000000..2e135903e8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playerbaseinfo : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public playerbaseinfo() : base(ProtocolType.PROTOCOL_PLAYERBASEINFO) + { + + } + + public override Protocol Clone() => new playerbaseinfo + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 2048; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs.meta new file mode 100644 index 0000000000..2e4852c37f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 930dfab774e5e47bfb8f33be0ddad9b0 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs new file mode 100644 index 0000000000..d120f81411 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs @@ -0,0 +1,47 @@ +using CSNetwork.Protocols.rpcdata; +using System; +using System.Collections.Generic; +using System.Text; + +namespace CSNetwork.Protocols +{ + public class playerbaseinfo_re : Protocol + { + public int Retcode { get; set; } + public int Roleid { get; set; } + public uint Localsid { get; set; } + public GRoleBase Player { get; set; } + + public playerbaseinfo_re() : base(ProtocolType.PROTOCOL_PLAYERBASEINFO_RE) + { + Player = new GRoleBase(); + } + + public override Protocol Clone() => new playerbaseinfo_re + { + Retcode = Retcode, + Roleid = Roleid, + Localsid = Localsid, + Player = Player + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Retcode); + os.Write(Roleid); + Player.Marshal(os); + } + + public override void Unmarshal(OctetsStream os) + { + Retcode = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadUInt32(); + Player.Unmarshal(os); + } + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1536; + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs.meta new file mode 100644 index 0000000000..34211ea861 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfo_re.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bbc6cba74d97941b79f5f7183d2d74e1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs new file mode 100644 index 0000000000..7a703c5923 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playerbaseinfocrc : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public playerbaseinfocrc() : base(ProtocolType.PROTOCOL_PLAYERBASEINFOCRC) + { + + } + + public override Protocol Clone() => new playerbaseinfocrc + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs.meta new file mode 100644 index 0000000000..bd47e3da91 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerbaseinfocrc.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eaf622e5c6f864e6f8707b07ec50d7ab \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs new file mode 100644 index 0000000000..bff70ce596 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playerlogout : Protocol + { + public int Result { get; set; } + public int Roleid { get; set; } + public int Provider_link_id { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public playerlogout() : base(ProtocolType.PROTOCOL_PLAYERLOGOUT) + { + + } + + public override Protocol Clone() => new playerlogout + { + Result = Result, + Roleid = Roleid, + Provider_link_id = Provider_link_id, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Result); + os.Write(Roleid); + os.Write(Provider_link_id); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Result = os.ReadInt32(); + Roleid = os.ReadInt32(); + Provider_link_id = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs.meta new file mode 100644 index 0000000000..ebdd504c20 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerlogout.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 346a64042ab914b3f92aa4ae3773152a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs new file mode 100644 index 0000000000..f94785d8ea --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playernameupdate : Protocol + { + public int Roleid { get; set; } + public Octets Newname { get; set; } + + public playernameupdate() : base(ProtocolType.PROTOCOL_PLAYERNAMEUPDATE) + { + Newname = new Octets(); + } + + public override Protocol Clone() => new playernameupdate + { + Roleid = Roleid, + Newname = new Octets(Newname.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Newname); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Newname = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs.meta new file mode 100644 index 0000000000..10a91b66be --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playernameupdate.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 921b4e26f807a40c8b3abfb6d6bc0be9 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs new file mode 100644 index 0000000000..3c0d409b3a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playerprofilegetmatchresult : Protocol + { + public int Roleid { get; set; } + public int Match_mode { get; set; } + public int Localsid { get; set; } + + public playerprofilegetmatchresult() : base(ProtocolType.PROTOCOL_PLAYERPROFILEGETMATCHRESULT) + { + + } + + public override Protocol Clone() => new playerprofilegetmatchresult + { + Roleid = Roleid, + Match_mode = Match_mode, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Match_mode); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Match_mode = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs.meta new file mode 100644 index 0000000000..976391904f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetmatchresult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 10cd6f55249934b07ba8bc11c9b1d37d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs new file mode 100644 index 0000000000..011b1201be --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playerprofilegetprofiledata : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public playerprofilegetprofiledata() : base(ProtocolType.PROTOCOL_PLAYERPROFILEGETPROFILEDATA) + { + + } + + public override Protocol Clone() => new playerprofilegetprofiledata + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs.meta new file mode 100644 index 0000000000..ff729866dc --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilegetprofiledata.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5268af06aeae24e8d8f5070e3bd5d5fe \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs new file mode 100644 index 0000000000..dac801e3c6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playerprofilesetprofiledata : Protocol + { + public int Roleid { get; set; } + + public playerprofilesetprofiledata() : base(ProtocolType.PROTOCOL_PLAYERPROFILESETPROFILEDATA) + { + + } + + public override Protocol Clone() => new playerprofilesetprofiledata + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs.meta new file mode 100644 index 0000000000..169505fee2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playerprofilesetprofiledata.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4170781ba359e47a4b74f16148818016 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs new file mode 100644 index 0000000000..c2caecaa90 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playersendmail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Receiver { get; set; } + public Octets Title { get; set; } + public Octets Context { get; set; } + public int Attach_obj_id { get; set; } + public int Attach_obj_num { get; set; } + public int Attach_obj_pos { get; set; } + public int Attach_money { get; set; } + public Octets Sender_name { get; set; } + public Octets Syncdata { get; set; } + public int L_attach_obj_num { get; set; } + + public playersendmail() : base(ProtocolType.PROTOCOL_PLAYERSENDMAIL) + { + Title = new Octets(); + Context = new Octets(); + Sender_name = new Octets(); + Syncdata = new Octets(); + } + + public override Protocol Clone() => new playersendmail + { + Roleid = Roleid, + Localsid = Localsid, + Receiver = Receiver, + Title = new Octets(Title.ToArray()), + Context = new Octets(Context.ToArray()), + Attach_obj_id = Attach_obj_id, + Attach_obj_num = Attach_obj_num, + Attach_obj_pos = Attach_obj_pos, + Attach_money = Attach_money, + Sender_name = new Octets(Sender_name.ToArray()), + Syncdata = new Octets(Syncdata.ToArray()), + L_attach_obj_num = L_attach_obj_num + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Receiver); + os.Write(Title); + os.Write(Context); + os.Write(Attach_obj_id); + os.Write(Attach_obj_num); + os.Write(Attach_obj_pos); + os.Write(Attach_money); + os.Write(Sender_name); + os.Write(Syncdata); + os.Write(L_attach_obj_num); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Receiver = os.ReadInt32(); + Title = os.ReadOctets(); + Context = os.ReadOctets(); + Attach_obj_id = os.ReadInt32(); + Attach_obj_num = os.ReadInt32(); + Attach_obj_pos = os.ReadInt32(); + Attach_money = os.ReadInt32(); + Sender_name = os.ReadOctets(); + Syncdata = os.ReadOctets(); + L_attach_obj_num = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 102400; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs.meta new file mode 100644 index 0000000000..ce22021380 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 62261cd514ae24849b4ad88249e53678 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs new file mode 100644 index 0000000000..ab47027df5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class playersendmassmail : Protocol + { + public byte Mass_type { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + public Octets Title { get; set; } + public Octets Context { get; set; } + public Octets Sender_name { get; set; } + public int Cost_obj_id { get; set; } + public int Cost_obj_num { get; set; } + public int Cost_obj_pos { get; set; } + public int Cost_money { get; set; } + public Octets Syncdata { get; set; } + public int L_cost_obj_pos { get; set; } + + public playersendmassmail() : base(ProtocolType.PROTOCOL_PLAYERSENDMASSMAIL) + { + Title = new Octets(); + Context = new Octets(); + Sender_name = new Octets(); + Syncdata = new Octets(); + } + + public override Protocol Clone() => new playersendmassmail + { + Mass_type = Mass_type, + Roleid = Roleid, + Localsid = Localsid, + Title = new Octets(Title.ToArray()), + Context = new Octets(Context.ToArray()), + Sender_name = new Octets(Sender_name.ToArray()), + Cost_obj_id = Cost_obj_id, + Cost_obj_num = Cost_obj_num, + Cost_obj_pos = Cost_obj_pos, + Cost_money = Cost_money, + Syncdata = new Octets(Syncdata.ToArray()), + L_cost_obj_pos = L_cost_obj_pos + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Mass_type); + os.Write(Roleid); + os.Write(Localsid); + os.Write(Title); + os.Write(Context); + os.Write(Sender_name); + os.Write(Cost_obj_id); + os.Write(Cost_obj_num); + os.Write(Cost_obj_pos); + os.Write(Cost_money); + os.Write(Syncdata); + os.Write(L_cost_obj_pos); + } + + public override void Unmarshal(OctetsStream os) + { + Mass_type = os.ReadByte(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Title = os.ReadOctets(); + Context = os.ReadOctets(); + Sender_name = os.ReadOctets(); + Cost_obj_id = os.ReadInt32(); + Cost_obj_num = os.ReadInt32(); + Cost_obj_pos = os.ReadInt32(); + Cost_money = os.ReadInt32(); + Syncdata = os.ReadOctets(); + L_cost_obj_pos = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs.meta new file mode 100644 index 0000000000..d30afbe27c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/playersendmassmail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b17e034fd11ee4d9d96827fded820233 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs new file mode 100644 index 0000000000..0d5d9c9137 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class preservemail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public byte Mail_id { get; set; } + public byte Blpreserve { get; set; } + + public preservemail() : base(ProtocolType.PROTOCOL_PRESERVEMAIL) + { + + } + + public override Protocol Clone() => new preservemail + { + Roleid = Roleid, + Localsid = Localsid, + Mail_id = Mail_id, + Blpreserve = Blpreserve + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Mail_id); + os.Write(Blpreserve); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Mail_id = os.ReadByte(); + Blpreserve = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs.meta new file mode 100644 index 0000000000..9b0b4a0525 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/preservemail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 546b56867ba89405eb211a43cd2e65e6 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs new file mode 100644 index 0000000000..596c22f3d3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class privatechat : Protocol + { + public byte Channel { get; set; } + public byte Emotion { get; set; } + public Octets Src_name { get; set; } + public int Srcroleid { get; set; } + public Octets Dst_name { get; set; } + public int Dstroleid { get; set; } + public Octets Msg { get; set; } + public Octets Data { get; set; } + public int Src_level { get; set; } + + public privatechat() : base(ProtocolType.PROTOCOL_PRIVATECHAT) + { + Src_name = new Octets(); + Dst_name = new Octets(); + Msg = new Octets(); + Data = new Octets(); + } + + public override Protocol Clone() => new privatechat + { + Channel = Channel, + Emotion = Emotion, + Src_name = new Octets(Src_name.ToArray()), + Srcroleid = Srcroleid, + Dst_name = new Octets(Dst_name.ToArray()), + Dstroleid = Dstroleid, + Msg = new Octets(Msg.ToArray()), + Data = new Octets(Data.ToArray()), + Src_level = Src_level + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Channel); + os.Write(Emotion); + os.Write(Src_name); + os.Write(Srcroleid); + os.Write(Dst_name); + os.Write(Dstroleid); + os.Write(Msg); + os.Write(Data); + os.Write(Src_level); + } + + public override void Unmarshal(OctetsStream os) + { + Channel = os.ReadByte(); + Emotion = os.ReadByte(); + Src_name = os.ReadOctets(); + Srcroleid = os.ReadInt32(); + Dst_name = os.ReadOctets(); + Dstroleid = os.ReadInt32(); + Msg = os.ReadOctets(); + Data = os.ReadOctets(); + Src_level = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs.meta new file mode 100644 index 0000000000..45c461e2e9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/privatechat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f0c3639e418ae4d8ab6ee6373262aa72 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs new file mode 100644 index 0000000000..2ae9472e0e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopactive : Protocol + { + public int Roleid { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_num { get; set; } + public Octets Syncdata { get; set; } + public int L_item_num { get; set; } + + public pshopactive() : base(ProtocolType.PROTOCOL_PSHOPACTIVE) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new pshopactive + { + Roleid = Roleid, + Item_id = Item_id, + Item_pos = Item_pos, + Item_num = Item_num, + Syncdata = new Octets(Syncdata.ToArray()), + L_item_num = L_item_num + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_num); + os.Write(Syncdata); + os.Write(L_item_num); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_num = os.ReadInt32(); + Syncdata = os.ReadOctets(); + L_item_num = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs.meta new file mode 100644 index 0000000000..64ee4c0cc5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopactive.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 924fac3d9574746a29fff3366b167473 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs new file mode 100644 index 0000000000..1b019cf6de --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopbuy : Protocol + { + public int Roleid { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_count { get; set; } + public int Item_price { get; set; } + + public pshopbuy() : base(ProtocolType.PROTOCOL_PSHOPBUY) + { + + } + + public override Protocol Clone() => new pshopbuy + { + Roleid = Roleid, + Item_id = Item_id, + Item_pos = Item_pos, + Item_count = Item_count, + Item_price = Item_price + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_count); + os.Write(Item_price); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_count = os.ReadInt32(); + Item_price = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs.meta new file mode 100644 index 0000000000..749c8a3a76 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopbuy.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8bb55c081d12243b5a7f802a5591538c \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs new file mode 100644 index 0000000000..1d628ad55e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopcancelgoods : Protocol + { + public int Roleid { get; set; } + public int Canceltype { get; set; } + public int Pos { get; set; } + + public pshopcancelgoods() : base(ProtocolType.PROTOCOL_PSHOPCANCELGOODS) + { + + } + + public override Protocol Clone() => new pshopcancelgoods + { + Roleid = Roleid, + Canceltype = Canceltype, + Pos = Pos + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Canceltype); + os.Write(Pos); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Canceltype = os.ReadInt32(); + Pos = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs.meta new file mode 100644 index 0000000000..98554913f6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcancelgoods.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 636dd72bf8d7b4b8eaa9ae37741eceb5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs new file mode 100644 index 0000000000..5829873c6e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopcleargoods : Protocol + { + public int Roleid { get; set; } + + public pshopcleargoods() : base(ProtocolType.PROTOCOL_PSHOPCLEARGOODS) + { + + } + + public override Protocol Clone() => new pshopcleargoods + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs.meta new file mode 100644 index 0000000000..0772089c96 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcleargoods.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 648f69cb2451246c79e20b6a7e3d21ae \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs new file mode 100644 index 0000000000..64e928ee0e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopcreate : Protocol + { + public int Roleid { get; set; } + public int Shoptype { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_num { get; set; } + public Octets Syncdata { get; set; } + public int L_item_pos { get; set; } + + public pshopcreate() : base(ProtocolType.PROTOCOL_PSHOPCREATE) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new pshopcreate + { + Roleid = Roleid, + Shoptype = Shoptype, + Item_id = Item_id, + Item_pos = Item_pos, + Item_num = Item_num, + Syncdata = new Octets(Syncdata.ToArray()), + L_item_pos = L_item_pos + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Shoptype); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_num); + os.Write(Syncdata); + os.Write(L_item_pos); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Shoptype = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_num = os.ReadInt32(); + Syncdata = os.ReadOctets(); + L_item_pos = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs.meta new file mode 100644 index 0000000000..97fae30778 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopcreate.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 915199c5518ab49d884a40cc9e00f347 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs new file mode 100644 index 0000000000..0118a8a145 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopdrawitem : Protocol + { + public int Roleid { get; set; } + public int Item_pos { get; set; } + public Octets Syncdata { get; set; } + + public pshopdrawitem() : base(ProtocolType.PROTOCOL_PSHOPDRAWITEM) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new pshopdrawitem + { + Roleid = Roleid, + Item_pos = Item_pos, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Item_pos); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs.meta new file mode 100644 index 0000000000..1de49db7f2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopdrawitem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2e996ed021a4d45af8964a8b156c593d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs new file mode 100644 index 0000000000..6dcac593cf --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshoplist : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Shoptype { get; set; } + + public pshoplist() : base(ProtocolType.PROTOCOL_PSHOPLIST) + { + + } + + public override Protocol Clone() => new pshoplist + { + Roleid = Roleid, + Localsid = Localsid, + Shoptype = Shoptype + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Shoptype); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Shoptype = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs.meta new file mode 100644 index 0000000000..1b8f0de8ab --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3fdb967d17e78408b80814422f643096 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs new file mode 100644 index 0000000000..cb12d58c31 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshoplistitem : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Itemid { get; set; } + public byte Listtype { get; set; } + public int Page_num { get; set; } + public byte L_listtype { get; set; } + + public pshoplistitem() : base(ProtocolType.PROTOCOL_PSHOPLISTITEM) + { + + } + + public override Protocol Clone() => new pshoplistitem + { + Roleid = Roleid, + Localsid = Localsid, + Itemid = Itemid, + Listtype = Listtype, + Page_num = Page_num, + L_listtype = L_listtype + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Itemid); + os.Write(Listtype); + os.Write(Page_num); + os.Write(L_listtype); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Itemid = os.ReadInt32(); + Listtype = os.ReadByte(); + Page_num = os.ReadInt32(); + L_listtype = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs.meta new file mode 100644 index 0000000000..8787aa1bc4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshoplistitem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dc9c7b7368be24b32b6cc4c930a8b4a0 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs new file mode 100644 index 0000000000..57525d774e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopmanagefund : Protocol + { + public int Roleid { get; set; } + public int Optype { get; set; } + public int Money { get; set; } + public int Yinpiao { get; set; } + public Octets Syncdata { get; set; } + public int L_money { get; set; } + + public pshopmanagefund() : base(ProtocolType.PROTOCOL_PSHOPMANAGEFUND) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new pshopmanagefund + { + Roleid = Roleid, + Optype = Optype, + Money = Money, + Yinpiao = Yinpiao, + Syncdata = new Octets(Syncdata.ToArray()), + L_money = L_money + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Optype); + os.Write(Money); + os.Write(Yinpiao); + os.Write(Syncdata); + os.Write(L_money); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Optype = os.ReadInt32(); + Money = os.ReadInt32(); + Yinpiao = os.ReadInt32(); + Syncdata = os.ReadOctets(); + L_money = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs.meta new file mode 100644 index 0000000000..e9ca9d4456 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopmanagefund.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dfff89f830f8b464ca4d02bbba57bced \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs new file mode 100644 index 0000000000..2580b5e964 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopplayerbuy : Protocol + { + public int Roleid { get; set; } + public int Master { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_count { get; set; } + public int Yp_cost { get; set; } + public Octets Syncdata { get; set; } + + public pshopplayerbuy() : base(ProtocolType.PROTOCOL_PSHOPPLAYERBUY) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new pshopplayerbuy + { + Roleid = Roleid, + Master = Master, + Item_id = Item_id, + Item_pos = Item_pos, + Item_count = Item_count, + Yp_cost = Yp_cost, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Master); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_count); + os.Write(Yp_cost); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Master = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_count = os.ReadInt32(); + Yp_cost = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs.meta new file mode 100644 index 0000000000..6ce7c9b04a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerbuy.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9a3aad680e2ee47e89ae684f956e34b7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs new file mode 100644 index 0000000000..64ddebceb6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopplayerget : Protocol + { + public int Roleid { get; set; } + public int Master { get; set; } + + public pshopplayerget() : base(ProtocolType.PROTOCOL_PSHOPPLAYERGET) + { + + } + + public override Protocol Clone() => new pshopplayerget + { + Roleid = Roleid, + Master = Master + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Master); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Master = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs.meta new file mode 100644 index 0000000000..7b86470984 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayerget.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8b4e9b81ac2444b9593681ff35a08a9e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs new file mode 100644 index 0000000000..deac9b586c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopplayersell : Protocol + { + public int Roleid { get; set; } + public int Master { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_count { get; set; } + public int Item_price { get; set; } + public int Inv_pos { get; set; } + public Octets Syncdata { get; set; } + + public pshopplayersell() : base(ProtocolType.PROTOCOL_PSHOPPLAYERSELL) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new pshopplayersell + { + Roleid = Roleid, + Master = Master, + Item_id = Item_id, + Item_pos = Item_pos, + Item_count = Item_count, + Item_price = Item_price, + Inv_pos = Inv_pos, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Master); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_count); + os.Write(Item_price); + os.Write(Inv_pos); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Master = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_count = os.ReadInt32(); + Item_price = os.ReadInt32(); + Inv_pos = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs.meta new file mode 100644 index 0000000000..a96aef4e22 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopplayersell.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f51794367cc464c919ad5254867c4139 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs new file mode 100644 index 0000000000..da6e00fbe6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopselfget : Protocol + { + public int Roleid { get; set; } + + public pshopselfget() : base(ProtocolType.PROTOCOL_PSHOPSELFGET) + { + + } + + public override Protocol Clone() => new pshopselfget + { + Roleid = Roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs.meta new file mode 100644 index 0000000000..753b2d893a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopselfget.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: df3ed6f227c034b06b4f972e1b8b5d7d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs new file mode 100644 index 0000000000..782586aef4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopsell : Protocol + { + public int Roleid { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_count { get; set; } + public int Item_price { get; set; } + public int Inv_pos { get; set; } + public Octets Syncdata { get; set; } + + public pshopsell() : base(ProtocolType.PROTOCOL_PSHOPSELL) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new pshopsell + { + Roleid = Roleid, + Item_id = Item_id, + Item_pos = Item_pos, + Item_count = Item_count, + Item_price = Item_price, + Inv_pos = Inv_pos, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_count); + os.Write(Item_price); + os.Write(Inv_pos); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_count = os.ReadInt32(); + Item_price = os.ReadInt32(); + Inv_pos = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs.meta new file mode 100644 index 0000000000..045eb5c707 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsell.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 93e8ddb7a47254846b18b62155d11a12 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs new file mode 100644 index 0000000000..c6dcef6535 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class pshopsettype : Protocol + { + public int Roleid { get; set; } + public int Newtype { get; set; } + + public pshopsettype() : base(ProtocolType.PROTOCOL_PSHOPSETTYPE) + { + + } + + public override Protocol Clone() => new pshopsettype + { + Roleid = Roleid, + Newtype = Newtype + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Newtype); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Newtype = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs.meta new file mode 100644 index 0000000000..aa6e8beb01 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/pshopsettype.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8c2712e46ec71442da562626b33adfd7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs new file mode 100644 index 0000000000..4bd6bee704 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class publicchat : Protocol + { + public byte Channel { get; set; } + public byte Emotion { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + public Octets Msg { get; set; } + public Octets Data { get; set; } + + public publicchat() : base(ProtocolType.PROTOCOL_PUBLICCHAT) + { + Msg = new Octets(); + Data = new Octets(); + } + + public override Protocol Clone() => new publicchat + { + Channel = Channel, + Emotion = Emotion, + Roleid = Roleid, + Localsid = Localsid, + Msg = new Octets(Msg.ToArray()), + Data = new Octets(Data.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Channel); + os.Write(Emotion); + os.Write(Roleid); + os.Write(Localsid); + os.Write(Msg); + os.Write(Data); + } + + public override void Unmarshal(OctetsStream os) + { + Channel = os.ReadByte(); + Emotion = os.ReadByte(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Msg = os.ReadOctets(); + Data = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs.meta new file mode 100644 index 0000000000..7cf62978b6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/publicchat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f3f3103a4493046cda72f7dea73590cf \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs new file mode 100644 index 0000000000..8dd46cf3c6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class qpaddcash : Protocol + { + public int Userid { get; set; } + public int Cash { get; set; } + public int Cash_after_discount { get; set; } + public int Merchant_id { get; set; } + + public qpaddcash() : base(ProtocolType.PROTOCOL_QPADDCASH) + { + + } + + public override Protocol Clone() => new qpaddcash + { + Userid = Userid, + Cash = Cash, + Cash_after_discount = Cash_after_discount, + Merchant_id = Merchant_id + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Cash); + os.Write(Cash_after_discount); + os.Write(Merchant_id); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Cash = os.ReadInt32(); + Cash_after_discount = os.ReadInt32(); + Merchant_id = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs.meta new file mode 100644 index 0000000000..454e4d470d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpaddcash.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a3db8233d44a44e8e85bf4a3950551f0 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs new file mode 100644 index 0000000000..beebd59d39 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class qpannouncediscount : Protocol + { + public int Localsid { get; set; } + + public qpannouncediscount() : base(ProtocolType.PROTOCOL_QPANNOUNCEDISCOUNT) + { + + } + + public override Protocol Clone() => new qpannouncediscount + { + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs.meta new file mode 100644 index 0000000000..b30c188c8e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpannouncediscount.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7cfa2d6aecc95472f930bf07a05782cb \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs new file mode 100644 index 0000000000..cae782d76b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class qpgetactivatedservices : Protocol + { + public int Userid { get; set; } + + public qpgetactivatedservices() : base(ProtocolType.PROTOCOL_QPGETACTIVATEDSERVICES) + { + + } + + public override Protocol Clone() => new qpgetactivatedservices + { + Userid = Userid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs.meta new file mode 100644 index 0000000000..bac8907fb7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qpgetactivatedservices.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4e501eb518b1d4dd38737ee5e7043274 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs new file mode 100644 index 0000000000..8e362f388c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class qqaddfriend : Protocol + { + public int Srcroleid { get; set; } + public byte Srczoneid { get; set; } + public Octets Srcrolename { get; set; } + public int Dstroleid { get; set; } + public byte Dstzoneid { get; set; } + public Octets Dstrolename { get; set; } + public int Localsid { get; set; } + + public qqaddfriend() : base(ProtocolType.PROTOCOL_QQADDFRIEND) + { + Srcrolename = new Octets(); + Dstrolename = new Octets(); + } + + public override Protocol Clone() => new qqaddfriend + { + Srcroleid = Srcroleid, + Srczoneid = Srczoneid, + Srcrolename = new Octets(Srcrolename.ToArray()), + Dstroleid = Dstroleid, + Dstzoneid = Dstzoneid, + Dstrolename = new Octets(Dstrolename.ToArray()), + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Srcroleid); + os.Write(Srczoneid); + os.Write(Srcrolename); + os.Write(Dstroleid); + os.Write(Dstzoneid); + os.Write(Dstrolename); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Srcroleid = os.ReadInt32(); + Srczoneid = os.ReadByte(); + Srcrolename = os.ReadOctets(); + Dstroleid = os.ReadInt32(); + Dstzoneid = os.ReadByte(); + Dstrolename = os.ReadOctets(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs.meta new file mode 100644 index 0000000000..53acf2d79d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/qqaddfriend.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bcba0ded58f764291b4b54f416d40182 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs new file mode 100644 index 0000000000..ccb6384ce5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class refgetreferencecode : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public refgetreferencecode() : base(ProtocolType.PROTOCOL_REFGETREFERENCECODE) + { + + } + + public override Protocol Clone() => new refgetreferencecode + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs.meta new file mode 100644 index 0000000000..dc00aa6883 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refgetreferencecode.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 857209224650040bfbbcc5afc5608503 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs new file mode 100644 index 0000000000..42e3c8f45f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class reflistreferrals : Protocol + { + public int Roleid { get; set; } + public int Start_index { get; set; } + public int Localsid { get; set; } + + public reflistreferrals() : base(ProtocolType.PROTOCOL_REFLISTREFERRALS) + { + + } + + public override Protocol Clone() => new reflistreferrals + { + Roleid = Roleid, + Start_index = Start_index, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Start_index); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Start_index = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs.meta new file mode 100644 index 0000000000..8df9fb1b09 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reflistreferrals.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8689cab7b06ee4764bb20f3e8410fd05 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs new file mode 100644 index 0000000000..11efb3b96c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class refwithdrawbonus : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public refwithdrawbonus() : base(ProtocolType.PROTOCOL_REFWITHDRAWBONUS) + { + + } + + public override Protocol Clone() => new refwithdrawbonus + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs.meta new file mode 100644 index 0000000000..055e758b93 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/refwithdrawbonus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b45a7064f0a5b42b289452f744bc7680 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs new file mode 100644 index 0000000000..5a0f05dc07 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class report2gm : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public Octets Rolename { get; set; } + public int Zoneid { get; set; } + public Octets Mapzone { get; set; } + public Octets Content { get; set; } + public int Aid { get; set; } + public Octets Line { get; set; } + public int Com_roleid { get; set; } + public Octets Com_rolename { get; set; } + + public report2gm() : base(ProtocolType.PROTOCOL_REPORT2GM) + { + Rolename = new Octets(); + Mapzone = new Octets(); + Content = new Octets(); + Line = new Octets(); + Com_rolename = new Octets(); + } + + public override Protocol Clone() => new report2gm + { + Roleid = Roleid, + Localsid = Localsid, + Rolename = new Octets(Rolename.ToArray()), + Zoneid = Zoneid, + Mapzone = new Octets(Mapzone.ToArray()), + Content = new Octets(Content.ToArray()), + Aid = Aid, + Line = new Octets(Line.ToArray()), + Com_roleid = Com_roleid, + Com_rolename = new Octets(Com_rolename.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Rolename); + os.Write(Zoneid); + os.Write(Mapzone); + os.Write(Content); + os.Write(Aid); + os.Write(Line); + os.Write(Com_roleid); + os.Write(Com_rolename); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Rolename = os.ReadOctets(); + Zoneid = os.ReadInt32(); + Mapzone = os.ReadOctets(); + Content = os.ReadOctets(); + Aid = os.ReadInt32(); + Line = os.ReadOctets(); + Com_roleid = os.ReadInt32(); + Com_rolename = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs.meta new file mode 100644 index 0000000000..94f3a197fb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/report2gm.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 223536b0117104af99884e7a76d5b28e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs new file mode 100644 index 0000000000..8d15cbea7c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class reportchat : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Dst_roleid { get; set; } + public Octets Dst_rolename { get; set; } + public Octets Content { get; set; } + + public reportchat() : base(ProtocolType.PROTOCOL_REPORTCHAT) + { + Dst_rolename = new Octets(); + Content = new Octets(); + } + + public override Protocol Clone() => new reportchat + { + Roleid = Roleid, + Localsid = Localsid, + Dst_roleid = Dst_roleid, + Dst_rolename = new Octets(Dst_rolename.ToArray()), + Content = new Octets(Content.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Dst_roleid); + os.Write(Dst_rolename); + os.Write(Content); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Dst_roleid = os.ReadInt32(); + Dst_rolename = os.ReadOctets(); + Content = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs.meta new file mode 100644 index 0000000000..ea08a7a23a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/reportchat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1ed33c3dd93fd4ff3bddac024cccf641 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs new file mode 100644 index 0000000000..71fafbb9c5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs @@ -0,0 +1,137 @@ +using System; +using System.Security.Cryptography; // Added for MD5 and HMACMD5 + +namespace CSNetwork.Protocols +{ + // Corresponds to GNET::Response (Type 3) + public class response : Protocol + { + // Properties based on C++ definition (inl/response) + public Octets identity { get; set; } // GNET::Octets identity + public Octets response_data { get; set; } // GNET::Octets response - Renamed to avoid conflict with class name + public byte use_token { get; set; } // char use_token + public Octets cli_fingerprint { get; set; } // GNET::Octets cli_fingerprint + + // Original constructor using ProtocolType enum + public response() + : base(ProtocolType.PROTOCOL_RESPONSE) // Assuming PROTOCOL_RESPONSE is defined + { + identity = new Octets(); + response_data = new Octets(); + cli_fingerprint = new Octets(); + // use_token default is 0 (byte default) + } + + // Added Parameterized Constructor (Matches C++ version) + public response(Octets l_identity, Octets l_response_data, byte l_use_token, Octets l_cli_fingerprint) + : base(ProtocolType.PROTOCOL_RESPONSE) + { + identity = l_identity; + response_data = l_response_data; + use_token = l_use_token; + cli_fingerprint = l_cli_fingerprint; + } + + // Restore original Clone method + public override Protocol Clone() => + new response + { + identity = new Octets(identity.ToArray()), // Assuming Octets has a constructor taking byte[] + response_data = new Octets(response_data.ToArray()), + use_token = use_token, + cli_fingerprint = new Octets(cli_fingerprint.ToArray()) + }; + + // Restore original Marshal method based on C++ + public override void Marshal(OctetsStream os) + { + os.Write(identity); + os.Write(response_data); + os.Write(use_token); + os.Write(cli_fingerprint); + } + + // Restore original Unmarshal method based on C++ + public override void Unmarshal(OctetsStream os) + { + identity = os.ReadOctets(); + response_data = os.ReadOctets(); + use_token = os.ReadByte(); + cli_fingerprint = os.ReadOctets(); + } + + // Updated PriorPolicy to match C++ + public override int PriorPolicy() => 101; // Changed from 100 to 101 + + // Added SizePolicy method (Matches C++ version) + // Assuming base Protocol class has a virtual SizePolicy method + public override bool SizePolicy(int size) // Using int for size, adjust if needed + { + return size <= 512; + } + + // Added Setup method (Matches C++ version) + // Uses standard .NET Cryptography classes + public void Setup(Octets name, Octets passwd, Octets challenge) + { + byte[] digestBytes; + byte[] responseBytes; + + // Calculate MD5 hash of name + passwd + using (MD5 md5 = MD5.Create()) + { + // Assuming Octets has ToArray() or similar to get byte[] + byte[] nameBytes = name.ToArray(); + byte[] passwdBytes = passwd.ToArray(); + byte[] combined = new byte[nameBytes.Length + passwdBytes.Length]; + Buffer.BlockCopy(nameBytes, 0, combined, 0, nameBytes.Length); + Buffer.BlockCopy(passwdBytes, 0, combined, nameBytes.Length, passwdBytes.Length); + digestBytes = md5.ComputeHash(combined); + } + + // Calculate HMAC-MD5 using the digest as the key + using (HMACMD5 hmac = new HMACMD5(digestBytes)) + { + // Assuming Octets has ToArray() or similar to get byte[] + responseBytes = hmac.ComputeHash(challenge.ToArray()); + } + + // Assign results back to Octets properties + // Assuming Octets has a constructor or method to accept byte[] + response_data = new Octets(responseBytes); + identity = new Octets(name.ToArray()); // Keep identity as the original name bytes + + // C++ code explicitly sets identity using replace(name.begin(), name.size()) + // If your Octets.Replace takes byte[], this is equivalent: + // identity.Replace(name.ToArray()); + // If identity should be a *new* Octets instance with name's data: + // identity = new Octets(name.ToArray()); // Choose based on Octets implementation + + use_token = 0; + } + + // Added Process method placeholder (Matches C++ version) + // TODO: Implement actual processing logic based on your Manager/Session structure + // Need to define or import Manager and SessionID types + // public override void Process(Manager manager, SessionID sid) + // { + // // Placeholder for processing logic + // Console.WriteLine($"Processing Response protocol for session {sid}"); + // } + + // Restore original ToString method logic using BitConverter + public override string ToString + { + get + { + // Use BitConverter.ToString and assume Octets has ToArray() or similar + // Added null checks for safety + string identityHex = identity != null ? BitConverter.ToString(identity.ToArray()).Replace("-", "") : "null"; + string responseDataHex = response_data != null ? BitConverter.ToString(response_data.ToArray()).Replace("-", "") : "null"; + string fingerprintHex = cli_fingerprint != null ? BitConverter.ToString(cli_fingerprint.ToArray()).Replace("-", "") : "null"; + + return $"Response(Type={Type}, Identity={identityHex}, ResponseData={responseDataHex}, UseToken={use_token}, Fingerprint={fingerprintHex})"; + } + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs.meta new file mode 100644 index 0000000000..b345153cf9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/response.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4b782ebc4283c4d10b42e7de6404315e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs new file mode 100644 index 0000000000..9f17e67718 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class rewardmaturenotice : Protocol + { + public int Roleid { get; set; } + public int Bonus_reward { get; set; } + public int Localsid { get; set; } + + public rewardmaturenotice() : base(ProtocolType.PROTOCOL_REWARDMATURENOTICE) + { + + } + + public override Protocol Clone() => new rewardmaturenotice + { + Roleid = Roleid, + Bonus_reward = Bonus_reward, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Bonus_reward); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Bonus_reward = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs.meta new file mode 100644 index 0000000000..cd17fc74b7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rewardmaturenotice.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9b18dfffd635f4832af8369a0c63a7d4 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs new file mode 100644 index 0000000000..d2b297e3a7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class rolelist : Protocol + { + public int Userid { get; set; } + public uint Localsid { get; set; } + public int Handle { get; set; } + + public rolelist() : base(ProtocolType.PROTOCOL_ROLELIST) + { + + } + + public override Protocol Clone() => new rolelist + { + Userid = Userid, + Localsid = Localsid, + Handle = Handle + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + os.Write(Handle); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadUInt32(); + Handle = os.ReadInt32(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs.meta new file mode 100644 index 0000000000..9011ed9d0a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolelist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 919cff54132fd42b2bc9797c7f3e68ce \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs new file mode 100644 index 0000000000..6621ff1d70 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class rolestatusannounce : Protocol + { + public byte Zoneid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + public byte Status { get; set; } + public Octets Rolename { get; set; } + + public rolestatusannounce() : base(ProtocolType.PROTOCOL_ROLESTATUSANNOUNCE) + { + Rolename = new Octets(); + } + + public override Protocol Clone() => new rolestatusannounce + { + Zoneid = Zoneid, + Roleid = Roleid, + Localsid = Localsid, + Status = Status, + Rolename = new Octets(Rolename.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Zoneid); + os.Write(Roleid); + os.Write(Localsid); + os.Write(Status); + os.Write(Rolename); + } + + public override void Unmarshal(OctetsStream os) + { + Zoneid = os.ReadByte(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Status = os.ReadByte(); + Rolename = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs.meta new file mode 100644 index 0000000000..26df3d14ac --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rolestatusannounce.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a10652fbc7e6c4ab3adc0b6c8f5c1416 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata.meta new file mode 100644 index 0000000000..132f76e94a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 87c7276d201944c52b7e9146185555c2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs new file mode 100644 index 0000000000..388eebfb40 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +namespace CSNetwork.Protocols.rpcdata +{ + public class GRoleBase : IMarshallable + { + public char version; + public uint id; + public Octets name; + public int race; + public int cls; + public byte gender; + public Octets custom_data; + public Octets config_data; + public uint custom_stamp; + public byte status; + public int delete_time; + public int create_time; + public int lastlogin_time; + public List forbid = new List(); + public Octets help_states; + public int reserved1; + public int reserved2; + public int reserved3; + + public GRoleBase() { } + + public GRoleBase( + char l_version, uint l_id, Octets l_name, int l_race, int l_cls, byte l_gender, + Octets l_custom_data, Octets l_config_data, uint l_custom_stamp, byte l_status, + int l_delete_time, int l_create_time, int l_lastlogin_time, + List l_forbid, Octets l_help_states, + int l_reserved1, int l_reserved2, int l_reserved3) + { + version = l_version; + id = l_id; + name = l_name; + race = l_race; + cls = l_cls; + gender = l_gender; + custom_data = l_custom_data; + config_data = l_config_data; + custom_stamp = l_custom_stamp; + status = l_status; + delete_time = l_delete_time; + create_time = l_create_time; + lastlogin_time = l_lastlogin_time; + forbid = l_forbid ?? new List(); + help_states = l_help_states; + reserved1 = l_reserved1; + reserved2 = l_reserved2; + reserved3 = l_reserved3; + } + + public void Marshal(OctetsStream os) + { + // Serialize in a fixed order (must match Unmarshal). + os.Write((byte)version); // store char as byte + os.Write(id); + os.Write(name); + os.Write(race); + os.Write(cls); + os.Write(gender); + os.Write(custom_data); + os.Write(config_data); + os.Write(custom_stamp); + os.Write(status); + os.Write(delete_time); + os.Write(create_time); + os.Write(lastlogin_time); + os.WriteList(forbid); + os.Write(help_states); + os.Write(reserved1); + os.Write(reserved2); + os.Write(reserved3); + } + + public void Unmarshal(OctetsStream os) + { + // Must read back in exactly the same order as Marshal. + version = (char)os.ReadByte(); + id = os.ReadUInt32(); + name = os.ReadOctets(); + race = os.ReadInt32(); + cls = os.ReadInt32(); + gender = os.ReadByte(); + custom_data = os.ReadOctets(); + config_data = os.ReadOctets(); + custom_stamp = os.ReadUInt32(); + status = os.ReadByte(); + delete_time = os.ReadInt32(); + create_time = os.ReadInt32(); + lastlogin_time = os.ReadInt32(); + os.ReadList(forbid); + help_states = os.ReadOctets(); + reserved1 = os.ReadInt32(); + reserved2 = os.ReadInt32(); + reserved3 = os.ReadInt32(); + } + + public GRoleBase Clone() + { + // Sao chép sâu các Octets; danh sách forbid: nếu có ICloneable thì clone, không thì add như hiện trạng. + var clonedForbid = new List(forbid?.Count ?? 0); + if (forbid != null) + { + foreach (var f in forbid) + { + if (f is ICloneable c) clonedForbid.Add((GRoleForbid)c.Clone()); + else clonedForbid.Add(f); + } + } + + Octets clonedName = name != null ? new Octets(name.ToArray()) : new Octets(); + Octets clonedCustom = custom_data != null ? new Octets(custom_data.ToArray()) : new Octets(); + Octets clonedConfig = config_data != null ? new Octets(config_data.ToArray()) : new Octets(); + Octets clonedHelpStates = help_states != null ? new Octets(help_states.ToArray()) : new Octets(); + + return new GRoleBase( + version, id, clonedName, race, cls, gender, + clonedCustom, clonedConfig, custom_stamp, status, + delete_time, create_time, lastlogin_time, + clonedForbid, clonedHelpStates, + reserved1, reserved2, reserved3 + ); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs.meta new file mode 100644 index 0000000000..855e949954 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleBase.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a62ea892e91ab432aaaea98160b7bb53 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs new file mode 100644 index 0000000000..945a6601ae --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CSNetwork.Protocols.rpcdata +{ + public class GRoleForbid : IMarshallable + { + public byte type; + public int time; + public int createtime; + public Octets reason; + + public GRoleForbid() { } + + public GRoleForbid(byte type = 0, int time = 0, int createtime = 0, Octets reason = null) + { + this.type = type; + this.time = time; + this.createtime = createtime; + this.reason = reason ?? new Octets(0); + } + + public void Marshal(OctetsStream os) + { + os.Write(type); + os.Write(time); + os.Write(createtime); + os.Write(reason); + } + + public void Unmarshal(OctetsStream os) + { + type = os.ReadByte(); + time = os.ReadInt32(); + createtime = os.ReadInt32(); + reason = os.ReadOctets(); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs.meta new file mode 100644 index 0000000000..73ec28da39 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleForbid.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0d4e7e94cb1c04785b195998b328504d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs new file mode 100644 index 0000000000..a9d2a545ef --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs @@ -0,0 +1,62 @@ +namespace CSNetwork.Protocols.RPCData +{ + public class GRoleInventory : IMarshallable + { + public uint id; + public int pos; + public int count; + public int max_count; + public Octets data; + public int proctype; + public int expire_date; + public int guid1; + public int guid2; + public int mask; + + public GRoleInventory() { } + + public GRoleInventory(uint l_id, int l_pos, int l_count, int l_max_count, Octets l_data, int l_proctype, int l_expire_date, int l_guid1, int l_guid2, int l_mask) + { + this.id = l_id; + this.pos = l_pos; + this.count = l_count; + this.max_count = l_max_count; + this.data = l_data; + this.proctype = l_proctype; + this.expire_date = l_expire_date; + this.guid1 = l_guid1; + this.guid2 = l_guid2; + this.mask = l_mask; + } + + public void Marshal(OctetsStream os) + { + os.Write(id); + os.Write(pos); + os.Write(count); + os.Write(max_count); + os.Write(data); + os.Write(proctype); + os.Write(expire_date); + os.Write(guid1); + os.Write(guid2); + os.Write(mask); + } + + public void Unmarshal(OctetsStream os) + { + id = os.ReadUInt32(); + pos = os.ReadInt32(); + count = os.ReadInt32(); + max_count = os.ReadInt32(); + data = os.ReadOctets(); + proctype = os.ReadInt32(); + expire_date = os.ReadInt32(); + guid1 = os.ReadInt32(); + guid2 = os.ReadInt32(); + mask = os.ReadInt32(); + } + + + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs.meta new file mode 100644 index 0000000000..df963714e0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1328599e789e7479996a159d49ac2cef \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs new file mode 100644 index 0000000000..2929615f2f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs @@ -0,0 +1,140 @@ +using System.Collections.Generic; + +namespace CSNetwork.Protocols.RPCData +{ + public class RoleInfo : IMarshallable + { + public int roleid; + public byte gender; + public byte race; + public byte occupation; + public int level; + public int level2; + public Octets name; + public Octets custom_data; + public List equipment = new List(); + public byte status; + public int delete_time; + public int create_time; + public int lastlogin_time; + public float posx; + public float posy; + public float posz; + public int worldtag; + public Octets custom_status; + public Octets charactermode; + public int referrer_role; + public int cash_add; + public Octets reincarnation_data; + public Octets realm_data; + + public RoleInfo() { } + + public RoleInfo(int l_roleid, byte l_gender, byte l_race, byte l_occupation, int l_level, int l_level2, + Octets l_name, Octets l_custom_data, List l_equipment, byte l_status, + int l_delete_time, int l_create_time, int l_lastlogin_time, float l_posx, float l_posy, + float l_posz, int l_worldtag, Octets l_custom_status, Octets l_charactermode, + int l_referrer_role, int l_cash_add, Octets l_reincarnation_data, Octets l_realm_data) + { + roleid = l_roleid; + gender = l_gender; + race = l_race; + occupation = l_occupation; + level = l_level; + level2 = l_level2; + name = l_name; + custom_data = l_custom_data; + equipment = l_equipment; + status = l_status; + delete_time = l_delete_time; + create_time = l_create_time; + lastlogin_time = l_lastlogin_time; + posx = l_posx; + posy = l_posy; + posz = l_posz; + worldtag = l_worldtag; + custom_status = l_custom_status; + charactermode = l_charactermode; + referrer_role = l_referrer_role; + cash_add = l_cash_add; + reincarnation_data = l_reincarnation_data; + realm_data = l_realm_data; + } + + public void Marshal(OctetsStream os) + { + os.Write(roleid); + os.Write(gender); + os.Write(race); + os.Write(occupation); + os.Write(level); + os.Write(level2); + os.Write(name); + os.Write(custom_data); + os.WriteList(equipment); + os.Write(status); + os.Write(delete_time); + os.Write(create_time); + os.Write(lastlogin_time); + os.Write(posx); + os.Write(posy); + os.Write(posz); + os.Write(worldtag); + os.Write(custom_status); + os.Write(charactermode); + os.Write(referrer_role); + os.Write(cash_add); + os.Write(reincarnation_data); + os.Write(realm_data); + } + + public void Unmarshal(OctetsStream os) + { + roleid = os.ReadInt32(); + gender = os.ReadByte(); + race = os.ReadByte(); + occupation = os.ReadByte(); + level = os.ReadInt32(); + level2 = os.ReadInt32(); + name = os.ReadOctets(); + custom_data = os.ReadOctets(); + os.ReadList(equipment); + status = os.ReadByte(); + delete_time = os.ReadInt32(); + create_time = os.ReadInt32(); + lastlogin_time = os.ReadInt32(); + posx = os.ReadFloat(); + posy = os.ReadFloat(); + posz = os.ReadFloat(); + worldtag = os.ReadInt32(); + custom_status = os.ReadOctets(); + charactermode = os.ReadOctets(); + referrer_role = os.ReadInt32(); + cash_add = os.ReadInt32(); + reincarnation_data = os.ReadOctets(); + realm_data = os.ReadOctets(); + } + + public RoleInfo Clone() + { + var clonedEquipment = new List(); + //foreach (var item in equipment) + //{ + // clonedEquipment.Add((GRoleInventory)item.Clone()); + //} + + Octets clonedName = name != null ? new Octets(name.ToArray()) : new Octets(); + Octets clonedCustomData = custom_data != null ? new Octets(custom_data.ToArray()) : new Octets(); + Octets clonedCustomStatus = custom_status != null ? new Octets(custom_status.ToArray()) : new Octets(); + Octets clonedCharMode = charactermode != null ? new Octets(charactermode.ToArray()) : new Octets(); + Octets clonedReincarnation = reincarnation_data != null ? new Octets(reincarnation_data.ToArray()) : new Octets(); + Octets clonedRealm = realm_data != null ? new Octets(realm_data.ToArray()) : new Octets(); + + return new RoleInfo(roleid, gender, race, occupation, level, level2, + clonedName, clonedCustomData, clonedEquipment, status, + delete_time, create_time, lastlogin_time, posx, posy, + posz, worldtag, clonedCustomStatus, clonedCharMode, + referrer_role, cash_add, clonedReincarnation, clonedRealm); + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs.meta new file mode 100644 index 0000000000..dc87ec653a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 792f07a786bd14ae0aebe78ed44eed44 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs new file mode 100644 index 0000000000..ad0b1abd6f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class selectrole : Protocol + { + public enum EFlag { + NORMAL = 0, + ORIGINAL_CROSS = 1, + CROSS_ORIGINAL = 2, + DIRECT_CROSS = 3 + } + public int Roleid { get; set; } + public byte Flag { get; set; }//PlayerLogin protocol flag meanings: 0 normal login, 1 original server -> cross server, 2 cross server -> original server, 3 direct login to cross server + + public selectrole() : base(ProtocolType.PROTOCOL_SELECTROLE) + { + + } + + public override Protocol Clone() => new selectrole + { + Roleid = Roleid, + Flag = Flag + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Flag); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Flag = os.ReadByte(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs.meta new file mode 100644 index 0000000000..f5e5663eab --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b067f23e232bb42b0b5ab96e782b4262 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs new file mode 100644 index 0000000000..01154e6f40 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs @@ -0,0 +1,52 @@ +using System; + +namespace CSNetwork.Protocols +{ + // Corresponds to GNET::SelectRole_Re (Type ?) - Need to confirm/add ProtocolType + public class SelectRole_Re : Protocol + { + // Properties based on C++ definition (inl/selectrole_re) + public int result { get; set; } // int result + public Octets auth { get; set; } // GNET::ByteVector auth -> Octets + + // Constructor - Assuming PROTOCOL_SELECTROLE_RE exists in ProtocolType + // Replace 'ProtocolType.?' with the actual enum value + public SelectRole_Re() + : base(ProtocolType.PROTOCOL_SELECTROLE_RE) + { + auth = new Octets(); // Initialize auth + } + + // Clone method + public override Protocol Clone() => + new SelectRole_Re + { + result = result, + auth = new Octets(auth.ToArray()) // Deep copy for Octets + }; + + // Marshal method based on C++ + public override void Marshal(OctetsStream os) + { + os.Write(result); + os.Write(auth); + } + + // Unmarshal method based on C++ + public override void Unmarshal(OctetsStream os) + { + result = os.ReadInt32(); // Read int + auth = os.ReadOctets(); // Read Octets + } + + // PriorPolicy based on C++ + public override int PriorPolicy() => 101; + + // SizePolicy based on C++ + public override bool SizePolicy(int size) => size <= 1024; + + // ToString method for logging/debugging + public override string ToString => $"SelectRole_Re(Type={Type}, Result={result}, Auth Length={auth?.Length ?? 0})"; + // Optionally include auth bytes if needed, but can be large:// return $"SelectRole_Re(Type={Type}, Result={result}, Auth={BitConverter.ToString(auth.ToArray())})"; } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs.meta new file mode 100644 index 0000000000..422b0a63be --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/selectrole_re.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9fe5cb6637a6a4fb8a1c5402f41634a1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs new file mode 100644 index 0000000000..1d2d372873 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sellcancel : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Sellid { get; set; } + public int L_localsid { get; set; } + + public sellcancel() : base(ProtocolType.PROTOCOL_SELLCANCEL) + { + + } + + public override Protocol Clone() => new sellcancel + { + Roleid = Roleid, + Localsid = Localsid, + Sellid = Sellid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Sellid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Sellid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs.meta new file mode 100644 index 0000000000..86d65d179b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellcancel.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 86bc9f2d5ad264f45ad56d51ee6882f7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs new file mode 100644 index 0000000000..db4d156b6a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sellpoint : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Point { get; set; } + public int Price { get; set; } + public int L_localsid { get; set; } + + public sellpoint() : base(ProtocolType.PROTOCOL_SELLPOINT) + { + + } + + public override Protocol Clone() => new sellpoint + { + Roleid = Roleid, + Localsid = Localsid, + Point = Point, + Price = Price, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Point); + os.Write(Price); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Point = os.ReadInt32(); + Price = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs.meta new file mode 100644 index 0000000000..897a816280 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sellpoint.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 085f868ba29ac4b92a0a32d376a50584 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs new file mode 100644 index 0000000000..acb02f066e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sendaumail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Friend_id { get; set; } + public int Mail_template_id { get; set; } + + public sendaumail() : base(ProtocolType.PROTOCOL_SENDAUMAIL) + { + + } + + public override Protocol Clone() => new sendaumail + { + Roleid = Roleid, + Localsid = Localsid, + Friend_id = Friend_id, + Mail_template_id = Mail_template_id + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Friend_id); + os.Write(Mail_template_id); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Friend_id = os.ReadInt32(); + Mail_template_id = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs.meta new file mode 100644 index 0000000000..826769ea6f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendaumail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 92de47c6f0a5f4dcd85596bf73710e3a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs new file mode 100644 index 0000000000..434e52f783 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sendmsg : Protocol + { + public int Srcroleid { get; set; } + public byte Srczoneid { get; set; } + public int Dstroleid { get; set; } + public byte Dstzoneid { get; set; } + public Octets Msg { get; set; } + public int Time { get; set; } + public int Localsid { get; set; } + + public sendmsg() : base(ProtocolType.PROTOCOL_SENDMSG) + { + Msg = new Octets(); + } + + public override Protocol Clone() => new sendmsg + { + Srcroleid = Srcroleid, + Srczoneid = Srczoneid, + Dstroleid = Dstroleid, + Dstzoneid = Dstzoneid, + Msg = new Octets(Msg.ToArray()), + Time = Time, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Srcroleid); + os.Write(Srczoneid); + os.Write(Dstroleid); + os.Write(Dstzoneid); + os.Write(Msg); + os.Write(Time); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Srcroleid = os.ReadInt32(); + Srczoneid = os.ReadByte(); + Dstroleid = os.ReadInt32(); + Dstzoneid = os.ReadByte(); + Msg = os.ReadOctets(); + Time = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs.meta new file mode 100644 index 0000000000..be662e19d2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sendmsg.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 009fa86c29cac439788d181daa989098 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs new file mode 100644 index 0000000000..eb6297afcb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class setcustomdata : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public Octets Custom_data { get; set; } + + public setcustomdata() : base(ProtocolType.PROTOCOL_SETCUSTOMDATA) + { + Custom_data = new Octets(); + } + + public override Protocol Clone() => new setcustomdata + { + Roleid = Roleid, + Localsid = Localsid, + Custom_data = new Octets(Custom_data.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Custom_data); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Custom_data = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1536; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs.meta new file mode 100644 index 0000000000..9185475a8a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setcustomdata.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5616d9a1b8c364937bad307df4bc9ab9 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs new file mode 100644 index 0000000000..80311e28d8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class setfriendgroup : Protocol + { + public byte Gid { get; set; } + public int Roleid { get; set; } + public int Friendid { get; set; } + public int Localsid { get; set; } + + public setfriendgroup() : base(ProtocolType.PROTOCOL_SETFRIENDGROUP) + { + + } + + public override Protocol Clone() => new setfriendgroup + { + Gid = Gid, + Roleid = Roleid, + Friendid = Friendid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Gid); + os.Write(Roleid); + os.Write(Friendid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Gid = os.ReadByte(); + Roleid = os.ReadInt32(); + Friendid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs.meta new file mode 100644 index 0000000000..dde746f7eb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setfriendgroup.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f76143d35218d477d984076ffefad9b1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs new file mode 100644 index 0000000000..24a3c83b2f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class setgroupname : Protocol + { + public int Roleid { get; set; } + public byte Gid { get; set; } + public Octets Name { get; set; } + public int Localsid { get; set; } + + public setgroupname() : base(ProtocolType.PROTOCOL_SETGROUPNAME) + { + Name = new Octets(); + } + + public override Protocol Clone() => new setgroupname + { + Roleid = Roleid, + Gid = Gid, + Name = new Octets(Name.ToArray()), + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Gid); + os.Write(Name); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Gid = os.ReadByte(); + Name = os.ReadOctets(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs.meta new file mode 100644 index 0000000000..2654a7d42f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setgroupname.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c9804e56ab861451aa15314a16f0b4c5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs new file mode 100644 index 0000000000..221548618b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sethelpstates : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public Octets Help_states { get; set; } + + public sethelpstates() : base(ProtocolType.PROTOCOL_SETHELPSTATES) + { + Help_states = new Octets(); + } + + public override Protocol Clone() => new sethelpstates + { + Roleid = Roleid, + Localsid = Localsid, + Help_states = new Octets(Help_states.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Help_states); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Help_states = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 4096; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs.meta new file mode 100644 index 0000000000..c83e9ba00f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sethelpstates.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4c66e02686a8e481f9435155b330d611 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs new file mode 100644 index 0000000000..b1eacfa056 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class setuiconfig : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public Octets Ui_config { get; set; } + + public setuiconfig() : base(ProtocolType.PROTOCOL_SETUICONFIG) + { + Ui_config = new Octets(); + } + + public override Protocol Clone() => new setuiconfig + { + Roleid = Roleid, + Localsid = Localsid, + Ui_config = new Octets(Ui_config.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Ui_config); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Ui_config = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 4096; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs.meta new file mode 100644 index 0000000000..c85a8fbfe3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/setuiconfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: faa0ebe41fe2945989685151f37bf88a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs new file mode 100644 index 0000000000..31f8b0fcd6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class ssogetticket : Protocol + { + public int Toaid { get; set; } + public int Tozoneid { get; set; } + public Octets Info { get; set; } + public Octets Local_context { get; set; } + + public ssogetticket() : base(ProtocolType.PROTOCOL_SSOGETTICKET) + { + Info = new Octets(); + Local_context = new Octets(); + } + + public override Protocol Clone() => new ssogetticket + { + Toaid = Toaid, + Tozoneid = Tozoneid, + Info = new Octets(Info.ToArray()), + Local_context = new Octets(Local_context.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Toaid); + os.Write(Tozoneid); + os.Write(Info); + os.Write(Local_context); + } + + public override void Unmarshal(OctetsStream os) + { + Toaid = os.ReadInt32(); + Tozoneid = os.ReadInt32(); + Info = os.ReadOctets(); + Local_context = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 2048; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs.meta new file mode 100644 index 0000000000..bf0836c578 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/ssogetticket.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fa4dcd80bd9534a16a7b2c28a8f7aa4f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs new file mode 100644 index 0000000000..3ed7b41dae --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class statusannounce : Protocol + { + public int Userid { get; set; } + public int Localsid { get; set; } + public byte Status { get; set; } + + public statusannounce() : base(ProtocolType.PROTOCOL_STATUSANNOUNCE) + { + + } + + public override Protocol Clone() => new statusannounce + { + Userid = Userid, + Localsid = Localsid, + Status = Status + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + os.Write(Status); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Status = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs.meta new file mode 100644 index 0000000000..a08ab3e26d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/statusannounce.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c8bde114f534f468a8594c38638e2859 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs new file mode 100644 index 0000000000..b9ee31e2ee --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class stockaccount : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public stockaccount() : base(ProtocolType.PROTOCOL_STOCKACCOUNT) + { + + } + + public override Protocol Clone() => new stockaccount + { + Roleid = Roleid, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs.meta new file mode 100644 index 0000000000..7d28c0f8a0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockaccount.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 619a6a9185acd40e4ac4ff13f2bec248 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs new file mode 100644 index 0000000000..80ef116796 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class stockbill : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public stockbill() : base(ProtocolType.PROTOCOL_STOCKBILL) + { + + } + + public override Protocol Clone() => new stockbill + { + Roleid = Roleid, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs.meta new file mode 100644 index 0000000000..c8a905f8e1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockbill.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2a07ddd8ca7404c049dac2f0e5be32cb \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs new file mode 100644 index 0000000000..36a4d48d2a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class stockcancel : Protocol + { + public int Roleid { get; set; } + public int Tid { get; set; } + public int Price { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public stockcancel() : base(ProtocolType.PROTOCOL_STOCKCANCEL) + { + + } + + public override Protocol Clone() => new stockcancel + { + Roleid = Roleid, + Tid = Tid, + Price = Price, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Tid); + os.Write(Price); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Tid = os.ReadInt32(); + Price = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs.meta new file mode 100644 index 0000000000..ae2b2e9669 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcancel.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f968c3a22c0f04a66a9f3a871e7aecae \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs new file mode 100644 index 0000000000..4ebda60034 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class stockcommission : Protocol + { + public int Roleid { get; set; } + public byte Isbuy { get; set; } + public int Price { get; set; } + public int Volume { get; set; } + public int Localsid { get; set; } + public int L_volume { get; set; } + + public stockcommission() : base(ProtocolType.PROTOCOL_STOCKCOMMISSION) + { + + } + + public override Protocol Clone() => new stockcommission + { + Roleid = Roleid, + Isbuy = Isbuy, + Price = Price, + Volume = Volume, + Localsid = Localsid, + L_volume = L_volume + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Isbuy); + os.Write(Price); + os.Write(Volume); + os.Write(Localsid); + os.Write(L_volume); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Isbuy = os.ReadByte(); + Price = os.ReadInt32(); + Volume = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_volume = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs.meta new file mode 100644 index 0000000000..bef158b158 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/stockcommission.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5b0c31c882187477a9048ce9c5eed26a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs new file mode 100644 index 0000000000..29b2a1f859 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sysauctionaccount : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public sysauctionaccount() : base(ProtocolType.PROTOCOL_SYSAUCTIONACCOUNT) + { + + } + + public override Protocol Clone() => new sysauctionaccount + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs.meta new file mode 100644 index 0000000000..ccdb3046b2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionaccount.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eb686925385694028b696294d5399f64 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs new file mode 100644 index 0000000000..512e87feb3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sysauctionbid : Protocol + { + public int Roleid { get; set; } + public int Sa_id { get; set; } + public int Bid_price { get; set; } + public int Localsid { get; set; } + public int L_localsid { get; set; } + + public sysauctionbid() : base(ProtocolType.PROTOCOL_SYSAUCTIONBID) + { + + } + + public override Protocol Clone() => new sysauctionbid + { + Roleid = Roleid, + Sa_id = Sa_id, + Bid_price = Bid_price, + Localsid = Localsid, + L_localsid = L_localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Sa_id); + os.Write(Bid_price); + os.Write(Localsid); + os.Write(L_localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Sa_id = os.ReadInt32(); + Bid_price = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs.meta new file mode 100644 index 0000000000..f3a961b9f9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionbid.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9c42e9d44ce29465ea5d7338299bc264 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs new file mode 100644 index 0000000000..0a104e3c60 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sysauctioncashtransfer : Protocol + { + public int Roleid { get; set; } + public byte Withdraw { get; set; } + public int Cash { get; set; } + public int Localsid { get; set; } + public Octets Syncdata { get; set; } + + public sysauctioncashtransfer() : base(ProtocolType.PROTOCOL_SYSAUCTIONCASHTRANSFER) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new sysauctioncashtransfer + { + Roleid = Roleid, + Withdraw = Withdraw, + Cash = Cash, + Localsid = Localsid, + Syncdata = new Octets(Syncdata.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Withdraw); + os.Write(Cash); + os.Write(Localsid); + os.Write(Syncdata); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Withdraw = os.ReadByte(); + Cash = os.ReadInt32(); + Localsid = os.ReadInt32(); + Syncdata = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs.meta new file mode 100644 index 0000000000..6fe4f4387f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctioncashtransfer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8dd04d95dc254432e96f58c410467c7f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs new file mode 100644 index 0000000000..9b7252fdf2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sysauctiongetitem : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public sysauctiongetitem() : base(ProtocolType.PROTOCOL_SYSAUCTIONGETITEM) + { + + } + + public override Protocol Clone() => new sysauctiongetitem + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 512; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs.meta new file mode 100644 index 0000000000..7c2c25246b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctiongetitem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b13b03dde6de547b4a34b45548136a9f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs new file mode 100644 index 0000000000..0982f7e61a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class sysauctionlist : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public sysauctionlist() : base(ProtocolType.PROTOCOL_SYSAUCTIONLIST) + { + + } + + public override Protocol Clone() => new sysauctionlist + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs.meta new file mode 100644 index 0000000000..2a20b8f049 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/sysauctionlist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5aceb703494ce453ab4e9b66b1b961d5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs new file mode 100644 index 0000000000..5814ee2b6b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class tankbattleplayergetrank : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public tankbattleplayergetrank() : base(ProtocolType.PROTOCOL_TANKBATTLEPLAYERGETRANK) + { + + } + + public override Protocol Clone() => new tankbattleplayergetrank + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs.meta new file mode 100644 index 0000000000..79c74ad938 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tankbattleplayergetrank.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b43a28eb6744645e298687468ca81f33 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs new file mode 100644 index 0000000000..b4ba07e378 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class tradeaddgoods : Protocol + { + public int Tid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Money { get; set; } + + public tradeaddgoods() : base(ProtocolType.PROTOCOL_TRADEADDGOODS) + { + + } + + public override Protocol Clone() => new tradeaddgoods + { + Tid = Tid, + Roleid = Roleid, + Localsid = Localsid, + Money = Money + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Tid); + os.Write(Roleid); + os.Write(Localsid); + os.Write(Money); + } + + public override void Unmarshal(OctetsStream os) + { + Tid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Money = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs.meta new file mode 100644 index 0000000000..9e4f1eab36 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeaddgoods.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cc7932c233d9b4156b15623d9f2b5b93 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs new file mode 100644 index 0000000000..05315ff5c3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class tradeconfirm : Protocol + { + public int Tid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + + public tradeconfirm() : base(ProtocolType.PROTOCOL_TRADECONFIRM) + { + + } + + public override Protocol Clone() => new tradeconfirm + { + Tid = Tid, + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Tid); + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Tid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs.meta new file mode 100644 index 0000000000..ae312b8c3b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeconfirm.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6e8fba51dda504bc689483501d5e510b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs new file mode 100644 index 0000000000..596ca20e00 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class tradediscard : Protocol + { + public int Tid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + + public tradediscard() : base(ProtocolType.PROTOCOL_TRADEDISCARD) + { + + } + + public override Protocol Clone() => new tradediscard + { + Tid = Tid, + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Tid); + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Tid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs.meta new file mode 100644 index 0000000000..525eef88fd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradediscard.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2df530750badc4101bea56ed399efee8 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs new file mode 100644 index 0000000000..a3a93101f6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class tradeend : Protocol + { + public int Tid { get; set; } + public byte Cause { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + + public tradeend() : base(ProtocolType.PROTOCOL_TRADEEND) + { + + } + + public override Protocol Clone() => new tradeend + { + Tid = Tid, + Cause = Cause, + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Tid); + os.Write(Cause); + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Tid = os.ReadInt32(); + Cause = os.ReadByte(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs.meta new file mode 100644 index 0000000000..f9fe44b704 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradeend.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2f85468bd57f84e72b97ee303ec6c356 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs new file mode 100644 index 0000000000..cb96dc864c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class trademoveobj : Protocol + { + public int Tid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + public byte Dst_pos { get; set; } + + public trademoveobj() : base(ProtocolType.PROTOCOL_TRADEMOVEOBJ) + { + + } + + public override Protocol Clone() => new trademoveobj + { + Tid = Tid, + Roleid = Roleid, + Localsid = Localsid, + Dst_pos = Dst_pos + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Tid); + os.Write(Roleid); + os.Write(Localsid); + os.Write(Dst_pos); + } + + public override void Unmarshal(OctetsStream os) + { + Tid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Dst_pos = os.ReadByte(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs.meta new file mode 100644 index 0000000000..58a0db3ebe --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/trademoveobj.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9386c24bf5c3e40df99f0b84fe02eda1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs new file mode 100644 index 0000000000..c271549844 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class traderemovegoods : Protocol + { + public int Tid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Money { get; set; } + + public traderemovegoods() : base(ProtocolType.PROTOCOL_TRADEREMOVEGOODS) + { + + } + + public override Protocol Clone() => new traderemovegoods + { + Tid = Tid, + Roleid = Roleid, + Localsid = Localsid, + Money = Money + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Tid); + os.Write(Roleid); + os.Write(Localsid); + os.Write(Money); + } + + public override void Unmarshal(OctetsStream os) + { + Tid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Money = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs.meta new file mode 100644 index 0000000000..ce723147e5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/traderemovegoods.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 32d40480b036048d18dda3ced785af06 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs new file mode 100644 index 0000000000..8cbae08902 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class tradestart : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + public int Partner_roleid { get; set; } + + public tradestart() : base(ProtocolType.PROTOCOL_TRADESTART) + { + + } + + public override Protocol Clone() => new tradestart + { + Roleid = Roleid, + Localsid = Localsid, + Partner_roleid = Partner_roleid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + os.Write(Partner_roleid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Partner_roleid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs.meta new file mode 100644 index 0000000000..2e6453555e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradestart.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e2296c8d4f5324c53ad264ff597bc263 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs new file mode 100644 index 0000000000..e4694cf640 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class tradesubmit : Protocol + { + public int Tid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + + public tradesubmit() : base(ProtocolType.PROTOCOL_TRADESUBMIT) + { + + } + + public override Protocol Clone() => new tradesubmit + { + Tid = Tid, + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Tid); + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Tid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs.meta new file mode 100644 index 0000000000..57b4bd98e4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/tradesubmit.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 740ad55f9f82e48d5b4487e8993434ec \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs new file mode 100644 index 0000000000..dee81261e6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class undodeleterole : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public undodeleterole() : base(ProtocolType.PROTOCOL_UNDODELETEROLE) + { + + } + + public override Protocol Clone() => new undodeleterole + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 101; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs.meta new file mode 100644 index 0000000000..073f18749f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/undodeleterole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ec411fbf1ef7d4dc891a6ab8eb33db50 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs new file mode 100644 index 0000000000..bdfefcb561 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class uniquedatamodifybroadcast : Protocol + { + public int Handle { get; set; } + + public uniquedatamodifybroadcast() : base(ProtocolType.PROTOCOL_UNIQUEDATAMODIFYBROADCAST) + { + + } + + public override Protocol Clone() => new uniquedatamodifybroadcast + { + Handle = Handle + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Handle); + } + + public override void Unmarshal(OctetsStream os) + { + Handle = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs.meta new file mode 100644 index 0000000000..68194e750f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/uniquedatamodifybroadcast.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f6ce712e75a75476380e8e2417313594 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs new file mode 100644 index 0000000000..0e51c6ad1c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class updateremaintime : Protocol + { + public int Userid { get; set; } + public int Localsid { get; set; } + public int Remain_time { get; set; } + public int Free_time_left { get; set; } + public int Free_time_end { get; set; } + public int L_free_time_left { get; set; } + + public updateremaintime() : base(ProtocolType.PROTOCOL_UPDATEREMAINTIME) + { + + } + + public override Protocol Clone() => new updateremaintime + { + Userid = Userid, + Localsid = Localsid, + Remain_time = Remain_time, + Free_time_left = Free_time_left, + Free_time_end = Free_time_end, + L_free_time_left = L_free_time_left + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + os.Write(Remain_time); + os.Write(Free_time_left); + os.Write(Free_time_end); + os.Write(L_free_time_left); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Remain_time = os.ReadInt32(); + Free_time_left = os.ReadInt32(); + Free_time_end = os.ReadInt32(); + L_free_time_left = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 64; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs.meta new file mode 100644 index 0000000000..349ae182ab --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/updateremaintime.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 583fea0f34fb24c7989cb00da69bcd5a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs new file mode 100644 index 0000000000..57cfb0da3b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class useraddcash : Protocol + { + public int Userid { get; set; } + public Octets Cardnum { get; set; } + public Octets Cardpasswd { get; set; } + public int Localsid { get; set; } + + public useraddcash() : base(ProtocolType.PROTOCOL_USERADDCASH) + { + Cardnum = new Octets(); + Cardpasswd = new Octets(); + } + + public override Protocol Clone() => new useraddcash + { + Userid = Userid, + Cardnum = new Octets(Cardnum.ToArray()), + Cardpasswd = new Octets(Cardpasswd.ToArray()), + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Cardnum); + os.Write(Cardpasswd); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Cardnum = os.ReadOctets(); + Cardpasswd = os.ReadOctets(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs.meta new file mode 100644 index 0000000000..14a16a7f8a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/useraddcash.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3b280aaeb8cb54d00b4b7e144be6158d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs new file mode 100644 index 0000000000..af6662c011 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class usercoupon : Protocol + { + public int Userid { get; set; } + public int Localsid { get; set; } + + public usercoupon() : base(ProtocolType.PROTOCOL_USERCOUPON) + { + + } + + public override Protocol Clone() => new usercoupon + { + Userid = Userid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs.meta new file mode 100644 index 0000000000..d9bdc9c5a1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercoupon.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e2a3a6c334c124a31b9001b4152a42be \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs new file mode 100644 index 0000000000..57203d4475 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class usercouponexchange : Protocol + { + public int Userid { get; set; } + public int Coupon_number { get; set; } + public int Localsid { get; set; } + + public usercouponexchange() : base(ProtocolType.PROTOCOL_USERCOUPONEXCHANGE) + { + + } + + public override Protocol Clone() => new usercouponexchange + { + Userid = Userid, + Coupon_number = Coupon_number, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Coupon_number); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Coupon_number = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 16; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs.meta new file mode 100644 index 0000000000..c6f51ba50a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/usercouponexchange.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7f926ab79ff064d7b8c0ce7450253d54 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs new file mode 100644 index 0000000000..04c5a48e9f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class waitqueuestatenotify : Protocol + { + public int Localsid { get; set; } + public byte Vip { get; set; } + public short Vq_size { get; set; } + public short Cur_queue_pos { get; set; } + public int Waittime { get; set; } + + public waitqueuestatenotify() : base(ProtocolType.PROTOCOL_WAITQUEUESTATENOTIFY) + { + + } + + public override Protocol Clone() => new waitqueuestatenotify + { + Localsid = Localsid, + Vip = Vip, + Vq_size = Vq_size, + Cur_queue_pos = Cur_queue_pos, + Waittime = Waittime + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Localsid); + os.Write(Vip); + os.Write(Vq_size); + os.Write(Cur_queue_pos); + os.Write(Waittime); + } + + public override void Unmarshal(OctetsStream os) + { + Localsid = os.ReadInt32(); + Vip = os.ReadByte(); + Vq_size = os.ReadInt16(); + Cur_queue_pos = os.ReadInt16(); + Waittime = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs.meta new file mode 100644 index 0000000000..df9ed9f698 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/waitqueuestatenotify.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 888eb9c2a84304c75a90f157c26e1dce \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs new file mode 100644 index 0000000000..210fde9bf4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtradeattendlist : Protocol + { + public int Roleid { get; set; } + public byte Getsell { get; set; } + public int Begin { get; set; } + public int Localsid { get; set; } + + public webtradeattendlist() : base(ProtocolType.PROTOCOL_WEBTRADEATTENDLIST) + { + + } + + public override Protocol Clone() => new webtradeattendlist + { + Roleid = Roleid, + Getsell = Getsell, + Begin = Begin, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Getsell); + os.Write(Begin); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Getsell = os.ReadByte(); + Begin = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs.meta new file mode 100644 index 0000000000..dd73d51641 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeattendlist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 774302d53092d4d16b87d824d47215fe \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs new file mode 100644 index 0000000000..f4615751d9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtradegetdetail : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public webtradegetdetail() : base(ProtocolType.PROTOCOL_WEBTRADEGETDETAIL) + { + + } + + public override Protocol Clone() => new webtradegetdetail + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs.meta new file mode 100644 index 0000000000..5a0306717e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetdetail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2e5677ecaea8a4fee8fbc0ef49364b80 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs new file mode 100644 index 0000000000..ee7cf76f0b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtradegetitem : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public webtradegetitem() : base(ProtocolType.PROTOCOL_WEBTRADEGETITEM) + { + + } + + public override Protocol Clone() => new webtradegetitem + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs.meta new file mode 100644 index 0000000000..be11173e39 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradegetitem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3066679989d804cc894a7d42b7dfa12d \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs new file mode 100644 index 0000000000..afc0a3acd8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtradelist : Protocol + { + public int Roleid { get; set; } + public int Category { get; set; } + public int Begin { get; set; } + public byte Reverse { get; set; } + public int Localsid { get; set; } + + public webtradelist() : base(ProtocolType.PROTOCOL_WEBTRADELIST) + { + + } + + public override Protocol Clone() => new webtradelist + { + Roleid = Roleid, + Category = Category, + Begin = Begin, + Reverse = Reverse, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Category); + os.Write(Begin); + os.Write(Reverse); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Category = os.ReadInt32(); + Begin = os.ReadInt32(); + Reverse = os.ReadByte(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs.meta new file mode 100644 index 0000000000..12e4051c42 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradelist.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9b5a0ee8fbb234fd5a7c3f4bd527ca97 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs new file mode 100644 index 0000000000..ef035d1409 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtradeprecancelpost : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public webtradeprecancelpost() : base(ProtocolType.PROTOCOL_WEBTRADEPRECANCELPOST) + { + + } + + public override Protocol Clone() => new webtradeprecancelpost + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs.meta new file mode 100644 index 0000000000..e9af2314fa --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprecancelpost.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9c6e31cfebf3a422b88f6bdfb2867869 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs new file mode 100644 index 0000000000..2c8178fad4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtradeprepost : Protocol + { + public int Roleid { get; set; } + public int Posttype { get; set; } + public int Money { get; set; } + public int Item_id { get; set; } + public int Item_pos { get; set; } + public int Item_num { get; set; } + public int Price { get; set; } + public int Sellperiod { get; set; } + public int Buyer_roleid { get; set; } + public int Localsid { get; set; } + public Octets Syncdata { get; set; } + public int L_money { get; set; } + + public webtradeprepost() : base(ProtocolType.PROTOCOL_WEBTRADEPREPOST) + { + Syncdata = new Octets(); + } + + public override Protocol Clone() => new webtradeprepost + { + Roleid = Roleid, + Posttype = Posttype, + Money = Money, + Item_id = Item_id, + Item_pos = Item_pos, + Item_num = Item_num, + Price = Price, + Sellperiod = Sellperiod, + Buyer_roleid = Buyer_roleid, + Localsid = Localsid, + Syncdata = new Octets(Syncdata.ToArray()), + L_money = L_money + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Posttype); + os.Write(Money); + os.Write(Item_id); + os.Write(Item_pos); + os.Write(Item_num); + os.Write(Price); + os.Write(Sellperiod); + os.Write(Buyer_roleid); + os.Write(Localsid); + os.Write(Syncdata); + os.Write(L_money); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Posttype = os.ReadInt32(); + Money = os.ReadInt32(); + Item_id = os.ReadInt32(); + Item_pos = os.ReadInt32(); + Item_num = os.ReadInt32(); + Price = os.ReadInt32(); + Sellperiod = os.ReadInt32(); + Buyer_roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + Syncdata = os.ReadOctets(); + L_money = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 131072; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs.meta new file mode 100644 index 0000000000..5ceb759449 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeprepost.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 358a74e9ab4334e7197210066ce13db8 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs new file mode 100644 index 0000000000..14df3046ba --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtraderolegetdetail : Protocol + { + public int Userid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + + public webtraderolegetdetail() : base(ProtocolType.PROTOCOL_WEBTRADEROLEGETDETAIL) + { + + } + + public override Protocol Clone() => new webtraderolegetdetail + { + Userid = Userid, + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs.meta new file mode 100644 index 0000000000..b80e898061 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderolegetdetail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d7c4e2111601b495ba0f56a32633f3a5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs new file mode 100644 index 0000000000..93e0c107c1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtraderoleprecancelpost : Protocol + { + public int Userid { get; set; } + public int Roleid { get; set; } + public int Localsid { get; set; } + + public webtraderoleprecancelpost() : base(ProtocolType.PROTOCOL_WEBTRADEROLEPRECANCELPOST) + { + + } + + public override Protocol Clone() => new webtraderoleprecancelpost + { + Userid = Userid, + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs.meta new file mode 100644 index 0000000000..8e0253ea33 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprecancelpost.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 39cd411d2b5274b068735adb445a1186 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs new file mode 100644 index 0000000000..af844cfed3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtraderoleprepost : Protocol + { + public int Userid { get; set; } + public int Roleid { get; set; } + public int Price { get; set; } + public int Sellperiod { get; set; } + public int Buyer_roleid { get; set; } + public int Localsid { get; set; } + public int L_sellperiod { get; set; } + + public webtraderoleprepost() : base(ProtocolType.PROTOCOL_WEBTRADEROLEPREPOST) + { + + } + + public override Protocol Clone() => new webtraderoleprepost + { + Userid = Userid, + Roleid = Roleid, + Price = Price, + Sellperiod = Sellperiod, + Buyer_roleid = Buyer_roleid, + Localsid = Localsid, + L_sellperiod = L_sellperiod + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Userid); + os.Write(Roleid); + os.Write(Price); + os.Write(Sellperiod); + os.Write(Buyer_roleid); + os.Write(Localsid); + os.Write(L_sellperiod); + } + + public override void Unmarshal(OctetsStream os) + { + Userid = os.ReadInt32(); + Roleid = os.ReadInt32(); + Price = os.ReadInt32(); + Sellperiod = os.ReadInt32(); + Buyer_roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + L_sellperiod = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 128; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs.meta new file mode 100644 index 0000000000..8bc67432b7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtraderoleprepost.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 35efe704f00cb41fe899a72076b0c2cd \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs new file mode 100644 index 0000000000..5b655e6edd --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class webtradeupdate : Protocol + { + public int Roleid { get; set; } + public int Localsid { get; set; } + + public webtradeupdate() : base(ProtocolType.PROTOCOL_WEBTRADEUPDATE) + { + + } + + public override Protocol Clone() => new webtradeupdate + { + Roleid = Roleid, + Localsid = Localsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Roleid); + os.Write(Localsid); + } + + public override void Unmarshal(OctetsStream os) + { + Roleid = os.ReadInt32(); + Localsid = os.ReadInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs.meta new file mode 100644 index 0000000000..a086692bd5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/webtradeupdate.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dbc8a03f626ab4cb5b62d0066ae0b3b6 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs new file mode 100644 index 0000000000..10697e499a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Protocols +{ + public class worldchat : Protocol + { + public byte Channel { get; set; } + public byte Emotion { get; set; } + public int Roleid { get; set; } + public Octets Name { get; set; } + public Octets Msg { get; set; } + public Octets Data { get; set; } + + public worldchat() : base(ProtocolType.PROTOCOL_WORLDCHAT) + { + Name = new Octets(); + Msg = new Octets(); + Data = new Octets(); + } + + public override Protocol Clone() => new worldchat + { + Channel = Channel, + Emotion = Emotion, + Roleid = Roleid, + Name = new Octets(Name.ToArray()), + Msg = new Octets(Msg.ToArray()), + Data = new Octets(Data.ToArray()) + }; + + public override void Marshal(OctetsStream os) + { + os.Write(Channel); + os.Write(Emotion); + os.Write(Roleid); + os.Write(Name); + os.Write(Msg); + os.Write(Data); + } + + public override void Unmarshal(OctetsStream os) + { + Channel = os.ReadByte(); + Emotion = os.ReadByte(); + Roleid = os.ReadInt32(); + Name = os.ReadOctets(); + Msg = os.ReadOctets(); + Data = os.ReadOctets(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 1024; + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs.meta new file mode 100644 index 0000000000..03e6ac20ef --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/worldchat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4e6223992a639473e87b93c8d75bcf1b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security.meta new file mode 100644 index 0000000000..090a001ced --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50896e558b7814bb3aeb920584f31081 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs new file mode 100644 index 0000000000..b8e31e30b7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs @@ -0,0 +1,181 @@ +using CSNetwork.Security; +using System; + +namespace CSNetwork.Security +{ + /// + /// Implements the ARCFOUR (RC4) stream cipher. + /// Ported from GNET::ARCFourSecurity in gnsecure.h. + /// + public class ARCFourSecurity : BaseSecurity // Inherit from Security + { + private readonly byte[] _perm = new byte[256]; + private byte _index1; + private byte _index2; + private bool _initialized = false; + + // Constructor to register the type + public ARCFourSecurity() + : base(SecurityType.ARCFOURSECURITY) + { + } + byte[] _key; + /// + /// Initializes the RC4 state using the Key Scheduling Algorithm (KSA). + /// + /// The secret key as Octets. + /// + public override void SetParameter(Octets keyOctets) + { + + byte[] key = keyOctets.ByteArray; + _key = key; + if (key == null || key.Length == 0) + { + throw new ArgumentException("ARCFour key cannot be null or empty.", nameof(keyOctets)); + } + + int keylen = key.Length; + + for (int i = 0; i < 256; i++) + { + _perm[i] = (byte)i; + } + + byte j = 0; + for (int i = 0; i < 256; i++) + { + j = (byte)(j + _perm[i] + key[i % keylen]); + // Swap perm[i] and perm[j] + byte temp = _perm[i]; + _perm[i] = _perm[j]; + _perm[j] = temp; + } + + _index1 = 0; + _index2 = 0; + _initialized = true; + } + + /// + /// Encrypts or decrypts the data in the Octets using the RC4 PRGA. + /// Modifies the input Octets in place. + /// + /// The Octets containing the data. + /// The same Octets object with data transformed. + public override Octets Update(Octets data) + { + if (!_initialized) + { + throw new InvalidOperationException("ARCFourSecurity has not been initialized with SetParameter."); + } + if (data == null) throw new ArgumentNullException(nameof(data)); + + byte[] buffer = data.RawBuffer; // Get direct buffer access + int offset = 0; // Octets data always starts at 0 + int length = data.Length; // Use Octets length + + if (offset < 0 || length < 0 || offset + length > buffer.Length) + throw new ArgumentOutOfRangeException("Invalid offset or length derived from Octets."); + + for (int i = 0; i < length; i++) + { + _index1++; // Note: byte overflows wrap around from 255 to 0 automatically + _index2 = (byte)(_index2 + _perm[_index1]); + + // Swap perm[index1] and perm[index2] + byte temp = _perm[_index1]; + _perm[_index1] = _perm[_index2]; + _perm[_index2] = temp; + + byte j = (byte)(_perm[_index1] + _perm[_index2]); + byte keystreamByte = _perm[j]; + + buffer[offset + i] ^= keystreamByte; + } + + return data; // Return the modified Octets + } + + /// + /// Encrypts or decrypts the byte array using the stateful RC4 PRGA. + /// Required implementation for the abstract base class. + /// + /// The byte array containing the data. + /// A new byte array containing the transformed data. + public override byte[] Update(byte[] data) // Implement the abstract method + { + if (!_initialized) + { + throw new InvalidOperationException("ARCFourSecurity has not been initialized with SetParameter."); + } + if (data == null) throw new ArgumentNullException(nameof(data)); + + int length = data.Length; + byte[] result = new byte[length]; // Create a new buffer for the result + + for (int i = 0; i < length; i++) + { + _index1++; + _index2 = (byte)(_index2 + _perm[_index1]); + + // Swap perm[index1] and perm[index2] + byte temp = _perm[_index1]; + _perm[_index1] = _perm[_index2]; + _perm[_index2] = temp; + + byte j = (byte)(_perm[_index1] + _perm[_index2]); + byte keystreamByte = _perm[j]; + + result[i] = (byte)(data[i] ^ keystreamByte); // Apply XOR to original data and store in result + } + + return result; // Return the new array with transformed data + } + + // Keep the renamed UpdateBytes method if you need it for specific use cases, + // or remove it if Update(byte[]) now covers all needs. + public byte[] UpdateBytes(byte[] data) // Renamed to avoid override conflict if BaseSecurity defines Update(byte[]) + { + if (!_initialized) + { + throw new InvalidOperationException("ARCFourSecurity has not been initialized with SetParameter."); + } + if (data == null) throw new ArgumentNullException(nameof(data)); + + byte[] buffer = data; // Work directly on the input buffer + int offset = 0; + int length = data.Length; + + // Create a copy if you need to return a new array, + // otherwise modify 'data' in place if that's acceptable. + byte[] result = new byte[length]; + Array.Copy(data, result, length); + buffer = result; // Operate on the result buffer + + + for (int i = 0; i < length; i++) + { + _index1++; + _index2 = (byte)(_index2 + _perm[_index1]); + + byte temp = _perm[_index1]; + _perm[_index1] = _perm[_index2]; + _perm[_index2] = temp; + + byte j = (byte)(_perm[_index1] + _perm[_index2]); + byte keystreamByte = _perm[j]; + + buffer[offset + i] ^= keystreamByte; // Modify the result buffer + } + + return result; // Return the modified buffer + } + + // Clone creates a new, uninitialized instance for the factory + public override BaseSecurity Clone() + { + return new ARCFourSecurity(); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs.meta new file mode 100644 index 0000000000..3e487c18f0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/ARCFourSecurity.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ed232d5091d53473ca011b5363a1a1bf \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs new file mode 100644 index 0000000000..079130e326 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs @@ -0,0 +1,84 @@ +using CSNetwork.Security; +using System; +using System.Collections.Generic; + +namespace CSNetwork.Security +{ + /// + /// Security types matching the C++ implementation + /// + public enum SecurityType + { + RANDOM = 0, + NULLSECURITY = 1, + ARCFOURSECURITY = 2, + MD5HASH = 3, + HMAC_MD5HASH = 4, + COMPRESSARCFOURSECURITY = 5, + DECOMPRESSARCFOURSECURITY = 6, + SHA256HASH = 7 + } + + /// + /// Base class for security implementations + /// + public abstract class BaseSecurity + { + protected SecurityType Type { get; set; } + + private static Dictionary _securityMap = + new Dictionary(); + + public static void Initizalize(){ + _securityMap[SecurityType.NULLSECURITY] = new NullSecurity(); + _securityMap[SecurityType.ARCFOURSECURITY] = new ARCFourSecurity(); + // _securityMap[SecurityType.COMPRESSARCFOURSECURITY] = new CompressArcFourSecurity(); + _securityMap[SecurityType.DECOMPRESSARCFOURSECURITY] = new DecompressArcFourSecurity(); + } + + + protected BaseSecurity() { } + + protected BaseSecurity(SecurityType type) + { + Type = type; + if (!_securityMap.ContainsKey(type)) + { + _securityMap[type] = this; + } + } + + public virtual void SetParameter(Octets param) { } + + public virtual void GetParameter(Octets param) { } + + public abstract Octets Update(Octets data); + public abstract byte[] Update(byte[] data); + + + public virtual Octets Final(Octets data) + { + return data; + } + + public abstract BaseSecurity Clone(); + + public static BaseSecurity Create(SecurityType type) + { + if (_securityMap.TryGetValue(type, out BaseSecurity security)) + { + return security.Clone(); + } + + // Default to null security if type not found + if (_securityMap.TryGetValue(SecurityType.NULLSECURITY, out BaseSecurity nullSecurity)) + { + return nullSecurity.Clone(); + } + + throw new InvalidOperationException( + $"Security type {type} not registered and no NULLSECURITY fallback available" + ); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs.meta new file mode 100644 index 0000000000..7f7779ca5f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/BaseSecurity.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5cb0e78c3e6554125ba05bab407609da \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs new file mode 100644 index 0000000000..f4fb07920f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs @@ -0,0 +1,105 @@ +using System; +using System.IO; +using System.IO.Compression; +using CSNetwork; +using CSNetwork.Security; + +namespace CSNetwork.Security +{ + /// + /// Implements ARCFour decryption followed by ZLib decompression. + /// Used for the input security layer based on GNET::DECOMPRESSARCFOURSECURITY. + /// + public class DecompressArcFourSecurity : BaseSecurity + { + private static readonly IPrefixedLogger _logger = LoggerFactory.GetLogger(nameof(DecompressArcFourSecurity)); + + private ARCFourSecurity _arcFour; // Internal RC4 instance + private byte[] _key; + Decompress decompressor = new Decompress(); + // Constructor to register the type + public DecompressArcFourSecurity() + : base() + { + _arcFour = new ARCFourSecurity(); + _key = Array.Empty(); + } + + /// + /// Initializes the internal RC4 state. + /// + /// The secret key as Octets. + public override void SetParameter(Octets keyOctets) + { + _key = keyOctets.ToArray(); // Assuming parameter contains the key + _arcFour.SetParameter(keyOctets); // Pass Octets directly + _logger.Log(LogType.Debug, $"Key set (Length: {_key.Length})"); + } + + /// + /// Decrypts (RC4) and then decompresses (ZLib) the incoming data. + /// + /// The Octets containing the encrypted and compressed data. + /// A new Octets object containing the decrypted and decompressed data. + public override Octets Update(Octets data) + { + if (data == null || data.Length == 0) + { + return new Octets(); // Return empty if input is empty + } + // 1. Decrypt using ARCFour + Octets decryptedData; + try + { + // Pass a clone of the data to ARC4 Update, assuming it might modify input + // or just to be safe. Ensure _arcFour.Update returns a *new* Octets. + // *** If ARCFourSecurity.Update modified the input Octets in-place, this would be wrong. *** + // *** Assuming ARCFourSecurity.Update follows the abstract Security pattern and returns new Octets *** + decryptedData = _arcFour.Update(data); + } + catch (Exception ex) + { + _logger.Log(LogType.Error, $"ARCFour Decryption Error: {ex.Message}. Input Length: {data.Length}"); + _logger.LogException(ex); + throw new InvalidOperationException("ARCFour decryption failed.", ex); + } + + // 2. Decompress the decrypted data using ZLib + if (decryptedData.Length == 0) + { + // Decryption resulted in empty data + return decryptedData; + } + + Octets decompressedData; + try + { + decompressedData = decompressor.Update(decryptedData); + //_logger.Log(LogType.Debug, $"Decompressed {decryptedData.Length} bytes to {decompressedData.Length} bytes. Decompressed Data: {decompressedData.ToString()}"); + } + catch (Exception ex) + { + //_logger.Log(LogType.Error, $"MPPC Decompression Error after decryption: {ex.Message}. Decrypted Length: {decryptedData.Length}"); + string firstBytes = BitConverter.ToString(decryptedData.RawBuffer, 0, Math.Min(decryptedData.Length, 16)); + _logger.Log(LogType.Debug, $"Decrypted Data (first {Math.Min(decryptedData.Length, 16)} bytes): {firstBytes}"); + _logger.LogException(ex); + throw new InvalidDataException("MPPC decompression failed after decryption.", ex); + } + + return decompressedData; + } + + // Clone creates a new, uninitialized instance for the factory + public override BaseSecurity Clone() + { + // Return a new instance with the same key but a fresh ARCFour state + return new DecompressArcFourSecurity(); + } + public override byte[] Update(byte[] data) + { + var octest = new Octets(data); + var result = Update(octest); + return result.RawBuffer; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs.meta new file mode 100644 index 0000000000..610fcc4796 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/DecompressArcFourSecurity.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 68b4522dc0cfe488585db201c691a9d7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs new file mode 100644 index 0000000000..43f5d3c4a2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs @@ -0,0 +1,135 @@ +using System; + +namespace CSNetwork.Security +{ + /// + /// A C# port of the GNET::HMAC_MD5Hash class from security.h. + /// Uses the ported MD5Hash class. + /// + public class HMAC_MD5Hash + { + private byte[] _kOpad; // Outer padded key + private MD5Hash _innerMD5; // Inner hash state + + private const int BlockSize = 64; + + public HMAC_MD5Hash() + { + // Initialize required members, though SetParameter does the main setup + _kOpad = new byte[BlockSize]; + _innerMD5 = new MD5Hash(); // Initialize inner hash context + } + + // Sets the key for the HMAC operation. + public void SetParameter(Octets key) + { + SetParameter(key.ByteArray); + } + + public void SetParameter(byte[] key) + { + byte[] kIpad = new byte[BlockSize]; + // Reinitialize inner MD5 context + _innerMD5 = new MD5Hash(); + + int keyLen = key.Length; + byte[] actualKey; + + if (keyLen > BlockSize) + { + // If key is longer than block size, hash it + actualKey = MD5Hash.Digest(key); + keyLen = actualKey.Length; // Should be 16 for MD5 + } + else + { + actualKey = key; + } + + // Copy key to ipad and opad buffers, padding with 0 if necessary + // (though the memset below overwrites the padding anyway) + Buffer.BlockCopy(actualKey, 0, kIpad, 0, keyLen); + Buffer.BlockCopy(actualKey, 0, _kOpad, 0, keyLen); + + // XOR key with ipad and opad values + for (int i = 0; i < keyLen; i++) + { + kIpad[i] ^= 0x36; + _kOpad[i] ^= 0x5c; + } + + // Fill the remainder of ipad and opad buffers with the XOR constants + for (int i = keyLen; i < BlockSize; i++) + { + kIpad[i] = 0x36; + _kOpad[i] = 0x5c; + } + + // Start the inner hash computation with the inner padded key + _innerMD5.Update(kIpad, BlockSize); + + // Zeroize sensitive intermediate data + Array.Clear(kIpad, 0, kIpad.Length); + } + + // Updates the HMAC with message data. + public void Update(Octets message) + { + _innerMD5.Update(message.ByteArray, message.Length); + } + public void Update(byte[] message) + { + _innerMD5.Update(message, message.Length); + } + + + // Finalizes the HMAC computation. + // Returns the final HMAC hash as Octets. + public Octets Final(Octets digest) + { + // 1. Finalize the inner hash: H(K XOR ipad || message) + byte[] innerHashResult = _innerMD5.Final(); + + // 2. Calculate the outer hash: H(K XOR opad || innerHashResult) + MD5Hash outerMD5 = new MD5Hash(); // Create a new context for the outer hash + outerMD5.Update(_kOpad, BlockSize); // Start outer hash with outer padded key + outerMD5.Update(innerHashResult, innerHashResult.Length); // Append the inner hash result + byte[] finalHash = outerMD5.Final(); // Finalize outer hash + + // Zeroize sensitive intermediate data + Array.Clear(innerHashResult, 0, innerHashResult.Length); + // Optionally zeroize _kOpad if instance won't be reused with same key + + digest.Replace(finalHash); + return digest; + } + + // Convenience method to return byte[] directly + public byte[] Final() + { + Octets tempOctets = new Octets(); + Final(tempOctets); + return tempOctets.ByteArray; + } + + // Static method to compute HMAC in one go (like C# System.Security.Cryptography.HMACMD5) + // This is useful for testing but mirrors the C++ instance-based approach above for direct porting. + public static byte[] ComputeHash(byte[] key, byte[] message) + { + HMAC_MD5Hash hmac = new HMAC_MD5Hash(); + hmac.SetParameter(key); + hmac.Update(new Octets(message)); + return hmac.Final(); + } + + public static Octets ComputeHash(Octets key, Octets message) + { + HMAC_MD5Hash hmac = new HMAC_MD5Hash(); + hmac.SetParameter(key); + hmac.Update(message); + Octets result = new Octets(); + hmac.Final(result); + return result; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs.meta new file mode 100644 index 0000000000..2cf6dfc992 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/HMAC_MD5Hash.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eb066bc25dc224234988de0a1918dae5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs new file mode 100644 index 0000000000..9c031afadf --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs @@ -0,0 +1,302 @@ +using System; + +namespace CSNetwork.Security +{ + /// + /// A C# port of the GNET::MD5Hash class from security.h (portable version). + /// + public class MD5Hash + { + private uint[] _state; // state (ABCD) + private ulong _count; // number of bits, modulo 2^64 (lsb first) + private byte[] _buffer; // input buffer + private const int BufferSize = 64; + + public MD5Hash() + { + Init(); + } + + // MD5 initialization. Begins an MD5 operation, writing a new context. + private void Init() + { + _count = 0; + _state = new uint[4]; + _state[0] = 0x67452301; + _state[1] = 0xefcdab89; + _state[2] = 0x98badcfe; + _state[3] = 0x10325476; + _buffer = new byte[BufferSize]; + } + + // MD5 block update operation. Continues an MD5 message-digest + // operation, processing another message block, and updating the + // context. + public void Update(byte[] input, int inputLen) + { + int bufferIndex = (int)(_count / 8) % BufferSize; + _count += (ulong)inputLen * 8; + + int partLen = BufferSize - bufferIndex; + int i = 0; + + // Transform as many times as possible. + if (inputLen >= partLen) + { + Buffer.BlockCopy(input, 0, _buffer, bufferIndex, partLen); + Transform(_buffer, 0); + + for (i = partLen; i + BufferSize -1 < inputLen; i += BufferSize) + { + Transform(input, i); + } + bufferIndex = 0; + } + + // Buffer remaining input + if (i < inputLen) + { + Buffer.BlockCopy(input, i, _buffer, bufferIndex, inputLen - i); + } + } + + public void Update(Octets o) + { + Update(o.ByteArray, o.Length); + } + + + // MD5 finalization. Ends an MD5 message-digest operation, writing the + // the message digest and zeroizing the context. + // Returns the 16-byte MD5 digest. + public byte[] Final() + { + byte[] bits = Encode(_count); + + // Pad out to 56 mod 64. + int index = (int)(_count / 8) % 64; + int padLen = (index < 56) ? (56 - index) : (120 - index); + byte[] padding = new byte[padLen]; + padding[0] = 0x80; + Update(padding, padLen); + + // Append length (before padding) + Update(bits, 8); + + // Store state in digest + byte[] digest = Encode(_state); + + // Zeroize sensitive information. + // Array.Clear(_buffer, 0, _buffer.Length); + // Array.Clear(_state, 0, _state.Length); + // _count = 0; // Not strictly necessary for correctness but good practice + + // Re-initialize for potential reuse, mirroring C++ behavior + // where a new MD5Hash object is created for subsequent digests + // within HMAC_MD5Hash.Final. If the instance needs to be reusable + // after Final, Init() should be called. Let's keep state for now. + + return digest; + } + + public Octets Final(Octets digest) + { + byte[] hash = Final(); + digest.Replace(hash); + return digest; + } + + // MD5 basic transformation. Transforms state based on block. + private void Transform(byte[] block, int blockOffset) + { + uint a = _state[0], b = _state[1], c = _state[2], d = _state[3]; + uint[] x = Decode(block, blockOffset, 16); + + // Round 1 + FF(ref a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF(ref d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF(ref c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF(ref b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF(ref a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF(ref d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF(ref c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF(ref b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF(ref a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF(ref d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF(ref c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF(ref b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF(ref a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF(ref d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF(ref c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF(ref b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + // Round 2 + GG(ref a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG(ref d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG(ref c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG(ref b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG(ref a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG(ref d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG(ref c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG(ref b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG(ref a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG(ref d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG(ref c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG(ref b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG(ref a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG(ref d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG(ref c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG(ref b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + // Round 3 + HH(ref a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH(ref d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH(ref c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH(ref b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH(ref a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH(ref d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH(ref c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH(ref b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH(ref a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH(ref d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH(ref c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH(ref b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH(ref a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH(ref d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH(ref c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH(ref b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + // Round 4 + II(ref a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II(ref d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II(ref c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II(ref b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II(ref a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II(ref d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II(ref c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II(ref b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II(ref a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II(ref d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II(ref c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II(ref b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II(ref a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II(ref d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II(ref c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II(ref b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + _state[0] += a; + _state[1] += b; + _state[2] += c; + _state[3] += d; + } + + // Encodes input (ulong) into output (byte[]). Assumes len is multiple of 8. + private static byte[] Encode(ulong input) + { + byte[] output = new byte[8]; + output[0] = (byte)(input & 0xff); + output[1] = (byte)((input >> 8) & 0xff); + output[2] = (byte)((input >> 16) & 0xff); + output[3] = (byte)((input >> 24) & 0xff); + output[4] = (byte)((input >> 32) & 0xff); + output[5] = (byte)((input >> 40) & 0xff); + output[6] = (byte)((input >> 48) & 0xff); + output[7] = (byte)((input >> 56) & 0xff); + return output; + } + + // Encodes input (uint[]) into output (byte[]). Assumes len is multiple of 4. + private static byte[] Encode(uint[] input) + { + byte[] output = new byte[input.Length * 4]; + for (int i = 0, j = 0; i < input.Length; i++, j += 4) + { + output[j] = (byte)(input[i] & 0xff); + output[j+1] = (byte)((input[i] >> 8) & 0xff); + output[j+2] = (byte)((input[i] >> 16) & 0xff); + output[j+3] = (byte)((input[i] >> 24) & 0xff); + } + return output; + } + + + // Decodes input (byte[]) into output (uint[]). Assumes len is a multiple of 4. + private static uint[] Decode(byte[] input, int offset, int count) + { + uint[] output = new uint[count]; + for (int i = 0, j = offset; i < count; i++, j += 4) + { + output[i] = ((uint)input[j]) | (((uint)input[j+1]) << 8) | + (((uint)input[j+2]) << 16) | (((uint)input[j+3]) << 24); + } + return output; + } + + + // Constants for MD5Transform routine. + private const int S11 = 7; + private const int S12 = 12; + private const int S13 = 17; + private const int S14 = 22; + private const int S21 = 5; + private const int S22 = 9; + private const int S23 = 14; + private const int S24 = 20; + private const int S31 = 4; + private const int S32 = 11; + private const int S33 = 16; + private const int S34 = 23; + private const int S41 = 6; + private const int S42 = 10; + private const int S43 = 15; + private const int S44 = 21; + + // F, G, H and I are basic MD5 functions. + private static uint F(uint x, uint y, uint z) { return (z ^ (x & (y ^ z))); } + private static uint G(uint x, uint y, uint z) { return (y ^ (z & (x ^ y))); } + private static uint H(uint x, uint y, uint z) { return x ^ y ^ z; } + private static uint I(uint x, uint y, uint z) { return y ^ (x | ~z); } + + // rotates x left n bits. + private static uint RotateLeft(uint x, int n) { return (x << n) | (x >> (32-n)); } + + // FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + // Rotation is separate from addition to prevent recomputation. + private static void FF(ref uint a, uint b, uint c, uint d, uint x, int s, uint ac) { + a += F(b, c, d) + x + ac; + a = RotateLeft(a, s); + a += b; + } + private static void GG(ref uint a, uint b, uint c, uint d, uint x, int s, uint ac) { + a += G(b, c, d) + x + ac; + a = RotateLeft(a, s); + a += b; + } + private static void HH(ref uint a, uint b, uint c, uint d, uint x, int s, uint ac) { + a += H(b, c, d) + x + ac; + a = RotateLeft(a, s); + a += b; + } + private static void II(ref uint a, uint b, uint c, uint d, uint x, int s, uint ac) { + a += I(b, c, d) + x + ac; + a = RotateLeft(a, s); + a += b; + } + + // Static Digest method replicating C++ + public static Octets Digest(Octets o) + { + MD5Hash ctx = new MD5Hash(); + ctx.Update(o.ByteArray, o.Length); + byte[] hash = ctx.Final(); + return new Octets(hash); + } + + public static byte[] Digest(byte[] data) + { + MD5Hash ctx = new MD5Hash(); + ctx.Update(data, data.Length); + return ctx.Final(); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs.meta new file mode 100644 index 0000000000..7d7606c093 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/MD5Hash.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 69be965ef68764accb448708fbd5ff8a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs new file mode 100644 index 0000000000..dffd57284d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs @@ -0,0 +1,37 @@ +namespace CSNetwork.Security +{ + /// + /// A security implementation that does nothing. + /// + public class NullSecurity : BaseSecurity // Inherit from Security + { + // Constructor to register the type + public NullSecurity() + : base(SecurityType.NULLSECURITY) + { + } + + // SetParameter does nothing + public override void SetParameter(Octets param) + { + // No parameters needed + } + + // Update returns the data unchanged + public override Octets Update(Octets data) + { + return data; // No transformation + } + + // Clone creates a new instance + public override BaseSecurity Clone() + { + return new NullSecurity(); + } + + public override byte[] Update(byte[] data) + { + return data; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs.meta new file mode 100644 index 0000000000..562ce5b6b0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/NullSecurity.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c6e696984a5d345fb9e3bc07e3b4ae23 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs new file mode 100644 index 0000000000..c53e7800cb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs @@ -0,0 +1,87 @@ +using System; +using System.Security.Cryptography; + +namespace CSNetwork.Security +{ + /// + /// SHA256 hash implementation using .NET's built-in cryptography + /// + public class SHA256Hash : BaseSecurity + { + private SHA256 _sha256; + + public SHA256Hash() + : base() + { + Initialize(); + } + + public SHA256Hash(SecurityType type) + : base(type) + { + Initialize(); + } + + public SHA256Hash(SHA256Hash other) + : base() + { + Type = other.Type; + Initialize(); + } + + private void Initialize() + { + _sha256 = SHA256.Create(); + } + + public override Octets Update(Octets data) + { + // In .NET's implementation, we accumulate data and compute the hash in Final + // This is different from the C++ approach that updates incrementally + return data; + } + + + + public override BaseSecurity Clone() + { + return new SHA256Hash(this); + } + + /// + /// Static method to compute SHA256 hash directly from Octets + /// + public static Octets Digest(Octets data) + { + SHA256Hash hashObj = new SHA256Hash(); + hashObj.Update(data); + Octets result = new Octets(0); + return hashObj.Final(data); + } + + /// + /// Static method to compute SHA256 hash directly from byte array + /// + public static byte[] Digest(byte[] data) + { + using (SHA256 sha256 = SHA256.Create()) + { + return sha256.ComputeHash(data); + } + } + + /// + /// Static method to compute SHA256 hash directly from string + /// + public static byte[] Digest(string data) + { + byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data); + return Digest(bytes); + } + + public override byte[] Update(byte[] data) + { + return data; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs.meta new file mode 100644 index 0000000000..d17725baba --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SHA256Hash.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4b08d219745f4431ab0180b52fd0d154 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs new file mode 100644 index 0000000000..bdb1dbf86b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs @@ -0,0 +1,22 @@ +namespace CSNetwork.Security +{ + /// + /// Factory class to initialize and register all security implementations + /// + public static class SecurityFactory + { + private static bool _initialized = false; + + public static void Initialize() + { + if (_initialized) + return; + + // Register security implementations + new SHA256Hash(SecurityType.SHA256HASH); + // Add other security implementations as needed + + _initialized = true; + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs.meta new file mode 100644 index 0000000000..c9697fba0d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/SecurityFactory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 51bd328ad251e4e3ebc5a88f36f81f3f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs new file mode 100644 index 0000000000..12fb2deb35 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs @@ -0,0 +1,336 @@ +using System; +using System.Collections.Generic; + +namespace CSNetwork.Security +{ + + public class Decompress + { + private const int CTRL_OFF_EOB = 0; + private const int MPPC_HIST_LEN = 8192; + + private byte[] history = new byte[MPPC_HIST_LEN]; + private int historyPos; + private uint bitPos; + private uint adjust_bitPos; + private uint bitsProcessed; + private uint totalBits; + private List legacyInput = new List(); + private int readPos; + private int adjust_readPos; + + public Decompress() + { + historyPos = 0; + bitPos = 0; + } + + public Decompress(Decompress source) + { + Array.Copy(source.history, history, MPPC_HIST_LEN); + historyPos = source.historyPos; + bitPos = source.bitPos; + adjust_bitPos = source.adjust_bitPos; + bitsProcessed = source.bitsProcessed; + totalBits = source.totalBits; + legacyInput = new List(source.legacyInput); + readPos = source.readPos; + adjust_readPos = source.adjust_readPos; + } + + private bool PassBits(uint n) + { + bitPos += n; + bitsProcessed += n; + if (bitsProcessed < totalBits) + return true; + + bitPos = adjust_bitPos; + readPos = adjust_readPos; + return false; + } + + private uint ByteOrder32(uint value) + { + return ((value & 0x000000FF) << 24) + | ((value & 0x0000FF00) << 8) + | ((value & 0x00FF0000) >> 8) + | ((value & 0xFF000000) >> 24); + } + + private uint Fetch() + { + readPos += (int)(bitPos >> 3); + bitPos &= 7; + + byte[] fourBytes = new byte[4]; + for (int i = 0; i < 4 && readPos + i < legacyInput.Count; i++) + { + fourBytes[i] = legacyInput[readPos + i]; + } + + uint value = BitConverter.ToUInt32(fourBytes, 0); + return ByteOrder32(value) << (int)bitPos; + } + + private void LameCopy(int dstPos, int srcPos, int len) + { + if (dstPos - srcPos > 3) + { + while (len > 3) + { + // Copy 4 bytes at once for efficiency + Buffer.BlockCopy(history, srcPos, history, dstPos, 4); + dstPos += 4; + srcPos += 4; + len -= 4; + } + } + + while (len-- > 0) + { + history[dstPos++] = history[srcPos++]; + } + } + + public Octets Update(Octets input) + { + // Add input to legacy buffer + foreach (byte b in input.ToArray()) + { + legacyInput.Add(b); + } + + totalBits = (uint)(legacyInput.Count * 8 - bitPos); + readPos = 0; + bitsProcessed = 7; + + Octets output = new Octets(); + int histHead = historyPos; + + while (totalBits > bitsProcessed) + { + adjust_bitPos = bitPos; + adjust_readPos = readPos; + uint val = Fetch(); + + if (val < 0x80000000) + { + if (!PassBits(8)) + break; + history[historyPos++] = (byte)(val >> 24); + if (historyPos == MPPC_HIST_LEN) + historyPos = 0; + continue; + } + + if (val < 0xC0000000) + { + if (!PassBits(9)) + break; + history[historyPos++] = (byte)(((val >> 23) | 0x80) & 0xFF); + if (historyPos == MPPC_HIST_LEN) + historyPos = 0; + continue; + } + + uint offset = 0, + length = 0; + if (val >= 0xF0000000) + { + if (!PassBits(10)) + break; + offset = (val >> 22) & 0x3F; + if (offset == CTRL_OFF_EOB) + { + uint advance = 8 - (bitPos & 7); + if (advance < 8) + if (!PassBits(advance)) + break; + + // Copy current history segment to output + if (historyPos >= histHead) + { + byte[] segment = new byte[historyPos - histHead]; + Array.Copy(history, histHead, segment, 0, segment.Length); + + // If output is empty, replace it, otherwise insert at the end + if (output.Size == 0) + output.Replace(segment); + else + output.Insert(output.Size, segment); + } + else + { + // Wrap around case - two segments + byte[] segment1 = new byte[MPPC_HIST_LEN - histHead]; + Array.Copy(history, histHead, segment1, 0, segment1.Length); + + // Add first segment (from histHead to end of buffer) + if (output.Size == 0) + output.Replace(segment1); + else + output.Insert(output.Size, segment1); + + // Add second segment (from beginning to historyPos) + if (historyPos > 0) + { + byte[] segment2 = new byte[historyPos]; + Array.Copy(history, 0, segment2, 0, historyPos); + output.Insert(output.Size, segment2); + } + } + + if (historyPos == MPPC_HIST_LEN) + historyPos = 0; + + histHead = historyPos; + continue; + } + } + else if (val >= 0xE0000000) + { + if (!PassBits(12)) + break; + offset = ((val >> 20) & 0xFF) + 64; + } + else if (val >= 0xC0000000) + { + if (!PassBits(16)) + break; + offset = ((val >> 16) & 0x1FFF) + 320; + } + else + { + // Invalid data + bitPos = adjust_bitPos; + readPos = adjust_readPos; + break; + } + + val = Fetch(); + if (val < 0x80000000) + { + if (!PassBits(1)) + break; + length = 3; + } + else if (val < 0xC0000000) + { + if (!PassBits(4)) + break; + length = 4 | ((val >> 28) & 3); + } + else if (val < 0xE0000000) + { + if (!PassBits(6)) + break; + length = 8 | ((val >> 26) & 7); + } + else if (val < 0xF0000000) + { + if (!PassBits(8)) + break; + length = 16 | ((val >> 24) & 15); + } + else if (val < 0xF8000000) + { + if (!PassBits(10)) + break; + length = 32 | ((val >> 22) & 0x1F); + } + else if (val < 0xFC000000) + { + if (!PassBits(12)) + break; + length = 64 | ((val >> 20) & 0x3F); + } + else if (val < 0xFE000000) + { + if (!PassBits(14)) + break; + length = 128 | ((val >> 18) & 0x7F); + } + else if (val < 0xFF000000) + { + if (!PassBits(16)) + break; + length = 256 | ((val >> 16) & 0xFF); + } + else if (val < 0xFF800000) + { + if (!PassBits(18)) + break; + length = 0x200 | ((val >> 14) & 0x1FF); + } + else if (val < 0xFFC00000) + { + if (!PassBits(20)) + break; + length = 0x400 | ((val >> 12) & 0x3FF); + } + else if (val < 0xFFE00000) + { + if (!PassBits(22)) + break; + length = 0x800 | ((val >> 10) & 0x7FF); + } + else if (val < 0xFFF00000) + { + if (!PassBits(24)) + break; + length = 0x1000 | ((val >> 8) & 0xFFF); + } + else + { + bitPos = adjust_bitPos; + readPos = adjust_readPos; + break; + } + + if (historyPos - (int)offset < 0 || historyPos + (int)length > MPPC_HIST_LEN) + break; + + LameCopy(historyPos, historyPos - (int)offset, (int)length); + historyPos += (int)length; + if (historyPos >= MPPC_HIST_LEN) + historyPos = 0; + } + + // Copy remaining history segment to output + if (historyPos >= histHead) + { + byte[] result = new byte[historyPos - histHead]; + Array.Copy(history, histHead, result, 0, result.Length); + if (output.Size == 0) + output.Replace(result); + else + output.Insert(output.Size, result); + } + else + { + if (histHead < MPPC_HIST_LEN) + { + byte[] segment1 = new byte[MPPC_HIST_LEN - histHead]; + Array.Copy(history, histHead, segment1, 0, segment1.Length); + if (output.Size == 0) + output.Replace(segment1); + else + output.Insert(output.Size, segment1); + } + + if (historyPos > 0) + { + byte[] segment2 = new byte[historyPos]; + Array.Copy(history, 0, segment2, 0, historyPos); + output.Insert(output.Size, segment2); + } + } + + // Remove processed bytes from legacy input + legacyInput.RemoveRange(0, readPos); + + return output; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs.meta new file mode 100644 index 0000000000..7cfd3636e3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Security/StreamCompress.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9ff33ababe98d4fa492838e85758754c \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj.meta new file mode 100644 index 0000000000..140e6e249f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3c59b2ec21de843799f3f23a0b1b09b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json new file mode 100644 index 0000000000..fe0b20c2ce --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json @@ -0,0 +1,73 @@ +{ + "format": 1, + "restore": { + "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj": {} + }, + "projects": { + "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj", + "projectName": "CSNetwork", + "projectPath": "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj", + "packagesPath": "/Users/leducanh/.nuget/packages/", + "outputPath": "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/leducanh/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netstandard2.1" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.300" + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "dependencies": { + "System.Reflection.Metadata": { + "target": "Package", + "version": "[9.0.8, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "NETStandard.Library": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.301/RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/TestClient.deps.json.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json.meta similarity index 75% rename from Assets/Plugins/TestClient.deps.json.meta rename to Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json.meta index e9bc20ebdf..f535c6fff2 100644 --- a/Assets/Plugins/TestClient.deps.json.meta +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.dgspec.json.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7417da7f5b819be40aefcec927362f6a +guid: 7b30970fc3ad34f41840f55aec8faca6 TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props new file mode 100644 index 0000000000..9864a1fd0b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/leducanh/.nuget/packages/ + /Users/leducanh/.nuget/packages/ + PackageReference + 6.13.2 + + + + + \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props.meta new file mode 100644 index 0000000000..8f1df1891f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.props.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c9b1e8618d361465cbba4fd1b0ebf3d7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets new file mode 100644 index 0000000000..3dc06ef3cc --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets.meta new file mode 100644 index 0000000000..5bdcb30b71 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/CSNetwork.csproj.nuget.g.targets.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 37506648d7c7247d895d8726916797a5 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug.meta new file mode 100644 index 0000000000..d563c59956 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dda2989fd942d4b7faeb13f15db61c0a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1.meta new file mode 100644 index 0000000000..63d9d23fed --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 87277df6245c941f7ba4d75ddf3a01e7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs new file mode 100644 index 0000000000..669815a71e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs new file mode 100644 index 0000000000..668ded32bc --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("CSNetwork")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7dd1d7ecd58f6b2da58fc494035e0e234503cd30")] +[assembly: System.Reflection.AssemblyProductAttribute("CSNetwork")] +[assembly: System.Reflection.AssemblyTitleAttribute("CSNetwork")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs.meta new file mode 100644 index 0000000000..43db7dee54 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fd0941e177f5c41ddacd6f50ccafc96c \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache new file mode 100644 index 0000000000..512a4a89fb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d9404c20ac17582d7f048be547c9c19d0a3f0220d8b66785b342d07d4ee8b3d9 diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache.meta new file mode 100644 index 0000000000..cbf7c1783f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 47fc1b498340b454b9ae3fcb57aa5da1 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000000..3109362f81 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,8 @@ +is_global = true +build_property.RootNamespace = CSNetwork +build_property.ProjectDir = /Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = +build_property.EnableCodeStyleSeverity = diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig.meta new file mode 100644 index 0000000000..72fae3cb23 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d59d1d12d3d43415b8907f6fa81704dd +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.assets.cache b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..a788a1c1f90321783175c5895885be9f1cfd5d89 GIT binary patch literal 3936 zcmd50bHy!YM27vEb zKn_rE)2-nO!42PX9jRHi9r&ywxc*oxXpeMZRZ>XI6RT2eMJeHzBc(h5DRl#0wMoh5 zw(B**gD5uPupBOtUhSE6??rAVC!273;cKHO3Z`oWkT)Soo z$WZRpErUxfa3rg8{UM}Ep-GrlmHoW3UyJQGLVL<{K=B-eUp%%UK+=QB)qk)YaM_p| zN=!~%(5DtenS&$4YUFS*ac)G-B^)kJPsh{EzYmvUeNM#7{|;3YUM$*+01Vb809MXr zz%bwn;3{AQFbW7aY!yFPmpRG?v}X%UDtu@II*Gc`ab)5I8D{S7NBXh^lwVa z`6e=GCY?-zXu?lwQ#9p5QTepV_RU2Xy2_TB&GRa@LnT?VYr--tUo;kY)pEF*TVz7= z?o}>bQRilM-3xdYqyMaxvXaq1F*wI$r9PEToMcVUoRr*OZ`63+i$14k-mNuWx&{+j zAIJ E0E=pyIRF3v literal 0 HcmV?d00001 diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.assets.cache.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.assets.cache.meta new file mode 100644 index 0000000000..58bcf72a3d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.assets.cache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ebc601a68b0f143efa88c63b5b708d44 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..f4a69498a3ee82517489f48025ccae206b72c77a GIT binary patch literal 1500 zcmZQ$WM*JsU@X%QElw>e*3U^zDNRny%h1=$D@{)=(Jx3$&Q45EE!HotEG|jS)l1IL z$w^Hv$;{6y*2~PzEiFk*%1PC?)HBet(9g+C($7mRDK1IOOGzwBG14>84~FP+M$+X8 z)1{Y^lf%dew46a?@}i@M?{Y9QGRol7z{m+wj0C`%fqce#Ai>fAWB_Rf#swf!1tKy9 z$Yf)J@PmRK4H;NKsu&sAFa8QYvhL=G#dV)|>wJ-^^t>%|0_H$!)TJ zKI`VyI|uL1x@0D-$TWew$mVCm)cPY2%LV$6v6uU6zA)mO^osS(lNX8ymcD=SF(t-_ zXY#?-Gc{t9bXKM6$o{%!TN0bE`}AX7+L@su=9H8crP}7DmX;JH=IAH{lqTh5CVQt= zhU90b=Gi707^j)0nWq^VrkENe8Ycqn0t3b(BBQw|H4Pfgdbz13i7AOCi3B4#2%*Op zss|Cpb{spPQ7i@ZD;DL$H-ckvdzzZj+r>z1{FdgGWag#^g3?+n!+4AUP9){lty;7xH`r``l*Z8caB;MdB?21~54Gz+7L SdM3{#E&vee0UQaGWOo30`S{%c literal 0 HcmV?d00001 diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache.meta new file mode 100644 index 0000000000..103ef57d7e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 750f2fb669b104dc1bdd2aeac3ca8d52 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000000..d41095a0ec --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +edc410003353a7c92512866bf011e4d56b8cde300dd5370f4c828e976b3e2c59 diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache.meta new file mode 100644 index 0000000000..e7a76190c4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1fe4f7a53baf348a58f1721052a9c5aa +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt new file mode 100644 index 0000000000..a6b464315c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt @@ -0,0 +1,10 @@ +/Users/leducanh/Documents/PortingProjects/UnityProject/perfect-world-unity/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json +/Users/leducanh/Documents/PortingProjects/UnityProject/perfect-world-unity/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll +/Users/leducanh/Documents/PortingProjects/UnityProject/perfect-world-unity/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.pdb +/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.AssemblyReference.cache +/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.GeneratedMSBuildEditorConfig.editorconfig +/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfoInputs.cache +/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.AssemblyInfo.cs +/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.CoreCompileInputs.cache +/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.dll +/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.pdb diff --git a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt.meta similarity index 75% rename from Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json.meta rename to Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt.meta index 8a5f87f538..5ce688b746 100644 --- a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.deps.json.meta +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.csproj.FileListAbsolute.txt.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9117d707eb63a6442b7b36c6b7669bf3 +guid: 2e3b87de97a3947348e341601dfb44d4 TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.dll b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/Debug/netstandard2.1/CSNetwork.dll new file mode 100644 index 0000000000000000000000000000000000000000..3f28de2e0612c28f3517550196c408a621ccc227 GIT binary patch literal 375296 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 9.0.8" + ] + }, + "packageFolders": { + "/Users/leducanh/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj", + "projectName": "CSNetwork", + "projectPath": "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj", + "packagesPath": "/Users/leducanh/.nuget/packages/", + "outputPath": "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/leducanh/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netstandard2.1" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.300" + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "dependencies": { + "System.Reflection.Metadata": { + "target": "Package", + "version": "[9.0.8, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "NETStandard.Library": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.301/RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.assets.json.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.assets.json.meta new file mode 100644 index 0000000000..61e57426df --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.assets.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0241313731e934a48bf078b4d8e802fe +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache new file mode 100644 index 0000000000..4526c4d492 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache @@ -0,0 +1,15 @@ +{ + "version": 2, + "dgSpecHash": "f7IQ1w8FLOY=", + "success": true, + "projectFilePath": "/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj", + "expectedPackageFiles": [ + "/Users/leducanh/.nuget/packages/system.buffers/4.5.1/system.buffers.4.5.1.nupkg.sha512", + "/Users/leducanh/.nuget/packages/system.collections.immutable/9.0.8/system.collections.immutable.9.0.8.nupkg.sha512", + "/Users/leducanh/.nuget/packages/system.memory/4.5.5/system.memory.4.5.5.nupkg.sha512", + "/Users/leducanh/.nuget/packages/system.numerics.vectors/4.4.0/system.numerics.vectors.4.4.0.nupkg.sha512", + "/Users/leducanh/.nuget/packages/system.reflection.metadata/9.0.8/system.reflection.metadata.9.0.8.nupkg.sha512", + "/Users/leducanh/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache.meta new file mode 100644 index 0000000000..6d43617b86 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.nuget.cache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e0fed64ab40f14f5d99605194495f759 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json new file mode 100644 index 0000000000..df2fe85f21 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json @@ -0,0 +1 @@ +"restore":{"projectUniqueName":"/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj","projectName":"CSNetwork","projectPath":"/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/CSNetwork.csproj","outputPath":"/Users/leducanh/Documents/PortingProjects/UnityProject/pwcsclient/CSNetwork/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["netstandard2.1"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","dependencies":{"System.Reflection.Metadata":{"target":"Package","version":"[9.0.8, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"NETStandard.Library":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/9.0.301/RuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json.meta new file mode 100644 index 0000000000..f14a4f19a3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/project.packagespec.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 06822ff233fd24894a31933761c0243c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info new file mode 100644 index 0000000000..bdc2a77147 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info @@ -0,0 +1 @@ +17575628435645208 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info.meta new file mode 100644 index 0000000000..6621178a6f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.model.nuget.info.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f4cc754a187ce44f286e6c41e2dd31da +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info new file mode 100644 index 0000000000..bdc2a77147 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info @@ -0,0 +1 @@ +17575628435645208 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info.meta new file mode 100644 index 0000000000..d670f5118c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/obj/rider.project.restore.info.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6b5d47e7c27734921854b90b644022b8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs index fb34944012..8af7240540 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -200,6 +200,7 @@ namespace BrewMonster.Network void OnDestroy() { _gameSession.Disconnect(); + _gameSession.Dispose(); CECNPC.ReleaseStaticRes(); } } diff --git a/Assets/PerfectWorld/Scripts/UI/GameScene.meta b/Assets/PerfectWorld/Scripts/UI/GameScene.meta new file mode 100644 index 0000000000..3225e9f8ec --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/GameScene.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b77de0a26ef5c47a1ac950ba7257abb4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs b/Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs new file mode 100644 index 0000000000..3b09023c18 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs @@ -0,0 +1,13 @@ +using BrewMonster.Network; +using UnityEngine; + +namespace BrewMonster.UI +{ + public class EnterWorldTest : MonoBehaviour + { + public void EnterWorld() + { + UnityGameSession.EnterWorldAsync(null, null); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs.meta b/Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs.meta new file mode 100644 index 0000000000..806650a3d4 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/GameScene/EnterWorldTest.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 15fc8bf7015394eac8f0a9a0b8cc1f79 \ No newline at end of file diff --git a/Assets/Plugins/TestClient.deps.json b/Assets/Plugins/TestClient.deps.json deleted file mode 100644 index b8a911cb39..0000000000 --- a/Assets/Plugins/TestClient.deps.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETStandard,Version=v2.1/", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETStandard,Version=v2.1": {}, - ".NETStandard,Version=v2.1/": { - "TestClient/1.0.0": { - "dependencies": { - "CSNetwork": "1.0.0" - }, - "runtime": { - "TestClient.dll": {} - } - }, - "System.Buffers/4.5.1": { - "runtime": { - "lib/netstandard2.0/System.Buffers.dll": { - "assemblyVersion": "4.0.3.0", - "fileVersion": "4.6.28619.1" - } - } - }, - "System.Collections.Immutable/9.0.8": { - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - }, - "runtime": { - "lib/netstandard2.0/System.Collections.Immutable.dll": { - "assemblyVersion": "9.0.0.0", - "fileVersion": "9.0.825.36511" - } - } - }, - "System.Memory/4.5.5": { - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - }, - "runtime": { - "lib/netstandard2.0/System.Memory.dll": { - "assemblyVersion": "4.0.1.2", - "fileVersion": "4.6.31308.1" - } - } - }, - "System.Numerics.Vectors/4.4.0": { - "runtime": { - "lib/netstandard2.0/System.Numerics.Vectors.dll": { - "assemblyVersion": "4.1.3.0", - "fileVersion": "4.6.25519.3" - } - } - }, - "System.Reflection.Metadata/9.0.8": { - "dependencies": { - "System.Collections.Immutable": "9.0.8", - "System.Memory": "4.5.5" - }, - "runtime": { - "lib/netstandard2.0/System.Reflection.Metadata.dll": { - "assemblyVersion": "9.0.0.0", - "fileVersion": "9.0.825.36511" - } - } - }, - "System.Runtime.CompilerServices.Unsafe/6.0.0": { - "runtime": { - "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { - "assemblyVersion": "6.0.0.0", - "fileVersion": "6.0.21.52210" - } - } - }, - "CSNetwork/1.0.0": { - "dependencies": { - "System.Reflection.Metadata": "9.0.8" - }, - "runtime": { - "CSNetwork.dll": { - "assemblyVersion": "1.0.0.0", - "fileVersion": "1.0.0.0" - } - } - } - } - }, - "libraries": { - "TestClient/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - }, - "System.Buffers/4.5.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", - "path": "system.buffers/4.5.1", - "hashPath": "system.buffers.4.5.1.nupkg.sha512" - }, - "System.Collections.Immutable/9.0.8": { - "type": "package", - "serviceable": true, - "sha512": "sha512-Eje6exD7AGKPg5SIkmjyWTBq0KK6SpfTBfdFUmpGG07mNbYimFJ+jyVnILcs0ikFOXoYTBpBOxKYgAk2hhjYOw==", - "path": "system.collections.immutable/9.0.8", - "hashPath": "system.collections.immutable.9.0.8.nupkg.sha512" - }, - "System.Memory/4.5.5": { - "type": "package", - "serviceable": true, - "sha512": "sha512-XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "path": "system.memory/4.5.5", - "hashPath": "system.memory.4.5.5.nupkg.sha512" - }, - "System.Numerics.Vectors/4.4.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", - "path": "system.numerics.vectors/4.4.0", - "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" - }, - "System.Reflection.Metadata/9.0.8": { - "type": "package", - "serviceable": true, - "sha512": "sha512-oJQezcASFomKvSp+06pzvSFRTnzdUJtiO19peAdZ9RwiqZinBV56u7zW5fEGf2/VrQFL3qZSV7UapgG31XRWQA==", - "path": "system.reflection.metadata/9.0.8", - "hashPath": "system.reflection.metadata.9.0.8.nupkg.sha512" - }, - "System.Runtime.CompilerServices.Unsafe/6.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", - "path": "system.runtime.compilerservices.unsafe/6.0.0", - "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" - }, - "CSNetwork/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/Assets/Plugins/TestClient.dll b/Assets/Plugins/TestClient.dll deleted file mode 100644 index 5e23e852752858c39f74dfee95149af944c1d007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13824 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 N#c|CauK#}?_;0>1iS7UZ diff --git a/Assets/Plugins/TestClient.dll.meta b/Assets/Plugins/TestClient.dll.meta deleted file mode 100644 index ddaed96a08..0000000000 --- a/Assets/Plugins/TestClient.dll.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 32253f0b4e14bb44fbbebd2587b3e90f \ No newline at end of file diff --git a/Assets/Scenes/WorldRender.unity b/Assets/Scenes/WorldRender.unity index 8019ff8c38..e92e7951bb 100644 --- a/Assets/Scenes/WorldRender.unity +++ b/Assets/Scenes/WorldRender.unity @@ -98242,6 +98242,85 @@ MonoBehaviour: _meshFilter: {fileID: 364486940} _meshRenderer: {fileID: 364486939} _material: {fileID: 2100000, guid: 38603659d794349f6abdd4959b09ee3c, type: 2} +--- !u!1 &364651597 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 364651600} + - component: {fileID: 364651599} + - component: {fileID: 364651598} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &364651598 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 364651597} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_MoveRepeatDelay: 0.5 + m_MoveRepeatRate: 0.1 + m_XRTrackingOrigin: {fileID: 0} + m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_DeselectOnBackgroundClick: 1 + m_PointerBehavior: 0 + m_CursorLockBehavior: 0 + m_ScrollDeltaPerTick: 6 +--- !u!114 &364651599 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 364651597} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &364651600 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 364651597} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &365113123 GameObject: m_ObjectHideFlags: 0 @@ -541942,6 +542021,7 @@ Transform: SceneRoots: m_ObjectHideFlags: 0 m_Roots: + - {fileID: 364651600} - {fileID: 2065063583} - {fileID: 929195785} - {fileID: 90096988} diff --git a/Assets/Scripts/CanvasController.cs b/Assets/Scripts/CanvasController.cs index 214f98307d..ae5585106f 100644 --- a/Assets/Scripts/CanvasController.cs +++ b/Assets/Scripts/CanvasController.cs @@ -37,23 +37,11 @@ public class CanvasController : MonoBehaviour private void OnClickSelectChacter(RoleInfo roleInfo) { - TestClientProgram.HandleSelectRole(roleInfo, (result) => - { - context.Post(_ => - { - bgr.gameObject.SetActive(false); - screenLogin.gameObject.SetActive(false); - screenCharacter.gameObject.SetActive(false); - //gameController.InitCharacter(result); - }, null); - }); + } private void OnDestroy() { - TestClientProgram.HandleLogOut((result) => - { - Debug.LogError(result); - }); + } } diff --git a/Assets/Scripts/ScreenLogin.cs b/Assets/Scripts/ScreenLogin.cs index 4c2b86cac0..06314e2205 100644 --- a/Assets/Scripts/ScreenLogin.cs +++ b/Assets/Scripts/ScreenLogin.cs @@ -23,7 +23,6 @@ public class ScreenLogin : MonoBehaviour string _password = ifPassword.text; string _ip = ip.options[ip.value].text; Debug.LogError("Login..."); - TestClientProgram.HandleLogin(_ip, _username, _password, HandleLoginComplete, HandleLoginFaile); } private void HandleLoginComplete(List roleInfos)