Пример #1
0
        private static void SavePlayers()
        {
            foreach (string clientKey in WorldSocket.Clients.Keys)
            {
                WorldClient thisclient = WorldSocket.Clients[clientKey] as WorldClient;
                if (thisclient != null && thisclient.playerData.lastSaveTime == 0)
                {
                    thisclient.playerData.lastSaveTime = TimeUtils.getUnixTimeUint32();
                }

                if (thisclient != null && (TimeUtils.getUnixTimeUint32() - thisclient.playerData.lastSaveTime) > 20)
                {
                    thisclient.playerData.lastSaveTime = TimeUtils.getUnixTimeUint32();
                    // Save Player
                    new PlayerHelper().savePlayerInfo(thisclient);
                    // Notify Player about save
                    ServerPackets pak = new ServerPackets();
                    pak.sendSaveCharDataMessage(thisclient,
                                                StringUtils.charBytesToString_NZ(thisclient.playerInstance.CharacterName.getValue()));
                }

                // Handle Jackout exit
                if (thisclient.playerData.isJackoutInProgress == true &&
                    (thisclient.playerData.jackoutStartTime - TimeUtils.getUnixTimeUint32()) > 5)
                {
                    ServerPackets packets = new ServerPackets();
                    packets.sendExitGame(thisclient);
                }
            }
        }
Пример #2
0
        public void processHardlineExitConfirm(ref byte[] packet)
        {
            ServerPackets packets = new ServerPackets();

            switch (packet[0])
            {
            case 0x01:
                ServerPackets serverPak = new ServerPackets();
                        #if DEBUG
                serverPak.sendSystemChatMessage(Store.currentClient, "Exit to LA init...", "MODAL");
                        #endif

                // Tell client we want to reset
                byte[] response = { 0x81, 0x07 };

                Store.currentClient.messageQueue.addRpcMessage(response);
                break;

            case 0x02:
                Store.currentClient.playerData.isJackoutInProgress = true;
                Store.currentClient.playerData.jackoutStartTime    = TimeUtils.getUnixTimeUint32();
                packets.sendJackoutEffect(Store.currentClient);
                break;
            }
        }
Пример #3
0
        public void processPacket(byte[] packet)
        {
            // Update the last time we are called
            lastUsedTime = TimeUtils.getUnixTimeUint32();

            // Decryption start
            bool encrypted = false;

            byte[] processedPacket = null;
            if (packet.Length > 0)
            {
                if (packet[0] == 0x00)
                { // Plain text packet
                    processedPacket = packet;
                }
                else
                {
                    encrypted       = true;
                    processedPacket = decryptReceivedPacket(packet);
                }

                Output.WriteLine("\n" + key + " PSS = " + playerData.getPss() + ", Cseq = " + playerData.getCseq() + ", AckSSeq = " + playerData.getACK());
                Output.WriteLine("D: " + StringUtils.bytesToString(processedPacket));
                Output.WritePacketLog(StringUtils.bytesToString(processedPacket), "CLIENT", playerData.getPss().ToString(), playerData.getCseq().ToString(), playerData.getACK().ToString());

                Store.Mpm.Parse(encrypted, processedPacket);
                flushQueue();
            }
        }
Пример #4
0
        public void processHyperJump(ref byte[] rpcData)
        {
            double       xDest  = 0;
            double       yDest  = 0;
            double       zDest  = 0;
            PacketReader reader = new PacketReader(rpcData);

            xDest = reader.readDouble(1);
            yDest = reader.readDouble(1);
            zDest = reader.readDouble(1);

            // ToDo: figure out what this 6 bytes are could be
            // Skip 6 bytes as we currently didnt knew
            byte[] unknownJumpBytes = reader.readBytes(6);
            float  maybeMaxHeight   = reader.readFloat(1);

            reader.incrementOffsetByValue(1);
            UInt32 clientJumpIdUnknown = reader.readUInt32(1);

            // Players current X Z Y
            double x = 0;
            double y = 0;
            double z = 0;

            byte[] Ltvector3d = Store.currentClient.playerInstance.Position.getValue();
            NumericalUtils.LtVector3dToDoubles(Ltvector3d, ref x, ref y, ref z);
            int   rotation = (int)Store.currentClient.playerInstance.YawInterval.getValue()[0];
            float xPos     = (float)x;
            float yPos     = (float)y;
            float zPos     = (float)z;

            LtVector3f[] JumpMovements = Maths.ParabolicMovement(new LtVector3f(xPos, yPos, zPos),
                                                                 new LtVector3f((float)xDest, (float)yDest, (float)zDest), 50, 128);

            float  distance = Maths.getDistance(xPos, yPos, zPos, (float)xDest, (float)yDest, (float)zDest);
            UInt16 duration = (UInt16)(distance * 0.5f);

            UInt32 startTime = TimeUtils.getUnixTimeUint32();
            UInt32 endTime   = startTime + duration;

            ServerPackets packets = new ServerPackets();

            packets.sendHyperJumpID(clientJumpIdUnknown);
            Store.currentClient.playerData.isJumping = true;
            Store.currentClient.playerData.incrementJumpID();
            UInt32 maybeTimeBasedValue = 40384248;

            foreach (LtVector3f currentJumpPos in JumpMovements)
            {
                Steps.Add(new JumpStep(currentJumpPos, new LtVector3f((float)xDest, (float)yDest, (float)zDest),
                                       maybeMaxHeight, endTime, Store.currentClient.playerData.getJumpID(), maybeTimeBasedValue));
                //packets.SendHyperJumpStepUpdate(currentJumpPos, xDest, yDest, zDest, maybeMaxHeight, endTime);
                maybeTimeBasedValue = maybeTimeBasedValue + 100;
            }

            hyperjumpTimer = new Timer(ProcessJumpStep, this, 0, 0);

            //packets.SendHyperJumpUpdate(xPos,yPos,zPos,(float)xDest,(float)yDest,(float)zDest,startTime,endTime);
        }
