From aee30ba64a01ff1fc678fbd1b0700aeddb89e129 Mon Sep 17 00:00:00 2001 From: Ruslan Pyrch Date: Sat, 23 Nov 2024 01:15:58 +0200 Subject: [PATCH] use OpenUPM in Unity test project --- LiteNetLib/LiteNetLib.csproj | 7 - LiteNetLibSampleUnity/Assets/LiteNetLib.dll | Bin 110592 -> 0 bytes .../Assets/LiteNetLib.dll.meta | 32 - .../Assets/LiteNetLib.pdb.meta | 7 - LiteNetLibSampleUnity/Assets/LiteNetLib.xml | 1514 ----------------- .../Assets/LiteNetLib.xml.meta | 7 - .../PackageManagerSettings.asset | 14 +- README.md | 2 +- 8 files changed, 12 insertions(+), 1571 deletions(-) delete mode 100644 LiteNetLibSampleUnity/Assets/LiteNetLib.dll delete mode 100644 LiteNetLibSampleUnity/Assets/LiteNetLib.dll.meta delete mode 100644 LiteNetLibSampleUnity/Assets/LiteNetLib.pdb.meta delete mode 100644 LiteNetLibSampleUnity/Assets/LiteNetLib.xml delete mode 100644 LiteNetLibSampleUnity/Assets/LiteNetLib.xml.meta diff --git a/LiteNetLib/LiteNetLib.csproj b/LiteNetLib/LiteNetLib.csproj index 75e1ad3b..04b21b85 100644 --- a/LiteNetLib/LiteNetLib.csproj +++ b/LiteNetLib/LiteNetLib.csproj @@ -45,13 +45,6 @@ net5.0;net6.0;net7.0;net8.0;netstandard2.0;netstandard2.1;net471 - - - - - - - True diff --git a/LiteNetLibSampleUnity/Assets/LiteNetLib.dll b/LiteNetLibSampleUnity/Assets/LiteNetLib.dll deleted file mode 100644 index e50b3b6d697e6b3698a109eb882a3f32300bcd09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110592 zcmce<37lL-wLgCQ-rKjkZ_iB9Go9|9NiyA8X1M9@namQhLNX+*0U=>?CLv@YED13e zrUNLQjsrXq6#_v(h=2w~6u0Mw`%?i$(8VI(6z))u~g$y1zG@g>z?=Vum)0Y$@d~8}%<9-T0>51sk_-_jlwrU6>oaVta1O_T2GjoRxc%zxl%6=4N-c zX1(eJ!#FKu86SOW=mm{3UNC0n;-Nmn_)y3&q6+)1hY`*p`~u#FFKHAocxmB9B52EccSN;u@7X*2l262 zEtlxJ#{<+W{!up52pd0q%rGAPt6?;z6q48V=rp~lhT-Oe_kdZ3B(^_|$n9o!s5Bj+ z3UQ{_iJ)m!ke8hY_o;oRfm&zY36;!E#huoWmnEI>vHTpu<8GwrINl5dpEo^d#L0(H z$EFc8Qdz^LprhtaG;2GZ@@9gnr^zfc7t=pF1mg2eAI-|?>S}?z`juOZm}w7LIOEOT zqbT-e-dhNO5an>vgOklNIhx5-%D)4cyqOX53FvO{HmFy_h#S+6GMbYBudijSGntSo zf1jp6L0jw|D^m!y*K@b*uw>eu?==xld99Q{!s#Fk!E|`OX{D^)TQqd8Y5CtrF;kZR z1H9_#H6Kl{p$YUFi+Z$-IVcqxA=(*Qk?lJ1h~;%bcRPlFZ!&ih8;y9-Ucq%DgFl8U zj+pMK*O?9t68WJ$*5`Me%8yv&2ayiVZ(=&h?{%buIYWME+V%M@SNRc({J{Fq{3fQ8 z{9Z@8u;hmpSfAetl^?Ol53CQ(Z(=&h?{%a@$4B{4YxVgZuks@n`GNJJ`AtkG`Mr*G z5y`K+F~1X3e#9a_us$@uiRmQ2*O3l33grWJefdsQ`4Nl!!1~bqCZ?18UPn3@1?1;7 z=690Hk67df)`#XdF`eZ1I?};xAwTrQ`tqHu@*@`cf%T#JO-v{Gy^eISe#j3!xjw&B zRDQ%FKd?SDzlrH2zayoaX(lT)9vC;074~Wgu)9fs{Xhb2pb}uqkpS4L0Cg=GDnSC2 zE`P4FRYi@Ub60UHR#^4B#!OqV&%g^JT_K>X$Zm`v1V-MaK z1{0?LCyX&20~jn7*;Ef=xNs?$Cfh8D;u=cqX^Lhi_eP@GX}w4gy=fgrJ%}izt+7