Пример #5
0
        private void CleanNakPackets()
        {
            // ToDo: split flushQueue and resending
            UInt32 currentTime = TimeUtils.getUnixTimeUint32();
            // Remove Packets that are resent more than 3 times and we didnt got an ack for it
            ArrayList ackedObjectMessages = new ArrayList();

            lock (messageQueue.ObjectMessagesQueue.SyncRoot)
            {
                foreach (SequencedMessage message in messageQueue.ObjectMessagesQueue)
                {
                    if (message.sendCounter >= 10 && message.getResendTime() >= TimeUtils.getUnixTimeUint32())
                    {
                        ackedObjectMessages.Add(message);
                    }
                }
            }


            ArrayList ackedRPCMessages = new ArrayList();

            lock (messageQueue.RPCMessagesQueue.SyncRoot)
            {
                foreach (SequencedMessage message in messageQueue.RPCMessagesQueue)
                {
                    if (message.sendCounter >= 10 && message.getResendTime() >= TimeUtils.getUnixTimeUint32())
                    {
                        ackedRPCMessages.Add(message);
                    }
                }
            }

            // Now delete them finally
            foreach (SequencedMessage deletedAckObject in ackedObjectMessages)
            {
                lock (messageQueue.ObjectMessagesQueue.SyncRoot)
                {
                    messageQueue.ObjectMessagesQueue.Remove(deletedAckObject);
                }
            }

            foreach (SequencedMessage deletedAckRpc in ackedRPCMessages)
            {
                lock (messageQueue.RPCMessagesQueue.SyncRoot)
                {
                    messageQueue.RPCMessagesQueue.Remove(deletedAckRpc);
                }
            }
        }
Пример #6
0
        public void processPacket(byte[] packet)
        {
            // Update the last time we are called
            lastUsedTime = TimeUtils.getUnixTimeUint32();

            // Decryption start
            bool encrypted = false;

            byte[]    processedPacket = null;
            Stopwatch stopwatch       = new Stopwatch();

            if (packet.Length > 0)
            {
                if (packet[0] == 0x00)
                {
                    // Plain text packet
                    processedPacket = packet;
                    Output.WritePacketLog(processedPacket, "CLIENT",
                                          playerData.getPss().ToString(), playerData.getCseq().ToString(),
                                          playerData.getACK().ToString());
                }
                else
                {
                    encrypted = true;
                    stopwatch.Start();
                    processedPacket = DecryptReceivedPacket(packet);
                    stopwatch.Stop();
                    TimeSpan ts = stopwatch.Elapsed;

                    Output.WritePacketLog(processedPacket, "CLIENT",
                                          playerData.getPss().ToString(), playerData.getCseq().ToString(), playerData.getACK().ToString(),
                                          ts.TotalMilliseconds.ToString(), "DECRYPT");
                }


//                Output.WriteLine("\n" + key + " PSS = " + playerData.getPss() + ", Cseq = " + playerData.getCseq() +
//                                 ", AckSSeq = " + playerData.getACK());
                Store.Mpm.Parse(encrypted, processedPacket);
                FlushQueue();
            }
        }
Пример #7
0
        public void processHyperJumpCancel(ref byte[] rpcData)
        {
            double       xDest  = 0;
            double       yDest  = 0;
            double       zDest  = 0;
            PacketReader reader = new PacketReader(rpcData);

            xDest = reader.readDouble(1);
            yDest = reader.readDouble(1);
            zDest = reader.readDouble(1);

            // ToDo: figure out what this 6 bytes are could be
            // Skip 6 bytes as we currently didnt knew
            reader.incrementOffsetByValue(6);
            UInt32 maybeMaxHeight = reader.readUInt32(1);

            reader.setOffsetOverrideValue(rpcData.Length - 4);
            UInt32 clientJumpIdUnknown = reader.readUInt32(1);

            // Players current X Z Y
            double x = 0; double y = 0; double z = 0;

            byte[] Ltvector3d = Store.currentClient.playerInstance.Position.getValue();
            NumericalUtils.LtVector3dToDoubles(Ltvector3d, ref x, ref y, ref z);
            int   rotation = (int)Store.currentClient.playerInstance.YawInterval.getValue()[0];
            float xPos     = (float)x;
            float yPos     = (float)y;
            float zPos     = (float)z;

            float  distance = Maths.getDistance(xPos, yPos, zPos, (float)xDest, (float)yDest, (float)zDest);
            UInt16 duration = (UInt16)(distance * 0.5);

            UInt32 startTime = TimeUtils.getUnixTimeUint32();
            UInt32 endTime   = startTime + duration;

            ServerPackets packets = new ServerPackets();

            packets.sendHyperJumpID(clientJumpIdUnknown);
            packets.SendHyperJumpUpdate(xPos, yPos, zPos, (float)xDest, (float)yDest, (float)zDest, startTime, endTime);
        }
Пример #8
0
        public void processHyperJump(ref byte[] packet)
        {
            byte[]       destXBytes = new byte[8];
            byte[]       destYBytes = new byte[8];
            byte[]       destZBytes = new byte[8];
            byte[]       maxHeight  = new byte[4];
            byte[]       theLast4   = new byte[4]; // we dont know what this is lol
            DynamicArray restBytes  = new DynamicArray();

            ArrayUtils.copy(packet, 0, destXBytes, 0, 8);
            ArrayUtils.copy(packet, 8, destYBytes, 0, 8);
            ArrayUtils.copy(packet, 16, destZBytes, 0, 8);
            ArrayUtils.copy(packet, 30, maxHeight, 0, 4);
            ArrayUtils.copy(packet, packet.Length - 4, theLast4, 0, 4);

            // Players current X Z Y
            double x = 0; double y = 0; double z = 0;

            byte[] Ltvector3d = Store.currentClient.playerInstance.Position.getValue();
            NumericalUtils.LtVector3dToDoubles(Ltvector3d, ref x, ref y, ref z);
            int   rotation = (int)Store.currentClient.playerInstance.YawInterval.getValue()[0];
            float xPos     = (float)x;
            float yPos     = (float)y;
            float zPos     = (float)z;

            float xDestFloat = (float)NumericalUtils.byteArrayToDouble(destXBytes, 1);
            float yDestFloat = (float)NumericalUtils.byteArrayToDouble(destYBytes, 1);
            float zDestFloat = (float)NumericalUtils.byteArrayToDouble(destZBytes, 1);

            float  distance = getDistance(xPos, yPos, zPos, xDestFloat, yDestFloat, zDestFloat);
            UInt16 duration = (UInt16)(distance * 1.5);
            //UInt32 startTime = TimeUtils.getUnixTimeUint32() - 100000;
            //UInt32 endTime = startTime + duration;

            UInt32        startTime = TimeUtils.getUnixTimeUint32();
            UInt32        endTime   = startTime + duration;
            PacketContent pak       = new PacketContent();

            pak.addByte(0x02);
            pak.addByte(0x00);
            pak.addByte(0x03);
            pak.addByte(0x09);
            pak.addByte(0x08);
            pak.addByte(0x00);
            pak.addFloatLtVector3f(xPos, yPos, zPos);
            pak.addUint32(startTime, 1);
            pak.addByte(0x80);
            pak.addByte(0x80);
            pak.addByte(0xb8);
            pak.addByte(0x14); // if 0xb8
            pak.addByte(0x00); // if 0xb8
            pak.addUint32(endTime, 1);
            pak.addByteArray(destXBytes);
            pak.addByteArray(destYBytes);
            pak.addByteArray(destZBytes);
            pak.addByteArray(new byte[] { 0x10, 0xff, 0xff });
            pak.addByte(0x00);
            pak.addByte(0x00);
            pak.addByte(0x00);
            Store.currentClient.messageQueue.addObjectMessage(pak.returnFinalPacket(), true);
        }