fmU+^VIPglmVUy`jx0*5_P7O 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ℜ#(kNu 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 - - - LiteNetLib - - - -

- Accept connection and get new NetPeer as result - - Connected NetPeer - - - - Type of message that you receive in OnNetworkReceiveUnconnected event - - - - - Disconnect reason that you receive in OnPeerDisconnected event - - - - - Additional information about disconnection - - - - - Additional info why peer disconnected - - - - - Error code (if reason is SocketSendError or SocketReceiveError) - - - - - Additional data that can be accessed (only if reason is RemoteConnectionClose) - - - - - New remote peer connected to host, or client connected to remote host - - Connected peer object - - - - Peer disconnected - - disconnected peer - additional info about reason, errorCode or data received with disconnect message - - - - Network error (on send or receive) - - From endPoint (can be null) - Socket error - - - - Received some data - - From peer - DataReader containing all received data - Number of channel at which packet arrived - Type of received packet - - - - Received unconnected message - - From address (IP and Port) - Message data - Message type (simple, discovery request or response) - - - - Latency information updated - - Peer with updated latency - latency value in milliseconds - - - - On peer connection requested - - Request information (EndPoint, internal id, additional data) - - - - On reliable message delivered - - - - - - - Ntp response - - - - - - Called when peer address changed (when AllowPeerAddressChange is enabled) - - Peer that changed address (with new address) - previous IP - - - - Module for UDP NAT Hole punching operations. Can be accessed from NetManager - - - - - Events automatically will be called without PollEvents method from another thread - - - - - Sending method type - - - - - Unreliable. Packets can be dropped, can be duplicated, can arrive without order. - - - - - Reliable. Packets won't be dropped, won't be duplicated, can arrive without order. - - - - - Unreliable. Packets can be dropped, won't be duplicated, will arrive in order. - - - - - Reliable and ordered. Packets won't be dropped, won't be duplicated, will arrive in order. - - - - - Reliable only last packet. Packets can be dropped (except the last one), won't be duplicated, will arrive in order. - Cannot be fragmented - - - - - Network constants. Can be tuned from sources for your purposes. - - - - - Interface to implement for your own logger - - - - - Static class for defining your own LiteNetLib logger instead of Console.WriteLine - or Debug.Log if compiled with UNITY flag - - - - - Main class for all network operations. Can be used as client and/or server. - - - - - Used with and to tag packets that - need to be dropped. Only relevant when DEBUG is defined. - - - - - Enable messages receiving without connection. (with SendUnconnectedMessage method) - - - - - Enable nat punch messages - - - - - Library logic update and send period in milliseconds - Lowest values in Windows doesn't change much because of Thread.Sleep precision - To more frequent sends (or sends tied to your game logic) use - - - - - Interval for latency detection and checking connection (in milliseconds) - - - - - If NetManager doesn't receive any packet from remote peer during this time (in milliseconds) then connection will be closed - (including library internal keepalive packets) - - - - - Simulate packet loss by dropping random amount of packets. (Works only in DEBUG mode) - - - - - Simulate latency by holding packets for random time. (Works only in DEBUG mode) - - - - - Chance of packet loss when simulation enabled. value in percents (1 - 100). - - - - - Minimum simulated latency (in milliseconds) - - - - - Maximum simulated latency (in milliseconds) - - - - - Events automatically will be called without PollEvents method from another thread - - - - - If true - receive event will be called from "receive" thread immediately otherwise on PollEvents call - - - - - If true - delivery event will be called from "receive" thread immediately otherwise on PollEvents call - - - - - Allows receive broadcast packets - - - - - Delay between initial connection attempts (in milliseconds) - - - - - Maximum connection attempts before client stops and call disconnect event. - - - - - Enables socket option "ReuseAddress" for specific purposes - - - - - UDP Only Socket Option - Normally IP sockets send packets of data through routers and gateways until they reach the final destination. - If the DontRoute flag is set to True, then data will be delivered on the local subnet only. - - - - - Statistics of all connections - - - - - Toggles the collection of network statistics for the instance and all known peers - - - - - NatPunchModule for NAT hole punching operations - - - - - Returns true if socket listening and update thread is running - - - - - Local EndPoint (host and port) - - - - - Automatically recycle NetPacketReader after OnReceive event - - - - - IPv6 support - - - - - Override MTU for all new peers registered in this NetManager, will ignores MTU Discovery! - - - - - Automatically discovery mtu starting from. Use at own risk because some routers can break MTU detection - and connection in result - - - - - First peer. Useful for Client mode - - - - - Experimental feature mostly for servers. Only for Windows/Linux - use direct socket calls for send/receive to drastically increase speed and reduce GC pressure - - - - - Disconnect peers if HostUnreachable or NetworkUnreachable spawned (old behaviour 0.9.x was true) - - - - - Allows peer change it's ip (lte to wifi, wifi to lte, etc). Use only on server - - - - - QoS channel count per message type (value must be between 1 and 64 channels) - - - - - Returns connected peers list (with internal cached list) - - - - - Returns connected peers count - - - - - NetManager constructor - - Network events listener (also can implement IDeliveryEventListener) - Extra processing of packages, like CRC checksum or encryption. All connected NetManagers must have same layer. - - - - Update and send logic. Use this only when NetManager started in manual mode - - elapsed milliseconds since last update call - - - - Send data to all connected peers (channel - 0) - - DataWriter with data - Send options (reliable, unreliable, etc.) - - - - Send data to all connected peers (channel - 0) - - Data - Send options (reliable, unreliable, etc.) - - - - Send data to all connected peers (channel - 0) - - Data - Start of data - Length of data - Send options (reliable, unreliable, etc.) - - - - Send data to all connected peers - - DataWriter with data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - - - - Send data to all connected peers - - Data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - - - - Send data to all connected peers - - Data - Start of data - Length of data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - - - - Send data to all connected peers (channel - 0) - - DataWriter with data - Send options (reliable, unreliable, etc.) - Excluded peer - - - - Send data to all connected peers (channel - 0) - - Data - Send options (reliable, unreliable, etc.) - Excluded peer - - - - Send data to all connected peers (channel - 0) - - Data - Start of data - Length of data - Send options (reliable, unreliable, etc.) - Excluded peer - - - - Send data to all connected peers - - DataWriter with data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - Excluded peer - - - - Send data to all connected peers - - Data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - Excluded peer - - - - Send data to all connected peers - - Data - Start of data - Length of data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - Excluded peer - - - - Start logic thread and listening on available port - - - - - Start logic thread and listening on selected port - - bind to specific ipv4 address - bind to specific ipv6 address - port to listen - - - - Start logic thread and listening on selected port - - bind to specific ipv4 address - bind to specific ipv6 address - port to listen - - - - Start logic thread and listening on selected port - - port to listen - - - - Start in manual mode and listening on selected port - In this mode you should use ManualReceive (without PollEvents) for receive packets - and ManualUpdate(...) for update and send packets - This mode useful mostly for single-threaded servers - - bind to specific ipv4 address - bind to specific ipv6 address - port to listen - - - - Start in manual mode and listening on selected port - In this mode you should use ManualReceive (without PollEvents) for receive packets - and ManualUpdate(...) for update and send packets - This mode useful mostly for single-threaded servers - - bind to specific ipv4 address - bind to specific ipv6 address - port to listen - - - - Start in manual mode and listening on selected port - In this mode you should use ManualReceive (without PollEvents) for receive packets - and ManualUpdate(...) for update and send packets - This mode useful mostly for single-threaded servers - - port to listen - - - - Send message without connection - - Raw data - Packet destination - Operation result - - - - Send message without connection. WARNING This method allocates a new IPEndPoint object and - synchronously makes a DNS request. If you're calling this method every frame it will be - much faster to just cache the IPEndPoint. - - Data serializer - Packet destination IP or hostname - Packet destination port - Operation result - - - - Send message without connection - - Data serializer - Packet destination - Operation result - - - - Send message without connection - - Raw data - data start - data length - Packet destination - Operation result - - - - Triggers update and send logic immediately (works asynchronously) - - - - - Receive "maxProcessedEvents" pending events. Call this in game update code - In Manual mode it will call also socket Receive (which can be slow) - 0 - receive all events - - Max events that will be processed (called INetEventListener Connect/Receive/Etc), 0 - receive all events - - - - Connect to remote host - - Server IP or hostname - Server Port - Connection key - New NetPeer if new connection, Old NetPeer if already connected, null peer if there is ConnectionRequest awaiting - Manager is not running. Call - - - - Connect to remote host - - Server IP or hostname - Server Port - Additional data for remote peer - New NetPeer if new connection, Old NetPeer if already connected, null peer if there is ConnectionRequest awaiting - Manager is not running. Call - - - - Connect to remote host - - Server end point (ip and port) - Connection key - New NetPeer if new connection, Old NetPeer if already connected, null peer if there is ConnectionRequest awaiting - Manager is not running. Call - - - - Connect to remote host - - Server end point (ip and port) - Additional data for remote peer - New NetPeer if new connection, Old NetPeer if already connected, null peer if there is ConnectionRequest awaiting - Manager is not running. Call - - - - Force closes connection and stop all threads. - - - - - Force closes connection and stop all threads. - - Send disconnect messages - - - - Return peers count with connection state - - peer connection state (you can use as bit flags) - peers count - - - - Get copy of peers (without allocations) - - List that will contain result - State of peers - - - - Disconnect all peers without any additional data - - - - - Disconnect all peers with shutdown message - - Data to send (must be less or equal MTU) - Data start - Data count - - - - Immediately disconnect peer from server without additional data - - peer to disconnect - - - - Disconnect peer from server - - peer to disconnect - - - - Disconnect peer from server and send additional data (Size must be less or equal MTU - 8) - - peer to disconnect - additional data - - - - Disconnect peer from server and send additional data (Size must be less or equal MTU - 8) - - peer to disconnect - additional data - - - - Disconnect peer from server and send additional data (Size must be less or equal MTU - 8) - - peer to disconnect - additional data - data start - data length - - - - Create the requests for NTP server - - NTP Server address. - - - - Create the requests for NTP server - - NTP Server address. - port - - - - Create the requests for NTP server (default port) - - NTP Server address. - - - - Gets peer by peer id - - id of peer - Peer if peer with id exist, otherwise null - - - - Gets peer by peer id - - id of peer - resulting peer - True if peer with id exist, otherwise false - - - - Maximum packet pool size (increase if you have tons of packets sending) - - - - - Start logic thread and listening on selected port - - bind to specific ipv4 address - bind to specific ipv6 address - port to listen - mode of library - - - - Peer connection state - - - - - Network peer. Main purpose is sending messages to specific peer. - - - - - Peer parent NetManager - - - - - Current connection state - - - - - Connection time for internal purposes - - - - - Peer id can be used as key in your dictionary of peers - - - - - Id assigned from server - - - - - Current one-way ping (RTT/2) in milliseconds - - - - - Round trip time in milliseconds - - - - - Current MTU - Maximum Transfer Unit ( maximum udp packet size without fragmentation ) - - - - - Delta with remote time in ticks (not accurate) - positive - remote time > our time - - - - - Remote UTC time (not accurate) - - - - - Time since last packet received (including internal library packets) in milliseconds - - - - - Application defined object containing data about the connection - - - - - Statistics of peer connection - - - - - IPEndPoint serialize - - SocketAddress - - - - Returns packets count in queue for reliable channel - - number of channel 0-63 - type of channel ReliableOrdered or ReliableUnordered - packets count in channel queue - - - - Create temporary packet (maximum size MTU - headerSize) to send later without additional copies - - Delivery method (reliable, unreliable, etc.) - Number of channel (from 0 to channelsCount - 1) - PooledPacket that you can use to write data starting from UserDataOffset - - - - Sends pooled packet without data copy - - packet to send - size of user data you want to send - - - - Gets maximum size of packet that will be not fragmented. - - Type of packet that you want send - size in bytes - - - - Send data to peer with delivery event called - - Data - Number of channel (from 0 to channelsCount - 1) - Delivery method (reliable, unreliable, etc.) - User data that will be received in DeliveryEvent - - If you trying to send unreliable packet type - - - - - Send data to peer with delivery event called - - Data - Start of data - Length of data - Number of channel (from 0 to channelsCount - 1) - Delivery method (reliable, unreliable, etc.) - User data that will be received in DeliveryEvent - - If you trying to send unreliable packet type - - - - - Send data to peer with delivery event called - - Data - Number of channel (from 0 to channelsCount - 1) - Delivery method (reliable, unreliable, etc.) - User data that will be received in DeliveryEvent - - If you trying to send unreliable packet type - - - - - Send data to peer (channel - 0) - - Data - Send options (reliable, unreliable, etc.) - - If size exceeds maximum limit: - MTU - headerSize bytes for Unreliable - Fragment count exceeded ushort.MaxValue - - - - - Send data to peer (channel - 0) - - DataWriter with data - Send options (reliable, unreliable, etc.) - - If size exceeds maximum limit: - MTU - headerSize bytes for Unreliable - Fragment count exceeded ushort.MaxValue - - - - - Send data to peer (channel - 0) - - Data - Start of data - Length of data - Send options (reliable, unreliable, etc.) - - If size exceeds maximum limit: - MTU - headerSize bytes for Unreliable - Fragment count exceeded ushort.MaxValue - - - - - Send data to peer - - Data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - - If size exceeds maximum limit: - MTU - headerSize bytes for Unreliable - Fragment count exceeded ushort.MaxValue - - - - - Send data to peer - - DataWriter with data - Number of channel (from 0 to channelsCount - 1) - Send options (reliable, unreliable, etc.) - - If size exceeds maximum limit: - MTU - headerSize bytes for Unreliable - Fragment count exceeded ushort.MaxValue - - - - - Send data to peer - - Data - Start of data - Length of data - Number of channel (from 0 to channelsCount - 1) - Delivery method (reliable, unreliable, etc.) - - If size exceeds maximum limit: - MTU - headerSize bytes for Unreliable - Fragment count exceeded ushort.MaxValue - - - - - Address type that you want to receive from NetUtils.GetLocalIp method - - - - - Some specific network utilities - - - - - Get all local ip addresses - - type of address (IPv4, IPv6 or both) - List with all local ip addresses - - - - Get all local ip addresses (non alloc version) - - result list - type of address (IPv4, IPv6 or both) - - - - Get first detected local ip address - - type of address (IPv4, IPv6 or both) - IP address if available. Else - string.Empty - - - - Maximum data size that you can put into such packet - - - - - Offset for user data when writing to Data array - - - - - Raw packet data. Do not modify header! Use UserDataOffset as start point for your data - - - - - Compute CRC32C for data - - input data - offset - length - CRC32C checksum - - - - Note that "maxStringLength" only limits the number of characters in a string, not its size in bytes. - Strings that exceed this parameter are returned as empty - - - - - Note that "maxLength" only limits the number of characters in a string, not its size in bytes. - - "string.Empty" if value > "maxLength" - - - - Note that "maxLength" only limits the number of characters in a string, not its size in bytes. - - - - - Creates NetDataWriter from existing ByteArray - - Source byte array - Copy array to new location or use existing - - - - Creates NetDataWriter from existing ByteArray (always copied data) - - Source byte array - Offset of array - Length of array - - - - Sets position of NetDataWriter to rewrite previous values - - new byte position - previous position of data writer - - - - Note that "maxLength" only limits the number of characters in a string, not its size in bytes. - - - - - Register nested property type - - INetSerializable structure - - - - Register nested property type - - - - - - - Register nested property type - - INetSerializable class - - - - Reads all available data from NetDataReader and calls OnReceive delegates - - NetDataReader with packets data - - - - Reads all available data from NetDataReader and calls OnReceive delegates - - NetDataReader with packets data - Argument that passed to OnReceivedEvent - Malformed packet - - - - Reads one packet from NetDataReader and calls OnReceive delegate - - NetDataReader with packet - Malformed packet - - - - Reads one packet from NetDataReader and calls OnReceive delegate - - NetDataReader with packet - Argument that passed to OnReceivedEvent - Malformed packet - - - - Register and subscribe to packet receive event - - event that will be called when packet deserialized with ReadPacket method - Method that constructs packet instead of slow Activator.CreateInstance - 's fields are not supported, or it has no fields - - - - Register and subscribe to packet receive event (with userData) - - event that will be called when packet deserialized with ReadPacket method - Method that constructs packet instead of slow Activator.CreateInstance - 's fields are not supported, or it has no fields - - - - Register and subscribe to packet receive event - This method will overwrite last received packet class on receive (less garbage) - - event that will be called when packet deserialized with ReadPacket method - 's fields are not supported, or it has no fields - - - - Register and subscribe to packet receive event - This method will overwrite last received packet class on receive (less garbage) - - event that will be called when packet deserialized with ReadPacket method - 's fields are not supported, or it has no fields - - - - Remove any subscriptions by type - - Packet type - true if remove is success - - - - Register custom property type - - INetSerializable structure - - - - Register custom property type - - INetSerializable class - - - - Register custom property type - - Any packet - custom type writer - custom type reader - - - 's fields are not supported, or it has no fields - - - - Reads packet with known type - - NetDataReader with packet - Returns packet if packet in reader is matched type - 's fields are not supported, or it has no fields - - - - Reads packet with known type (non alloc variant) - - NetDataReader with packet - Deserialization target - Returns true if packet in reader is matched type - 's fields are not supported, or it has no fields - - - - Serialize object to NetDataWriter (fast) - - Serialization target NetDataWriter - Object to serialize - 's fields are not supported, or it has no fields - - - - Serialize object to byte array - - Object to serialize - byte array with serialized data - - - - Represents RFC4330 SNTP packet used for communication to and from a network time server. - - - - Most applications should just use the property. - - - The same data structure represents both request and reply packets. - Request and reply differ in which properties are set and to what values. - - - The only real property is . - All other properties read from and write to the underlying byte array - with the exception of , - which is not part of the packet on network and it is instead set locally after receiving the packet. - - - Copied from GuerrillaNtp project - with permission from Robert Vazan (@robertvazan) under MIT license, see https://github.com/RevenantX/LiteNetLib/pull/236 - - - - - - Gets RFC4330-encoded SNTP packet. - - - Byte array containing RFC4330-encoded SNTP packet. It is at least 48 bytes long. - - - This is the only real property. All other properties except - read from or write to this byte array. - - - - - Gets the leap second indicator. - - - Leap second warning, if any. Special value - indicates unsynchronized server clock. - Default is . - - - Only servers fill in this property. Clients can consult this property for possible leap second warning. - - - - - Gets or sets protocol version number. - - - SNTP protocol version. Default is 4, which is the latest version at the time of this writing. - - - In request packets, clients should leave this property at default value 4. - Servers usually reply with the same protocol version. - - - - - Gets or sets SNTP packet mode, i.e. whether this is client or server packet. - - - SNTP packet mode. Default is in newly created packets. - Server reply should have this property set to . - - - - - Gets server's distance from the reference clock. - - - - Distance from the reference clock. This property is set only in server reply packets. - Servers connected directly to reference clock hardware set this property to 1. - Statum number is incremented by 1 on every hop down the NTP server hierarchy. - - - Special value 0 indicates that this packet is a Kiss-o'-Death message - with kiss code stored in . - - - - - - Gets server's preferred polling interval. - - - Polling interval in log2 seconds, e.g. 4 stands for 16s and 17 means 131,072s. - - - - - Gets the precision of server clock. - - - Clock precision in log2 seconds, e.g. -20 for microsecond precision. - - - - - Gets the total round-trip delay from the server to the reference clock. - - - Round-trip delay to the reference clock. Normally a positive value smaller than one second. - - - - - Gets the estimated error in time reported by the server. - - - Estimated error in time reported by the server. Normally a positive value smaller than one second. - - - - - Gets the ID of the time source used by the server or Kiss-o'-Death code sent by the server. - - - - ID of server's time source or Kiss-o'-Death code. - Purpose of this property depends on value of property. - - - Stratum 1 servers write here one of several special values that describe the kind of hardware clock they use. - - - Stratum 2 and lower servers set this property to IPv4 address of their upstream server. - If upstream server has IPv6 address, the address is hashed, because it doesn't fit in this property. - - - When server sets to special value 0, - this property contains so called kiss code that instructs the client to stop querying the server. - - - - - - Gets or sets the time when the server clock was last set or corrected. - - - Time when the server clock was last set or corrected or null when not specified. - - - This Property is usually set only by servers. It usually lags server's current time by several minutes, - so don't use this property for time synchronization. - - - - - Gets or sets the time when the client sent its request. - - - This property is null in request packets. - In reply packets, it is the time when the client sent its request. - Servers copy this value from - that they find in received request packet. - - - - - - - Gets or sets the time when the request was received by the server. - - - This property is null in request packets. - In reply packets, it is the time when the server received client request. - - - - - - - Gets or sets the time when the packet was sent. - - - Time when the packet was sent. It should never be null. - Default value is . - - - This property must be set by both clients and servers. - - - - - - - Gets or sets the time of reception of response SNTP packet on the client. - - - Time of reception of response SNTP packet on the client. It is null in request packets. - - - This property is not part of the protocol and has to be set when reply packet is received. - - - - - - - Gets the round-trip time to the server. - - - Time the request spent traveling to the server plus the time the reply spent traveling back. - This is calculated from timestamps in the packet as (t1 - t0) + (t3 - t2) - where t0 is , - t1 is , - t2 is , - and t3 is . - This property throws an exception in request packets. - - - - - Gets the offset that should be added to local time to synchronize it with server time. - - - Time difference between server and client. It should be added to local time to get server time. - It is calculated from timestamps in the packet as 0.5 * ((t1 - t0) - (t3 - t2)) - where t0 is , - t1 is , - t2 is , - and t3 is . - This property throws an exception in request packets. - - - - - Initializes default request packet. - - - Properties and - are set appropriately for request packet. Property - is set to . - - - - - Initializes packet from received data. - - - - - Initializes packet from data received from a server. - - Data received from the server. - Utc time of reception of response SNTP packet on the client. - - - - - Represents leap second warning from the server that instructs the client to add or remove leap second. - - - - - - No leap second warning. No action required. - - - - - Warns the client that the last minute of the current day has 61 seconds. - - - - - Warns the client that the last minute of the current day has 59 seconds. - - - - - Special value indicating that the server clock is unsynchronized and the returned time is unreliable. - - - - - Describes SNTP packet mode, i.e. client or server. - - - - - - Identifies client-to-server SNTP packet. - - - - - Identifies server-to-client SNTP packet. - - - - - PreserveAttribute prevents byte code stripping from removing a class, method, field, or property. - - - - diff --git a/LiteNetLibSampleUnity/Assets/LiteNetLib.xml.meta b/LiteNetLibSampleUnity/Assets/LiteNetLib.xml.meta deleted file mode 100644 index 30ffaeba..00000000 --- a/LiteNetLibSampleUnity/Assets/LiteNetLib.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 46009b99ce8ce4b4b9de461f4fc5cec2 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/LiteNetLibSampleUnity/ProjectSettings/PackageManagerSettings.asset b/LiteNetLibSampleUnity/ProjectSettings/PackageManagerSettings.asset index 89ffc0e9..d5a8583c 100644 --- a/LiteNetLibSampleUnity/ProjectSettings/PackageManagerSettings.asset +++ b/LiteNetLibSampleUnity/ProjectSettings/PackageManagerSettings.asset @@ -26,11 +26,19 @@ MonoBehaviour: m_IsDefault: 1 m_Capabilities: 7 m_ConfigSource: 0 - m_UserSelectedRegistryName: + - m_Id: scoped:project:package.openupm.com + m_Name: package.openupm.com + m_Url: https://package.openupm.com + m_Scopes: + - com.revenantx.litenetlib + m_IsDefault: 0 + m_Capabilities: 0 + m_ConfigSource: 4 + m_UserSelectedRegistryName: package.openupm.com m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: m_Modified: 0 m_ErrorMessage: - m_UserModificationsInstanceId: -864 - m_OriginalInstanceId: -866 + m_UserModificationsInstanceId: -834 + m_OriginalInstanceId: -836 m_LoadAssets: 0 diff --git a/README.md b/README.md index 64a869bb..7c63b002 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ Lite reliable UDP library for .NET Standard 2.0 (Mono, .NET Core, .NET Framework ## Unity notes!!! * Minimal supported Unity is 2018.3. For older Unity versions use [0.9.x library](https://github.com/RevenantX/LiteNetLib/tree/0.9) versions -* Always use library sources instead of precompiled DLL files ( because there are platform specific #ifdefs and workarounds for unity bugs ) +* Always use library sources or [OpenUPM package](https://openupm.com/packages/com.revenantx.litenetlib/) instead of precompiled DLL files ( because there are platform specific #ifdefs and workarounds for unity bugs ) ## Usage samples