Пример #9
0
        // Flush the MessageQueue Lists to the Client
        public void flushQueue()
        {
            // This resend the MessageQueue - should be called after parsing or after sending something out
            // or in a timed interval (keep alive for example)


            // Sends RAW MEssages
            sendRawMessages();
            Output.WriteLine("[CLIENT] In Queue Messages : " + messageQueue.ObjectMessagesQueue.Count.ToString() + " Object and " + messageQueue.RPCMessagesQueue.Count.ToString() + " RPC Messages");
            ArrayList worldPackets = new ArrayList();

            WorldPacket packet = new WorldPacket(playerData);

            // Init encrypted Packet if we have MPM Messages
            if (messageQueue.RPCMessagesQueue.Count > 0 || messageQueue.ObjectMessagesQueue.Count > 0 && flushingQueueInProgress == false)
            {
                flushingQueueInProgress = true;
                // we currently dont know if we send something out so we need to proove that in a way
                if (messageQueue.ObjectMessagesQueue.Count > 0)
                {
                    UInt16 sendingSSeq = playerData.calculateNextPossibleSseq();
                    lock (messageQueue.ObjectMessagesQueue.SyncRoot)
                    {
                        foreach (SequencedMessage messageObjects in messageQueue.ObjectMessagesQueue)
                        {
                            // Just append each message...
                            if (messageObjects.getResendTime() >= TimeUtils.getUnixTimeUint32() || messageObjects.getResendTime() == 0)
                            {
                                // Check if this really save the resendtime or not
                                messageObjects.increaseResendTime();
                                bool canAddThePak = packet.addObjectContent(messageObjects);
                                if (canAddThePak == false)
                                {
                                    packet.isFinal = true;
                                    // if one sub has a timed param set, we just set it here too
                                    worldPackets.Add(packet);
                                    // Start new packet and add it to the queue
                                    packet = new WorldPacket(playerData);
                                    packet.addRPCContent(messageObjects);
                                }
                                if (messageObjects.isTimed == true)
                                {
                                    packet.timed = true;
                                }
                            }
                        }
                    }
                }

                // Workaround: complete the packet so we dont mix up
                if (packet.ObjectMessages.Count > 0)
                {
                    packet.isFinal = true;
                    worldPackets.Add(packet);
                    packet       = new WorldPacket(playerData);
                    packet.timed = false;
                }

                if (messageQueue.RPCMessagesQueue.Count > 0)
                {
                    lock (messageQueue.RPCMessagesQueue.SyncRoot)
                    {
                        foreach (SequencedMessage messageRPC in messageQueue.RPCMessagesQueue)
                        {
                            // First do stuff on messages
                            // Just append each message...
                            if (messageRPC.getResendTime() >= TimeUtils.getUnixTimeUint32() || messageRPC.getResendTime() == 0)
                            {
                                // Check if this really save the resendtime or not
                                messageRPC.increaseResendTime();
                                if (packet.addRPCContent(messageRPC) == false)
                                {
                                    packet.isFinal = true;
                                    worldPackets.Add(packet);
                                    // Start new packet and add it to the queue
                                    packet = new WorldPacket(playerData);
                                    packet.addRPCContent(messageRPC);
                                }

                                if (messageRPC.isTimed == true)
                                {
                                    packet.timed = true;
                                }
                            }
                        }
                    }
                }

                // Check if the current not finalize packet has content and needs to be send
                if ((packet.isFinal == false) && (packet.ObjectMessages.Count > 0 || packet.RPCMessages.Count > 0))
                {
                    worldPackets.Add(packet);
                }
            }

            // We have nothing - but we should really ack this
            if (messageQueue.ackOnlyCount > 0)
            {
                for (int i = 0; i < messageQueue.ackOnlyCount; i++)
                {
                    WorldPacket ackPacket = new WorldPacket(playerData);
                    packet.isFinal = true;
                    packet.timed   = false;
                    worldPackets.Add(ackPacket);
                }
                messageQueue.ackOnlyCount = 0;
            }


            // We have now PacketObjects - time to send them
            if (worldPackets.Count > 0)
            {
                Output.WriteLine("[CLIENT] Flush the final Queue with " + worldPackets.Count.ToString() + " Packets");
                foreach (WorldPacket thePacket in worldPackets)
                {
                    playerData.IncrementSseq();

                    byte[] finalData = thePacket.getFinalData(playerData);

                    Output.WritePacketLog(StringUtils.bytesToString(finalData), "SERVER", playerData.getPss().ToString(), playerData.getCseq().ToString(), playerData.getSseq().ToString());
                    byte[] encryptedData = cypher.encrypt(finalData, finalData.Length, playerData.getPss(), playerData.getCseq(), playerData.getSseq());
                    sendPacket(encryptedData);
                    Output.WriteDebugLog("PACKET SEND FINALLY (WC AFTER sendPacket):" + StringUtils.bytesToString(finalData));
                }
            }

            flushingQueueInProgress = false;
        }
Пример #10
0
 public npc()
 {
     this.next_move_time = TimeUtils.getUnixTimeUint32() + (30); // 30 seconds for a move to test
 }