copy() публичный статический Метод

public static copy ( byte sourceArray, int offsetB, byte destinationArray, int offsetA, int nBytes ) : void
sourceArray byte
offsetB int
destinationArray byte
offsetA int
nBytes int
Результат void
Пример #1
0
 // Asuring just inner buffer usage
 public byte[] encrypt(byte[] plainData, int length, UInt16 pss, UInt16 cseq, UInt16 sseq)
 {
     this.lastOperationResultSize = EnigmaLib.worldEncrypt(plainData, innerBuffer, length, pss, cseq, sseq);
     byte[] data = new byte[this.lastOperationResultSize];
     ArrayUtils.copy(innerBuffer, 0, data, 0, this.lastOperationResultSize);
     return(data);
 }
Пример #2
0
        public void processChat(ref byte[] packetData)
        {
            chatCommands = new ChatCommandsHelper();
            int offset = 0;

            //10 00 08 00 00 00 00 06 00 3f 53 61 76 65 00

            int length = (int)packetData[7];

            offset = 9; //Move to length +2
            if (length > 0)
            {
                byte[] textB = new byte[length - 1];
                ArrayUtils.copy(packetData, offset, textB, 0, length - 1);
                string text = StringUtils.charBytesToString(textB);

                if (text[0] == '?')
                {
                    //Maybe a parameter
                    chatCommands.parseCommand(text); // Parse for commands
                }
                else
                {
                    // Not a Param - lets distribute the Message throw our Area
                    ServerPackets pak = new ServerPackets();
                    pak.sendChatMessage(Store.currentClient, text, Store.currentClient.playerData.getCharID(), StringUtils.charBytesToString_NZ(Store.currentClient.playerInstance.CharacterName.getValue()), "AREA");
                    // ToDo: Send the ChatMessage to the Scope of Players
                }
            }
        }
Пример #3
0
        public void testCloseCombat(ref byte[] packet)
        {
            byte[] targetViewWithSpawnId = new byte[4];
            ArrayUtils.copy(packet, 0, targetViewWithSpawnId, 0, 4);
            string hexString    = StringUtils.bytesToString_NS(targetViewWithSpawnId);
            string hexStringPak = StringUtils.bytesToString_NS(packet);

            Store.currentClient.messageQueue.addObjectMessage(StringUtils.hexStringToBytes("020003010C00808400808080800100001000"), false); // Make me combat mode "on"

            // The 55 View Packet
            PacketContent ilCombatHandler = new PacketContent();

            ilCombatHandler.addHexBytes("01000C370036CDAB0205");
            ilCombatHandler.addByteArray(Store.currentClient.playerInstance.Position.getValue());
            ilCombatHandler.addHexBytes("cdec4023"); // Time starts i think
            ilCombatHandler.addHexBytes("fd0000");   // view ID fd00
            Store.currentClient.messageQueue.addObjectMessage(ilCombatHandler.returnFinalPacket(), false);
            Store.currentClient.flushQueue();
            // The other 03 Packet for combat
            PacketContent unknownCreatePak = new PacketContent();

            unknownCreatePak.addByteArray(StringUtils.hexStringToBytes("010002A700"));
            unknownCreatePak.addByteArray(StringUtils.hexStringToBytes("FD00")); // ViewID from Combat Object
            unknownCreatePak.addByteArray(StringUtils.hexStringToBytes("01"));
            unknownCreatePak.addByteArray(Store.currentClient.playerInstance.Position.getValue());
            unknownCreatePak.addByteArray(StringUtils.hexStringToBytes("0100000003000000"));
            unknownCreatePak.addByteArray(targetViewWithSpawnId);
            unknownCreatePak.addUint16(2, 1);
            unknownCreatePak.addUint16(Store.currentClient.playerData.selfSpawnIdCounter, 1);
            unknownCreatePak.addByteArray(StringUtils.hexStringToBytes("01010207030000200BF5C2000020C19420B9C300000000000020C100000000070001001201000007037608E00603145200008B0B0024145200008B0B0024882300008B0B00240000000000000000000000000000000064000000640000000010001010000000020000001000000002000000000000000000000000"));
            Store.currentClient.messageQueue.addObjectMessage(unknownCreatePak.returnFinalPacket(), false);
            Store.currentClient.flushQueue();
        }
Пример #4
0
        public byte[] decryptReceivedPacket(byte[] packet)
        {
            byte [] processedPacket;
            byte [] temp;

            ArrayList decValues;

            // Here we check if the first byte is "1" which means that the packet is encrypted or not

            processedPacket = new byte[packet.Length - 1];
            ArrayUtils.copy(packet, 1, processedPacket, 0, packet.Length - 1);
            decValues       = new ArrayList();
            decValues       = cypher.decrypt(packet, packet.Length);
            processedPacket = (byte[])decValues[0];


            if (processedPacket[0] == 0x82)           //It's a timed data packet
            {
                Output.WriteLine("[WORLD] TIMED UDP packet adjusted to normal header");
                temp    = new byte[processedPacket.Length - 4];
                temp[0] = (byte)0x02;
                ArrayUtils.copy(processedPacket, 5, temp, 1, processedPacket.Length - 4);
                processedPacket = temp;
            }



            //clData.setPss((UInt16) decValues[1]);
            playerData.setPss((UInt16)decValues[1]);
            playerData.setCseq((UInt16)decValues[2]);
            playerData.setACK((UInt16)decValues[3]);

            this.deletedAckedPackets((UInt16)decValues[3]); // REMOVING FROM ACK QUEUE
            return(processedPacket);
        }
Пример #5
0
 public byte[] readBytes(int size)
 {
     // Just read amount of bytes
     byte[] newByteArray = new byte[size];
     ArrayUtils.copy(packetData, offset, newByteArray, 0, size);
     offset = offset + size;
     return(newByteArray);
 }
Пример #6
0
 public void processMarketTest(ref byte[] packet)
 {
     byte[] marketCat = new byte[4];
     ArrayUtils.copy(packet, 0, marketCat, 0, 4);
     Console.WriteLine("Open Market Place for Category : " + StringUtils.charBytesToString(marketCat));
     byte[] response         = { 0x0b, 0x81, 0x25, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
     byte[] notEmptyResponse = StringUtils.hexStringToBytes("812a090000000000001800f09a00000000040086d1120080841e00a086010030086e4a"); // Should be the viewData when the marketplace get opened
     Store.currentClient.messageQueue.addRpcMessage(notEmptyResponse);
 }
Пример #7
0
        public void processSetBackgroundRequest(ref byte[] packetData)
        {
            UInt16 backgroundSize = NumericalUtils.ByteArrayToUint16(new byte[] { packetData[3], packetData[4] }, 1);

            byte[] backgroundBytes = new byte[backgroundSize - 1];
            ArrayUtils.copy(packetData, 5, backgroundBytes, 0, backgroundSize - 1);

            string backgroundText = StringUtils.charBytesToString(backgroundBytes);

            Store.dbManager.WorldDbHandler.setBackground(backgroundText);
        }
Пример #8
0
        public string readSizedString()
        {
            string value        = "";
            UInt16 sizeOfString = readUInt16(1);

            byte[] stringBytes = new byte[sizeOfString];

            ArrayUtils.copy(packetData, offset, stringBytes, 0, sizeOfString);
            value  = StringUtils.charBytesToString(stringBytes);
            offset = offset + sizeOfString;
            return(value);
        }
Пример #9
0
        public string readSizedZeroTerminatedString()
        {
            string value        = "";
            UInt16 sizeOfString = readUInt16(1);

            byte[] stringBytes = new byte[sizeOfString - 1];

            ArrayUtils.copy(packetData, offset, stringBytes, 0, sizeOfString - 1); // -1 strips the zero byte
            value  = StringUtils.charBytesToString(stringBytes);
            offset = offset + sizeOfString;                                        // just one for the zero termination
            return(value);
        }
Пример #10
0
 static public byte[] readBytes(ref byte[] data, ref int offset, int bytesNum)
 {
     if (bytesNum > data.Length || (offset + bytesNum > data.Length))
     {
         return(null);                // You cannot read further than the limit
     }
     else
     {
         byte[] readValue = new byte[bytesNum];
         ArrayUtils.copy(data, offset, readValue, 0, bytesNum);
         offset += bytesNum;
         return(readValue);
     }
 }
Пример #11
0
        public int parseAttributes(ref byte[] buffer, int _offset)
        {
            int  offset = _offset;
            byte flag   = 0x00;

            flag = BufferHandler.readByte(ref buffer, ref offset);

            byte[] stateData = new byte[buffer.Length - offset + 2];
            ArrayUtils.copy(buffer, offset - 2, stateData, 0, buffer.Length - offset + 2);
            //Flag Bits{0,0,0,0,Vector3f Position Update,  Yaw Update,Animation Update, AttributesPacked Update?}


            switch (flag)
            {
            case 0x02:
                Action.setValue(BufferHandler.readBytes(ref buffer, ref offset, Action.getSize()));
                break;


            case 0x04:
                YawInterval.setValue(BufferHandler.readBytes(ref buffer, ref offset, YawInterval.getSize()));
                break;


            case 0x08:
                double x = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref offset, 4), 1);
                double y = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref offset, 4), 1);
                double z = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref offset, 4), 1);
                Position.setValue(NumericalUtils.doublesToLtVector3d(x, y, z));
                break;

            case 0x0e:
                // UInt16 unknown + LtVector3f
                UInt16 unknown = NumericalUtils.ByteArrayToUint16(BufferHandler.readBytes(ref buffer, ref offset, 2), 1);
                float  xPos    = NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref offset, 4), 1);
                float  yPos    = NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref offset, 4), 1);
                float  zPos    = NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref offset, 4), 1);
                Position.setValue(NumericalUtils.doublesToLtVector3d((double)xPos, (double)yPos, (double)zPos));
                break;
            }

            // TODO: update player attribute packets someday (announce it to my spawners)
            Store.world.sendViewPacketToAllPlayers(stateData, Store.currentClient.playerData.getCharID(), NumericalUtils.ByteArrayToUint16(Store.currentClient.playerInstance.GetGoid(), 1), Store.currentClient.playerData.getEntityId());
            return(offset);
        }
Пример #12
0
        public void processObjectDynamic(ref byte[] packet)
        {
            PacketReader reader = new PacketReader(packet);

            byte[] objectID = new byte[4];
            byte[] sectorID = new byte[2];
            ArrayUtils.copyTo(packet, 0, objectID, 0, 4);
            ArrayUtils.copyTo(objectID, 2, sectorID, 0, 2);

            UInt32 numericObjectId = NumericalUtils.ByteArrayToUint32(objectID, 1);


            // Ok sector Bytes are something like 30 39 (reversed but the result must be 39 03)
            UInt16 numericSectorId = NumericalUtils.ByteArrayToUint16(sectorID, 1);
            // strip out object id
            string id = StringUtils.bytesToString_NS(objectID);


            // get the type
            byte[] objectType = new byte[1];
            ArrayUtils.copy(packet, 4, objectType, 0, 1);
            int objectTypeID = packet[4];


            // create a new System message but fill it in the switch block
            ServerPackets pak = new ServerPackets();

            #if DEBUG
            pak.sendSystemChatMessage(Store.currentClient, "Object Type ID IS " + objectTypeID.ToString() + " Dynamic Object RPC : " + StringUtils.bytesToString_NS(packet), "BROADCAST");
            #endif

            switch (objectTypeID)
            {
            case (int)objectTypesDynamic.LOOT:
                UInt32[] theTestArrayLoots = new UInt32[2];
                theTestArrayLoots[0] = NumericalUtils.ByteArrayToUint32(StringUtils.hexStringToBytes("8e220000"), 1);
                pak.SendLootWindow(5000, Store.currentClient, theTestArrayLoots);
                break;


            default:
                pak.sendSystemChatMessage(Store.currentClient, "[OI HELPER] Unknown Object Type : " + objectTypeID.ToString() + "| Object ID :" + id, "MODAL");
                break;
            }
        }
Пример #13
0
        private void deleteCharName(byte[] packet, NetworkStream client)
        {
            // Response should something like : 0e 44 87 1f 00 00 00 00 00 00 00 00 00

            // Get the charId from the packet
            byte[] charIDB = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
            ArrayUtils.copy(packet, 5, charIDB, 0, 8); //Offset for charID is 5 in request

            // Need for SQL Delete
            UInt64 charID = NumericalUtils.ByteArrayToUint32(charIDB, 1);

            Store.dbManager.MarginDbHandler.deleteCharacter(charID);

            // Create viewData
            string deleteRequestResponse = "0e" + StringUtils.bytesToString_NS(charIDB) + "0000000000000000";

            sendMarginData(deleteRequestResponse, client);
        }
Пример #14
0
        public void HandleClientComm(object client)
        {
            tcpClient    = (TcpClient)client;
            clientStream = tcpClient.GetStream();

            // Define an auth server processor per thread

            byte[] message = new byte[2048];
            int    bytesRead;

            Output.WriteLine("Margin client Connected.");


            // Receive TCP auth packets from the connected client.
            while (working)
            {
                bytesRead = 0;

                try{
                    bytesRead = clientStream.Read(message, 0, 2048);
                }
                catch { break; }

                if (bytesRead == 0)
                {
                    Output.OptWriteLine("Margin: 0 Bytes received");
                    break;
                }

                // Parse the received packet data
                try{
                    byte[] packet = new byte[bytesRead];
                    ArrayUtils.copy(message, 0, packet, 0, bytesRead);
                    packetHandler(packet, clientStream);
                }catch (MarginException marEx) {
                    Output.WriteLine(marEx);
                    break;
                }
            }
            working = false;
            Output.WriteLine("Margin thread closing");
            tcpClient.Close();
            clientStream.Close();
        }
Пример #15
0
        private void charNameRequest(byte[] packet, NetworkStream client)
        {
            // Get the handle text
            byte[] handleSize = new byte[2];
            handleSize[0] = packet[5];
            handleSize[1] = packet[6];

            int size = (int)NumericalUtils.ByteArrayToUint16(handleSize, 1);

            byte[] handleB = new byte[size - 1];
            ArrayUtils.copy(packet, 7, handleB, 0, size - 1);
            string handleBStr = StringUtils.bytesToString_NS(handleB);             // Handle as "414141"
            string handleStr  = StringUtils.charBytesToString(handleB);            // Handle as "AAA"

            // Process DB to answer the client - we directly create the character
            UInt32 dbResult = Store.dbManager.MarginDbHandler.getNewCharnameID(handleStr, userID);

            // Add the new charId so that we can work with it

            // Create the answer
            string nameRequestResponse = "";

            if (dbResult == 0)
            {
                nameRequestResponse += "0b0f00010000110000000000000000";
                nameRequestResponse += StringUtils.bytesToString_NS(handleSize);
                nameRequestResponse += handleBStr + "00";
            }
            else
            {
                newCharID            = dbResult;
                nameRequestResponse += "0b0f0000000000";
                nameRequestResponse += StringUtils.bytesToString_NS(NumericalUtils.uint32ToByteArray((UInt32)dbResult, 1));
                nameRequestResponse += "0000000000";
                nameRequestResponse += StringUtils.bytesToString_NS(handleSize);
                nameRequestResponse += handleBStr + "00";
            }

            Output.writeToLogForConsole(nameRequestResponse);
            sendMarginData(nameRequestResponse, client);
        }
Пример #16
0
        public byte[] getBytesWithHeader(bool timedRPC)
        {
            DynamicArray rpcStructure = new DynamicArray();

            byte[] noTimedHeader = { 0x04 };
            byte[] timedHeader   = new byte[6];
            byte[] time          = TimeUtils.getUnixTime();

            timedHeader[0] = 0x82;

            ArrayUtils.copy(time, 0, timedHeader, 1, 4);
            timedHeader[5] = 0x04;             // This makes it "82aabbccdd04"

            if (timedRPC)
            {
                rpcStructure.append(timedHeader);
            }
            else
            {
                rpcStructure.append(noTimedHeader);
            }

            // Calculate blocks number


            if (rpcInside == 0)            // Is just 1 group of msgblocks
            {
                rpcInside = 1;
                rpcStructure.append(NumericalUtils.uint16ToByteArrayShort((UInt16)rpcInside));
                rpcStructure.append(getBytes());                 //Append our own content
            }
            else
            {
                rpcStructure.append(NumericalUtils.uint16ToByteArrayShort((UInt16)rpcInside));
                rpcStructure.append(din.getBytes());                 //Append our own content
            }


            return(rpcStructure.getBytes());
        }
Пример #17
0
        public byte[] decryptMargin(byte[] packet)
        {
            ArrayUtils.copy(packet, 1, IV, 0, 16);

            int decryptBuffer = packet.Length - 17;

            byte[] packetToDecrypt = new byte[decryptBuffer];

            ArrayUtils.copy(packet, 17, packetToDecrypt, 0, packet.Length - 17);

            tf.setIV(IV);
            tf.setKey(TF_Key);

            byte[] decryptedBytes = new byte[packetToDecrypt.Length];
            tf.decrypt(packetToDecrypt, decryptedBytes);

            byte[] decryptedPacket = new byte[decryptedBytes.Length - 10];

            ArrayUtils.copy(decryptedBytes, 10, decryptedPacket, 0, decryptedBytes.Length - 10);

            return(decryptedPacket);
        }
Пример #18
0
        // Return all the values in an ArrayList, not just the decrypted packet
        public ArrayList decrypt(byte[] encryptedData, int length)
        {
            ArrayList response = new ArrayList();

            UInt16 pss  = 0;
            UInt16 cseq = 0;
            UInt16 sseq = 0;

            int decryptedSize = EnigmaLib.worldDecrypt(encryptedData, innerBuffer, length, ref pss, ref cseq, ref sseq);

            /*
             * If decrypted size is -1337 then it was a CRC in packet <> CRC of packet Exception
             * */

            if (decryptedSize == -1337)
            {
                Output.WriteLine("Oh oh, CRC didnt matched in this packet");
            }

            // This hexsize throws exceptions ...so we will use the decryptedSize - 10 (same value)
            byte[] hexSize = new byte[2];
            hexSize [0] = innerBuffer[4];
            hexSize [1] = innerBuffer[5];
            UInt16 size = NumericalUtils.ByteArrayToUint16(hexSize, 1);

            size -= 4;           // remove the 4 seq data bytes from size

            byte[] data = new byte[size];
            ArrayUtils.copy(innerBuffer, 14, data, 0, decryptedSize - 10);       // Should do a fast copy method for this, if not done already
            response.Add(data);
            response.Add(pss);
            response.Add(cseq);
            response.Add(sseq);

            return(response);
        }
Пример #19
0
        public byte[] decryptMargin(byte[] packet)
        {
            if (packet.Length < 17)
            {
                // This happens - but shouldnt happen.
                return(null);
            }
            ArrayUtils.copy(packet, 1, IV, 0, 16);

            int decryptBuffer = packet.Length - 17;

            byte[] packetToDecrypt = new byte[decryptBuffer];

            ArrayUtils.copy(packet, 17, packetToDecrypt, 0, packet.Length - 17);

            tf.setIV(IV);
            tf.setKey(TF_Key);

            byte[] decryptedBytes = new byte[packetToDecrypt.Length];
            tf.decrypt(packetToDecrypt, decryptedBytes);

            byte[] decryptedPacket;
            if (decryptedBytes.Length > 10)
            {
                decryptedPacket = new byte[decryptedBytes.Length - 10];
            }
            else
            {
                decryptedPacket = new byte[decryptedBytes.Length];
            }


            ArrayUtils.copy(decryptedBytes, 10, decryptedPacket, 0, decryptedBytes.Length - 10);

            return(decryptedPacket);
        }
Пример #20
0
        public int parseAttributes(ref byte[] buffer, int _offset)
        {
            _offset++;
            byte flag = 0x00;

            flag = BufferHandler.readByte(ref buffer, ref _offset);

            byte[] stateData = new byte[buffer.Length - _offset + 2];
            ArrayUtils.copy(buffer, _offset - 2, stateData, 0, buffer.Length - _offset + 2);
            //Flag Bits{0,0,0,0,Vector3f Position Update,  Yaw Update,Animation Update, AttributesPacked Update?}

            double x = 0;
            double y = 0;
            double z = 0;

            switch (flag)
            {
            case 0x02:
                Action.setValue(BufferHandler.readBytes(ref buffer, ref _offset, Action.getSize()));
                break;


            case 0x04:
                YawInterval.setValue(BufferHandler.readBytes(ref buffer, ref _offset, YawInterval.getSize()));
                break;


            case 0x08:
                x = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                y = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                z = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                Position.setValue(NumericalUtils.doublesToLtVector3d(x, y, z));
                break;

            case 0x0a:
                YawInterval.setValue(BufferHandler.readByte(ref buffer, ref _offset));
                x = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                y = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                z = (double)NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                Position.setValue(NumericalUtils.doublesToLtVector3d(x, y, z));
                break;

            case 0x0e:
                // UInt16 unknown + LtVector3f
                UInt16 unknown = NumericalUtils.ByteArrayToUint16(BufferHandler.readBytes(ref buffer, ref _offset, 2), 1);
                x = NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                y = NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                z = NumericalUtils.byteArrayToFloat(BufferHandler.readBytes(ref buffer, ref _offset, 4), 1);
                Position.setValue(NumericalUtils.doublesToLtVector3d(x, y, z));
                break;

            default:
                // ToDo: we need a proper way to proove if there is a 00 00 04 somewhere (and if set the offset to it)

                // If this doesnt match we need to write this somewhere...
                string message = "RPCMAIN : Unknown Client 03 Request Packet \r\n" +
                                 "Flag: " + flag + "\r\n " +
                                 "Content: \n" +
                                 StringUtils.bytesToString(stateData) + "\r\n";
                Output.WriteClientViewRequestLog(message);

                // ...and we dont want to crash so we just say "offset is full packet"
                _offset = buffer.Length - 1;
                break;
            }

            // TODO: update player attribute packets someday (announce it to my spawners)
            Store.world.sendViewPacketToAllPlayers(stateData, Store.currentClient.playerData.getCharID(), NumericalUtils.ByteArrayToUint16(Store.currentClient.playerInstance.GetGoid(), 1), Store.currentClient.playerData.getEntityId());
            return(_offset);
        }
Пример #21
0
        private void loadCharacter(byte[] packet, NetworkStream client, UInt32 theCharId)
        {
            byte[] charIDB = new byte[4];

            if (theCharId == 0)
            {
                ArrayUtils.copy(packet, 3, charIDB, 0, 4); //Offset for charID is 3 in request
                uint charId = (uint)NumericalUtils.ByteArrayToUint32(charIDB, 1);
                // Remove current instances for this character
                if (Store.margin.isAnotherClientActive(charId) == true)
                {
                    CharacterAlreadyInUseReply(client);
                    return;
                }
                this.newCharID = charId;
            }


            charIDB = NumericalUtils.uint32ToByteArray(this.newCharID, 1);

            //New harcoded sessionID is: ac 53 02 00
            //Old is: 28 A9 02 00
            string [] marginValues = new string[0x0e];
            marginValues[8]   = "000b10001e000700000001000800000000000a00000003000d00000000001c0000000100";
            marginValues[0xc] = "000e10000000";
            marginValues[0xd] = "010f10000000";

            // Some Items
            string itemData = "0170A7000000000010" + "020B8F00000000001803B80200000000001804EE9900000000000005F399000000000000065F0900000000100007C80900000000000008D59D000000000C0009EA040000000000480AD61E0000000000380BF21800000000001C0C66900000000000140DB30400000000001C0E04A80000000018000F3743000000000028108D2200000000002411441A00000000004415808C00000000004462EB0300000000001C63CC5A00000000004464ECB2000000000048651CB3000000000038663E9500000000006868EA0400000000001C";

            byte[] inventory = StringUtils.hexStringToBytes(itemData);

            // Loaded Abilities
            string loadedAbs = "000032080080070000E400800B0000E002800C00006403800E0000340180110032B400801600322C0080290032D404802B0000DC04802F00322800803000323000803E0001E404804200322005805D0000E800805E0032D000805F00327C01806B00008801806F00001C0580990001280580A40000A40080A60000AC0080AC0000EC0080B00000000180B10000040180B80032240180BB0032300180BC00004C0180C50000A00080D80001EC0480DD00012C0580EA0001E80480F400013005800D01013405801D0101680780200132740580280100E004802C01013805803601018C05803801017805803A01325C0780490100840180520100D8088056010124";

            byte[] loadAbilitys = StringUtils.hexStringToBytes(loadedAbs);

            // Known Abilities
            string abilityData = "0000320800800100014800800200017C0080030000080280040000140380050001300480060001B40080070000E4008008000018038009000F9400800A0000E002800B0000E002800C00006403800D00009000800E00003401800F00018C00801000006C0080110032B40080120000E402801300001003801400016400801500322004801600322C0080170001AC09801800012C008019000F9400801A0032C401801B00010800801C00018400801D0000F803801E001A3802801F00010400802000006C0280210001240580220032B40980230032640680240001680080250087DF11842600000400802700001C0080280032540480290032D404802A003210";

            byte[] knownAbilitiys = StringUtils.hexStringToBytes(abilityData);


            // Known Hardlines
            //string hardlineData = "0207000000021f000000022300000002240000000225000000022600000002270000000229000000022b000000022f00000002300000000231000000023200000002340000000235000000023600000002370000000238000000023b000000023f000000024000000002410000000243000000024500000002480000000249000000024a000000024b000000024d000000024e000000024f000000025000000002510000000252000000025400000002550000000256000000025700000002580000000259000000025a000000025b000000025c000000025d000000025e000000025f000000026000000002610000000262000000026300000002640000000265000000026600000002670000000269000000026a000000026b000000026c000000026d000000026e000000026f000000027000000002710000000130000000013100000001370000000141000000014500000001480000000149000000014a000000014b000000014c000000014e000000014f0000000150000000015100000001520000000163000000016400000001650000000166000000016700000001680000000169000000016a000000016b000000016d000000016f00000001700000000171000000017200000001730000000174000000017700000001780000000179000000017a000000017b000000017c000000017d000000017e000000017f000000018000000001810000000182000000018300000001840000000185000000018600000001870000000188000000018a000000018b000000018c000000018d000000018e000000019000000001910000000192000000019300000001940000000195000000019600000001970000000198000000019900000003020000000303000000030400000003050000000306000000030700000003080000000309000000030a000000030b000000030c000000030d000000030e000000030f000000031000000003110000000312000000031300000003140000000315000000031600000003170000000318000000";
            //string hardlineData = Store.dbManager.MarginDbHandler.loadAllHardlines();
            string hardlineData = "0130000000013100000001370000000141000000014500000001480000000149000000014A000000014B000000014C000000014E000000014F00000001500000000151000000015200000001530000000163000000016400000001650000000166000000016700000001680000000169000000016A000000016B000000016D000000016F00000001700000000171000000017200000001730000000174000000017700000001780000000179000000017A000000017B000000017C000000017D000000017E000000017F000000018000000001810000000182000000018300000001840000000185000000018600000001870000000188000000018A000000018B000000018C000000018D000000018E000000018F00000001900000000191000000019200000001930000000194000000019500000001960000000197000000019800000001990000000207000000021F000000022300000002240000000225000000022600000002270000000229000000022B000000022F00000002300000000231000000023200000002340000000235000000023600000002370000000238000000023B000000023F000000024000000002410000000243000000024500000002480000000249000000024A000000024B000000024D000000024E000000024F000000025000000002510000000252000000025400000002550000000256000000025700000002580000000259000000025A000000025B000000025C000000025D000000025E000000025F000000026000000002610000000262000000026300000002640000000265000000026600000002670000000269000000026A000000026B000000026C000000026D000000026E000000026F0000000270000000027100000003020000000303000000030400000003050000000306000000030700000003080000000309000000030A000000030B000000030C000000030D000000030E000000030F00000003100000000311000000031200000003130000000314000000031500000003160000000317000000031800000011010000000E010000000F0100000010020000000C010000000D01000000";

            byte[] knownHardlines = StringUtils.hexStringToBytes(hardlineData);


            // Contacts
            string missionContacts = "0700000001000800000000000a00000003000d00000000001c0000000100";

            byte[] knownContacts = StringUtils.hexStringToBytes(missionContacts);

            byte[] codeArchiveTest = StringUtils.hexStringToBytes("04000000A7010000AC010000CC010000D1010000D60100001302000019020000650200006602000068020000B4020000B5020000B6020000BB020000BC020000C2020000C4020000D5020000D6020000DE020000E2020000E3020000E6020000E7020000E90200003F03000086030000A0030000AA030000E3030000FC030000FE030000030400000604000008040000090400000A040000270400004C0400004E040000BB040000C2040000CE040000EB040000EC040000EE040000F5040000F6040000F7040000F9040000540900005F09000082090000BE090000BF090000C1090000C4090000C7090000C8090000C9090000040A0000080A0000B0120000");

            byte[] empty = new byte[0];

            // New Margin Method to send Data

            // Pre-Load Abilities so that we just need to filter the result later
            loadAbilities((int)this.newCharID);

            sendMarginCharData(empty, 0x01, client, 0, false);
            sendMarginCharData(loadBackgroundInfo((int)this.newCharID), 0x02, client, 0, false);
            sendMarginCharData(empty, 0x03, client, 0, false);                              // BuddyList (but old one)
            sendMarginCharData(empty, 0x04, client, 0, false);                              // Unknown - no one has data there so ignore it
            sendMarginCharData(loadInventory((int)this.newCharID), 0x05, client, 0, false); // Inventory
            //sendMarginCharData(StringUtils.hexStringToBytes(itemData), 0x05, client);            // Inventory CR1
            sendMarginCharData(loadEquippedAbilities(), 0x06, client, 0, false);            // Loaded Abilitys
            //sendMarginCharData(empty, 0x06, client);                          // Loaded Abilitys CR1
            sendMarginCharData(loadKnownAbilities(), 0x07, client, 0, false);               // Known Abilities
            sendMarginCharData(knownHardlines, 0x08, client, 0, false);                     // Hardlines
            sendMarginCharData(empty, 0x09, client, 0, false);                              // Access Nodes?
            //sendMarginCharData(codeArchiveTest, 0x0a, client);                // Code Storage
            sendMarginCharData(empty, 0x0a, client, 0, false);                              // Code Storage CR1
            sendMarginCharData(knownContacts, 0x0b, client, 0, false);                      // Contacts
            sendMarginCharData(empty, 0x0e, client, 0, false);

            // MotD has a special handling
            DbParams _dbParams;

            XmlParser.loadDBParams("Config.xml", out _dbParams);
            string motd = _dbParams.Motd;

            if (!motd.Equals(""))              // if MOTD not empty
            {
                DynamicArray announcement = new DynamicArray();
                byte[]       currentTime  = TimeUtils.getUnixTime();
                //Load motd from file
                byte[] text = StringUtils.stringToBytes(motd);
                byte[] size = NumericalUtils.uint16ToByteArrayShort((UInt16)(currentTime.Length + text.Length));

                //announcement.append(size);
                announcement.append(currentTime);
                announcement.append(text);

                sendMarginCharData(announcement.getBytes(), 0x0d, client, 10000, true);
            }
            /* End of the MOTD */
        }
Пример #22
0
        private void createCharacterRSI(byte[] packet, NetworkStream client)
        {
            // Instance the Data Loader
            DataLoader itemLoader = DataLoader.getInstance();

            isNewCreatedChar = true;
            string debugHexPacket = StringUtils.bytesToString_NS(packet);

            // ToDo: Replace all with Packet Reader Instance
            PacketReader reader = new PacketReader(packet);

            reader.incrementOffsetByValue(3);


            UInt16 body   = 0;
            UInt16 gender = 0;


            UInt16 skintone = reader.readUInt16(1);

            reader.setOffsetOverrideValue(7);
            UInt16 bodyTypeId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(15);
            UInt16 hairId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(19);
            UInt16 haircolor = reader.readUInt16(1);

            reader.setOffsetOverrideValue(23);
            UInt16 tattoo = reader.readUInt16(1);

            reader.setOffsetOverrideValue(27);
            UInt16 headId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(31);
            UInt16 facialDetail = reader.readUInt16(1);

            reader.setOffsetOverrideValue(35);
            // ToDo: it has a bug - figure out correct position
            UInt16 facialDetailColor = reader.readUInt16(1);

            // ToDo: Remove this when facialDetailColor is parsed properly
            facialDetailColor = 0;
            reader.setOffsetOverrideValue(67);
            UInt16 profession = reader.readUInt16(1);


            // lets read the values
            // the IDs for the Appeareance is always uint16 goID
            // Extra Hint: there are no leggins in Char Creation Process
            reader.setOffsetOverrideValue(35);
            UInt16 hatId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(39);
            UInt16 eyewearId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(43);
            UInt16 shirtId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(47);
            UInt16 glovesId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(51);
            UInt16 outerwearId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(55);
            UInt16 pantsId = reader.readUInt16(1);

            reader.setOffsetOverrideValue(63);
            UInt16 footwearId = reader.readUInt16(1);


            // Get Values by "NewRSI" IDs
            NewRSIItem hairItem = itemLoader.getNewRSIItemByTypeAndID("HAIR", hairId);
            NewRSIItem bodyItem = itemLoader.getNewRSIItemByTypeAndID("BODY", (ushort)bodyTypeId);
            NewRSIItem headItem = itemLoader.getNewRSIItemByTypeAndID("HEAD", headId);

            Store.dbManager.MarginDbHandler.updateRSIValue("body", bodyItem.internalId.ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("sex", bodyItem.gender.ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("face", headItem.internalId.ToString(), newCharID);              // ToDo:
            Store.dbManager.MarginDbHandler.updateRSIValue("hair", hairItem.internalId.ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("haircolor", haircolor.ToString(), newCharID);                   // ToDo: check if it is correct
            Store.dbManager.MarginDbHandler.updateRSIValue("tattoo", tattoo.ToString(), newCharID);                         // ToDo:
            Store.dbManager.MarginDbHandler.updateRSIValue("facialdetail", facialDetail.ToString(), newCharID);             // ToDo:
            Store.dbManager.MarginDbHandler.updateRSIValue("facialdetailcolor", facialDetailColor.ToString(), newCharID);   // ToDo:
            Store.dbManager.MarginDbHandler.updateRSIValue("skintone", skintone.ToString(), newCharID);


            // Clothing Items
            ClothingItem shirt     = itemLoader.getItemValues(shirtId);
            ClothingItem pants     = itemLoader.getItemValues(pantsId);
            ClothingItem outerwear = itemLoader.getItemValues(outerwearId);
            ClothingItem hat       = itemLoader.getItemValues(hatId);
            ClothingItem eyewear   = itemLoader.getItemValues(eyewearId);
            ClothingItem footwear  = itemLoader.getItemValues(footwearId);
            ClothingItem gloves    = itemLoader.getItemValues(glovesId);

            Store.dbManager.MarginDbHandler.updateRSIValue("hat", hat.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shirt", shirt.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shirtcolor", shirt.getColorId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("coat", outerwear.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("coatcolor", outerwear.getColorId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("pants", pants.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("pantscolor", pants.getColorId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shoes", footwear.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shoecolor", footwear.getColorId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("glasses", eyewear.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("glassescolor", eyewear.getColorId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("gloves", gloves.getModelId().ToString(), newCharID);

            Store.dbManager.MarginDbHandler.AddItemToSlot(hatId, 0x61, newCharID);
            Store.dbManager.MarginDbHandler.AddItemToSlot(eyewearId, 0x62, newCharID);
            Store.dbManager.MarginDbHandler.AddItemToSlot(shirtId, 0x63, newCharID);
            Store.dbManager.MarginDbHandler.AddItemToSlot(glovesId, 0x64, newCharID);
            Store.dbManager.MarginDbHandler.AddItemToSlot(outerwearId, 0x65, newCharID);
            Store.dbManager.MarginDbHandler.AddItemToSlot(pantsId, 0x66, newCharID);
            Store.dbManager.MarginDbHandler.AddItemToSlot(footwearId, 0x68, newCharID);


            // FirstName
            UInt16 currentOffset = 79;

            byte[] firstNameLenBytes = new byte[2];
            ArrayUtils.copy(packet, currentOffset, firstNameLenBytes, 0, 2);
            UInt16 firstNameLen = NumericalUtils.ByteArrayToUint16(firstNameLenBytes, 1);

            currentOffset += 2;

            byte[] firstNameBytes = new byte[NumericalUtils.ByteArrayToUint16(firstNameLenBytes, 1) - 1];
            ArrayUtils.copy(packet, currentOffset, firstNameBytes, 0, firstNameLen - 1);
            string firstNameString = StringUtils.charBytesToString(firstNameBytes);

            currentOffset += firstNameLen;

            // LastName
            byte[] lastNameLenBytes = new byte[2];
            ArrayUtils.copy(packet, currentOffset, lastNameLenBytes, 0, 2);
            UInt16 lastNameLen = NumericalUtils.ByteArrayToUint16(lastNameLenBytes, 1);

            currentOffset += 2;

            byte[] lastNameBytes = new byte[NumericalUtils.ByteArrayToUint16(lastNameLenBytes, 1) - 1];
            ArrayUtils.copy(packet, currentOffset, lastNameBytes, 0, lastNameLen - 1);
            string lastNameString = StringUtils.charBytesToString(lastNameBytes);

            currentOffset += lastNameLen;

            // Description
            byte[] descriptionLenBytes = new byte[2];
            ArrayUtils.copy(packet, currentOffset, descriptionLenBytes, 0, 2);
            UInt16 descriptionLen = NumericalUtils.ByteArrayToUint16(descriptionLenBytes, 1);

            currentOffset += 2;

            byte[] descriptionBytes = new byte[NumericalUtils.ByteArrayToUint16(descriptionLenBytes, 1) - 1];
            ArrayUtils.copy(packet, currentOffset, descriptionBytes, 0, descriptionLen - 1);
            string descriptionString = StringUtils.charBytesToString(descriptionBytes);

            currentOffset += lastNameLen;

            // Update Characters values
            Store.dbManager.MarginDbHandler.updateCharacter(firstNameString, lastNameString, descriptionString, newCharID);

            // Add the Basic Abilitys...
            addStartAbilitys(newCharID);

            // we have all created - lets load the charData
            loadCharacter(packet, client, this.newCharID);
        }
Пример #23
0
        public void packetHandler(byte[] packet, NetworkStream client)
        {
            bool encrypted = true;
            byte opcode    = packet[2];

            byte[] data    = { };
            byte   pointer = packet[0];

            if (opcode == 0x01)
            {
                // Packet is unencrypted
                encrypted = false;
                data      = packet;
            }

            // This overrides the above IF for packets where 3rd position is a "01"
            // Happened someday, and screwed login... yeah, really
            if (pointer != 0x81)
            {
                encrypted = true;
            }

            if (encrypted == true)
            {
                byte[] encryptedPacket = { };
                if (packet[0] >= 0x80)
                {
                    // try to readjust the packet for one byte less if the lenght is too long
                    // just a crappy way
                    encryptedPacket = new byte[packet.Length - 1];
                    ArrayUtils.copy(packet, 1, encryptedPacket, 0, packet.Length - 1);
                }
                else
                {
                    encryptedPacket = packet;
                }
                // Get the IV from encrypted Packet and set it in encryptor/decryptor
                byte[] decrypted = marginEncr.decryptMargin(encryptedPacket);
                // Just 2 zero bytes for opcode handling later (As we use third byte for both state, encrypted or not
                byte[] spacer = { 0x00, 0x00 };

                DynamicArray din = new DynamicArray();
                din.append(spacer);
                din.append(decrypted);

                data = din.getBytes();
            }
            else
            {
                data = packet;
            }
            Output.WritePacketLog(StringUtils.bytesToString(data), "MARGINCLIENT", "0", "0", "0");
            opcode = data[2];

            //TODO: check if this needs "packet" or "data"
            switch (opcode)
            {
            case 0x01:
                certConnectRequest(packet, client);

                break;

            case 0x03:
                certConnectReply(packet, client);

                break;

            case 0x06:
                connectChallenge(packet, client);

                break;

            case 0x08:
                ConnectChallengeResponse(packet, client);
                break;

            case 0x0a:
                //CharNameRequest
                charNameRequest(data, client);
                break;

            case 0x0c:
                //TODO: this is creation. must be done someday
                Output.writeToLogForConsole("CREATECHAR RSI VALUES:" + StringUtils.bytesToString(data));
                //loadCharacter(data, client);
                createCharacterRSI(data, client);
                // Add the first abilitys
                // AbilityID : 2147485696 (Awakened) Level 2
                // AbilityID :

                break;

            case 0x0d:
                // Delete Charname Request
                deleteCharName(data, client);
                break;

            case 0x0f:
                loadCharacter(data, client, 0);
                break;
            }
        }
Пример #24
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);
        }
Пример #25
0
        private void createCharacterRSI(byte[] packet, NetworkStream client)
        {
            // Instance the Data Loader
            DataLoader ItemLoader = DataLoader.getInstance();

            isNewCreatedChar = true;

            string debugHexPacket = StringUtils.bytesToString_NS(packet);

            // lets read the values
            // the IDs for the Appeareance is always uint16 goID
            byte[] bodyTypeIDByte         = new byte[4];
            byte[] professionByte         = new byte[4];
            byte[] facialdetailBytes      = new byte[4];
            byte[] facialdetailColorBytes = new byte[4];
            byte[] hairBytes      = new byte[4];
            byte[] hairColorBytes = new byte[4];
            byte[] skintoneBytes  = new byte[4];
            byte[] tatooBytes     = new byte[4];
            byte[] headIDBytes    = new byte[4];

            // Clothing
            byte[] shirtIDBytes     = new byte[4];
            byte[] pantsIDBytes     = new byte[4];
            byte[] outerwearIDBytes = new byte[4];
            byte[] hatIDBytes       = new byte[4];
            byte[] eyewearIDBytes   = new byte[4];
            byte[] footwearIDBytes  = new byte[4];
            byte[] glovesIDBytes    = new byte[4];
            //byte[] legginsIDBytes           = new byte[4];

            // RSI
            ArrayUtils.copy(packet, 3, skintoneBytes, 0, 2);        // Done!
            ArrayUtils.copy(packet, 7, bodyTypeIDByte, 0, 2);       // Done!
            ArrayUtils.copy(packet, 15, hairBytes, 0, 2);           // Done!
            ArrayUtils.copy(packet, 19, hairColorBytes, 0, 2);      // Done!
            ArrayUtils.copy(packet, 23, tatooBytes, 0, 2);          // Done!
            ArrayUtils.copy(packet, 27, headIDBytes, 0, 2);
            ArrayUtils.copy(packet, 31, facialdetailBytes, 0, 2);
            ArrayUtils.copy(packet, 35, facialdetailColorBytes, 0, 2);
            ArrayUtils.copy(packet, 67, professionByte, 0, 2);

            UInt16 body       = 0;
            UInt16 gender     = 0;
            UInt32 bodyTypeId = NumericalUtils.ByteArrayToUint32(bodyTypeIDByte, 1);

            UInt16 hairId            = NumericalUtils.ByteArrayToUint16(hairBytes, 1);
            UInt16 haircolor         = NumericalUtils.ByteArrayToUint16(hairColorBytes, 1);
            UInt16 tattoo            = NumericalUtils.ByteArrayToUint16(tatooBytes, 1);
            UInt16 facialDetailColor = NumericalUtils.ByteArrayToUint16(facialdetailColorBytes, 1);
            UInt16 skintone          = NumericalUtils.ByteArrayToUint16(skintoneBytes, 1);
            UInt16 headID            = NumericalUtils.ByteArrayToUint16(headIDBytes, 1);

            // Get Values by "NewRSI" IDs
            NewRSIItem hairItem = ItemLoader.getNewRSIItemByTypeAndID("HAIR", hairId);
            NewRSIItem bodyItem = ItemLoader.getNewRSIItemByTypeAndID("BODY", (ushort)bodyTypeId);
            NewRSIItem headItem = ItemLoader.getNewRSIItemByTypeAndID("HEAD", headID);

            Store.dbManager.MarginDbHandler.updateRSIValue("body", bodyItem.internalId.ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("sex", bodyItem.gender.ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("face", headItem.internalId.ToString(), newCharID);              // ToDo:
            Store.dbManager.MarginDbHandler.updateRSIValue("hair", hairItem.internalId.ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("haircolor", haircolor.ToString(), newCharID);                   // ToDo: check if it is correct
            Store.dbManager.MarginDbHandler.updateRSIValue("tattoo", tattoo.ToString(), newCharID);                         // ToDo:
            Store.dbManager.MarginDbHandler.updateRSIValue("facialdetailcolor", facialDetailColor.ToString(), newCharID);   // ToDo:
            Store.dbManager.MarginDbHandler.updateRSIValue("skintone", skintone.ToString(), newCharID);
            // Clothing Items
            // ToDo: GLOVES ARE MISSING!
            ArrayUtils.copy(packet, 43, shirtIDBytes, 0, 2);
            ArrayUtils.copy(packet, 47, glovesIDBytes, 0, 2);
            ArrayUtils.copy(packet, 55, pantsIDBytes, 0, 2);
            ArrayUtils.copy(packet, 51, outerwearIDBytes, 0, 2);
            ArrayUtils.copy(packet, 34, hatIDBytes, 0, 2);
            ArrayUtils.copy(packet, 39, eyewearIDBytes, 0, 2);
            ArrayUtils.copy(packet, 63, footwearIDBytes, 0, 2);

            ClothingItem shirt     = ItemLoader.getItemValues(NumericalUtils.ByteArrayToUint16(shirtIDBytes, 1));
            ClothingItem pants     = ItemLoader.getItemValues(NumericalUtils.ByteArrayToUint16(pantsIDBytes, 1));
            ClothingItem outerwear = ItemLoader.getItemValues(NumericalUtils.ByteArrayToUint16(outerwearIDBytes, 1));
            ClothingItem hat       = ItemLoader.getItemValues(NumericalUtils.ByteArrayToUint16(hatIDBytes, 1));
            ClothingItem eyewear   = ItemLoader.getItemValues(NumericalUtils.ByteArrayToUint16(eyewearIDBytes, 1));
            ClothingItem footwear  = ItemLoader.getItemValues(NumericalUtils.ByteArrayToUint16(footwearIDBytes, 1));
            ClothingItem gloves    = ItemLoader.getItemValues(NumericalUtils.ByteArrayToUint16(glovesIDBytes, 1));


            Store.dbManager.MarginDbHandler.updateRSIValue("hat", hat.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shirt", shirt.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shirtcolor", shirt.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("coat", outerwear.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("coatcolor", outerwear.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("pants", pants.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("pantscolor", pants.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shoes", pants.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("shoecolor", pants.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("glasses", pants.getModelId().ToString(), newCharID);
            Store.dbManager.MarginDbHandler.updateRSIValue("glassescolor", pants.getModelId().ToString(), newCharID);

            // ToDO: Figre out the ITem Slots for "currentlyWearing" Items and add the ITems correctly to the Inventory

            // FirstName
            UInt16 currentOffset = 79;

            byte[] firstNameLenBytes = new byte[2];
            ArrayUtils.copy(packet, currentOffset, firstNameLenBytes, 0, 2);
            UInt16 firstNameLen = NumericalUtils.ByteArrayToUint16(firstNameLenBytes, 1);

            currentOffset += 2;

            byte[] firstNameBytes = new byte[NumericalUtils.ByteArrayToUint16(firstNameLenBytes, 1) - 1];
            ArrayUtils.copy(packet, currentOffset, firstNameBytes, 0, firstNameLen - 1);
            string firstNameString = StringUtils.charBytesToString(firstNameBytes);

            currentOffset += firstNameLen;

            // LastName
            byte[] lastNameLenBytes = new byte[2];
            ArrayUtils.copy(packet, currentOffset, lastNameLenBytes, 0, 2);
            UInt16 lastNameLen = NumericalUtils.ByteArrayToUint16(lastNameLenBytes, 1);

            currentOffset += 2;

            byte[] lastNameBytes = new byte[NumericalUtils.ByteArrayToUint16(lastNameLenBytes, 1) - 1];
            ArrayUtils.copy(packet, currentOffset, lastNameBytes, 0, lastNameLen - 1);
            string lastNameString = StringUtils.charBytesToString(lastNameBytes);

            currentOffset += lastNameLen;

            // Description
            byte[] descriptionLenBytes = new byte[2];
            ArrayUtils.copy(packet, currentOffset, descriptionLenBytes, 0, 2);
            UInt16 descriptionLen = NumericalUtils.ByteArrayToUint16(descriptionLenBytes, 1);

            currentOffset += 2;

            byte[] descriptionBytes = new byte[NumericalUtils.ByteArrayToUint16(descriptionLenBytes, 1) - 1];
            ArrayUtils.copy(packet, currentOffset, descriptionBytes, 0, descriptionLen - 1);
            string descriptionString = StringUtils.charBytesToString(descriptionBytes);

            currentOffset += lastNameLen;

            // Update Characters values
            Store.dbManager.MarginDbHandler.updateCharacter(firstNameString, lastNameString, descriptionString, newCharID);

            // Add the Basic Abilitys...
            Store.dbManager.MarginDbHandler.addAbility(-2147481600, 0, newCharID, 1, 1);
            Store.dbManager.MarginDbHandler.addAbility(-2147367936, 1, newCharID, 1, 1);
            Store.dbManager.MarginDbHandler.addAbility(-2147294208, 2, newCharID, 0, 1);
            Store.dbManager.MarginDbHandler.addAbility(-2147281920, 3, newCharID, 0, 0);
            Store.dbManager.MarginDbHandler.addAbility(-2147280896, 4, newCharID, 0, 0);
            Store.dbManager.MarginDbHandler.addAbility(-2147437568, 5, newCharID, 1, 1);
            Store.dbManager.MarginDbHandler.addAbility(-2147425280, 6, newCharID, 0, 0);
            Store.dbManager.MarginDbHandler.addAbility(-2147404800, 7, newCharID, 0, 0);
            Store.dbManager.MarginDbHandler.addAbility(-2147445760, 8, newCharID, 0, 0);
            Store.dbManager.MarginDbHandler.addAbility(-2146493440, 9, newCharID, 0, 0);
            Store.dbManager.MarginDbHandler.addAbility(-2146453504, 10, newCharID, 1, 0);

            // we have all created - lets load the charData
            loadCharacter(packet, client, this.newCharID);
        }
Пример #26
0
        private void loadCharacter(byte[] packet, NetworkStream client, UInt32 theCharId)
        {
            byte[] charIDB = new byte[4];

            if (theCharId == 0)
            {
                ArrayUtils.copy(packet, 3, charIDB, 0, 4); //Offset for charID is 3 in request
                uint charId = (uint)NumericalUtils.ByteArrayToUint32(charIDB, 1);
                // Remove current instances for this character
                if (Store.margin.isAnotherClientActive(charId) == true)
                {
                    CharacterAlreadyInUseReply(client);
                    return;
                }
                this.newCharID = charId;
            }


            charIDB = NumericalUtils.uint32ToByteArray(this.newCharID, 1);

            //New harcoded sessionID is: ac 53 02 00
            //Old is: 28 A9 02 00
            string [] marginValues = new string[0x0e];
            marginValues[8]   = "000b10001e000700000001000800000000000a00000003000d00000000001c0000000100";
            marginValues[0xc] = "000e10000000";
            marginValues[0xd] = "010f10000000";

            // Some Items
            string itemData = "0170A7000000000010" + "020B8F00000000001803B80200000000001804EE9900000000000005F399000000000000065F0900000000100007C80900000000000008D59D000000000C0009EA040000000000480AD61E0000000000380BF21800000000001C0C66900000000000140DB30400000000001C0E04A80000000018000F3743000000000028108D2200000000002411441A00000000004415808C00000000004462EB0300000000001C63CC5A00000000004464ECB2000000000048651CB3000000000038663E9500000000006868EA0400000000001C";

            byte[] inventory = StringUtils.hexStringToBytes(itemData);

            // Loaded Abilities
            string loadedAbs = "000032080080070000E400800B0000E002800C00006403800E0000340180110032B400801600322C0080290032D404802B0000DC04802F00322800803000323000803E0001E404804200322005805D0000E800805E0032D000805F00327C01806B00008801806F00001C0580990001280580A40000A40080A60000AC0080AC0000EC0080B00000000180B10000040180B80032240180BB0032300180BC00004C0180C50000A00080D80001EC0480DD00012C0580EA0001E80480F400013005800D01013405801D0101680780200132740580280100E004802C01013805803601018C05803801017805803A01325C0780490100840180520100D8088056010124";

            byte[] loadAbilitys = StringUtils.hexStringToBytes(loadedAbs);

            // Known Abilities
            string abilityData = "0000320800800100014800800200017C0080030000080280040000140380050001300480060001B40080070000E4008008000018038009000F9400800A0000E002800B0000E002800C00006403800D00009000800E00003401800F00018C00801000006C0080110032B40080120000E402801300001003801400016400801500322004801600322C0080170001AC09801800012C008019000F9400801A0032C401801B00010800801C00018400801D0000F803801E001A3802801F00010400802000006C0280210001240580220032B40980230032640680240001680080250087DF11842600000400802700001C0080280032540480290032D404802A003210";

            byte[] knownAbilitiys = StringUtils.hexStringToBytes(abilityData);


            // Known Hardlines
            string hardlineData = "0207000000021f000000022300000002240000000225000000022600000002270000000229000000022b000000022f00000002300000000231000000023200000002340000000235000000023600000002370000000238000000023b000000023f000000024000000002410000000243000000024500000002480000000249000000024a000000024b000000024d000000024e000000024f000000025000000002510000000252000000025400000002550000000256000000025700000002580000000259000000025a000000025b000000025c000000025d000000025e000000025f000000026000000002610000000262000000026300000002640000000265000000026600000002670000000269000000026a000000026b000000026c000000026d000000026e000000026f000000027000000002710000000130000000013100000001370000000141000000014500000001480000000149000000014a000000014b000000014c000000014e000000014f0000000150000000015100000001520000000163000000016400000001650000000166000000016700000001680000000169000000016a000000016b000000016d000000016f00000001700000000171000000017200000001730000000174000000017700000001780000000179000000017a000000017b000000017c000000017d000000017e000000017f000000018000000001810000000182000000018300000001840000000185000000018600000001870000000188000000018a000000018b000000018c000000018d000000018e000000019000000001910000000192000000019300000001940000000195000000019600000001970000000198000000019900000003020000000303000000030400000003050000000306000000030700000003080000000309000000030a000000030b000000030c000000030d000000030e000000030f000000031000000003110000000312000000031300000003140000000315000000031600000003170000000318000000";

            //string hardlineData = Store.dbManager.MarginDbHandler.loadAllHardlines();
            byte[] knownHardlines = StringUtils.hexStringToBytes(hardlineData);


            // Contacts
            string missionContacts = "0700000001000800000000000a00000003000d00000000001c0000000100";

            byte[] knownContacts = StringUtils.hexStringToBytes(missionContacts);

            byte[] codeArchiveTest = StringUtils.hexStringToBytes("04000000A7010000AC010000CC010000D1010000D60100001302000019020000650200006602000068020000B4020000B5020000B6020000BB020000BC020000C2020000C4020000D5020000D6020000DE020000E2020000E3020000E6020000E7020000E90200003F03000086030000A0030000AA030000E3030000FC030000FE030000030400000604000008040000090400000A040000270400004C0400004E040000BB040000C2040000CE040000EB040000EC040000EE040000F5040000F6040000F7040000F9040000540900005F09000082090000BE090000BF090000C1090000C4090000C7090000C8090000C9090000040A0000080A0000B0120000");

            byte[] empty = new byte[0];

            // New Margin Method to send Data

            // Pre-Load Abilities so that we just need to filter the result later
            loadAbilities((int)this.newCharID);

            sendMarginCharData(empty, 0x01, client);
            sendMarginCharData(loadBackgroundInfo((int)this.newCharID), 0x02, client);
            sendMarginCharData(empty, 0x03, client);                                  // BuddyList (but old one)
            sendMarginCharData(empty, 0x04, client);                                  // Unknown - no one has data there so ignore it
            //sendMarginCharData(loadInventory((int)this.newCharID), 0x05, client);            // Inventory
            sendMarginCharData(StringUtils.hexStringToBytes(itemData), 0x05, client); // Inventory CR1
            sendMarginCharData(loadEquippedAbilities(), 0x06, client);                // Loaded Abilitys
            //sendMarginCharData(empty, 0x06, client);          // Loaded Abilitys CR1
            sendMarginCharData(loadKnownAbilities(), 0x07, client);                   // Known Abilities
            sendMarginCharData(knownHardlines, 0x08, client);                         // Hardlines
            sendMarginCharData(empty, 0x09, client);                                  // Access Nodes?
            //sendMarginCharData(codeArchiveTest, 0x0a, client);                  // Code Storage
            sendMarginCharData(empty, 0x0a, client);                                  // Code Storage CR1
            sendMarginCharData(knownContacts, 0x0b, client);                          // Contacts
            sendMarginCharData(empty, 0x0e, client);

            // ModT (has a seperate format)
            sendMarginData("1000000000" + StringUtils.bytesToString_NS(charIDB) + "10270d010f10000000", client);

            /* This is the server MOTD announcement (its disabled now) */

            /*DynamicArray announcement = new DynamicArray();
             * byte[] header = {0x10,0x00,0x00,0x00,0x00,0xac,0x53,0x02,0x00,0x10,0x27,0x0E,0x01,0x0D,0x10,0x00};
             * TimeUtils tim = new TimeUtils();
             * byte[] currentTime = tim.getUnixTime();
             * //Load motd from file
             * XmlParser xmlP = new XmlParser();
             * string[] data=xmlP.loadDBParams("Config.xml");
             * string motd=data[5];
             *
             * if (!motd.Equals("")){ // if MOTD not empty
             *      byte[] text = StringUtils.stringToBytes(motd);
             *      byte[] size = NumericalUtils.uint16ToByteArray((UInt16)(currentTime.Length+text.Length),1);
             *
             *      announcement.append(header);
             *      announcement.append(size);
             *      announcement.append(currentTime);
             *      announcement.append(text);
             *
             * byte[] encryptedResponse14 = marginEncr.encrypt(announcement.getBytes());
             * sendTCPVariableLenPacket(encryptedResponse14, client);
             * }*/
            /* End of the MOTD */

            //Output.WriteLine("[MARGIN] UserID "+this.userID+" waiting for session reply from world");
            //waitForWorldReply(); //TODO: enabling this outputted the "no usage" bug
            //Output.WriteLine("[MARGIN] World Session Reply OK for UserID "+this.userID);

            //System.Threading.Thread.Sleep(1000);
            //EstablishUDPSessionReply(packet, client);
        }
Пример #27
0
        public void processObjectStatic(ref byte[] packet)
        {
            byte[] objectID = new byte[4];
            byte[] sectorID = new byte[2];
            ArrayUtils.copyTo(packet, 0, objectID, 0, 4);
            ArrayUtils.copyTo(objectID, 2, sectorID, 0, 2);


            UInt32 numericObjectId = NumericalUtils.ByteArrayToUint32(objectID, 1);

            // Ok sector Bytes are something like 30 39 (reversed but the result must be 39 03)
            UInt16 numericSectorId = NumericalUtils.ByteArrayToUint16(sectorID, 1);
            // strip out object id
            string id = StringUtils.bytesToString_NS(objectID);


            // get the type
            byte[] objectType = new byte[1];
            ArrayUtils.copy(packet, 4, objectType, 0, 1);
            int objectTypeID = packet[4];

            DataLoader        objectLoader = DataLoader.getInstance();
            StaticWorldObject objectValues = objectLoader.getObjectValues(NumericalUtils.ByteArrayToUint32(objectID, 1));


            // create a new System message but fill it in the switch block
            ServerPackets pak = new ServerPackets();

            switch (objectTypeID)
            {
            // Case 03 is not only a staticWorldObject ...
            case (int)objectTypesStatic.DOOR:

                Output.writeToLogForConsole("[OI HELPER] INTERACT WITH DOOR | Object ID :" + id + " Sector ID : " + numericSectorId);

                // just a test

                if (objectValues != null && objectValues.type != null)
                {
                    GameObjectItem item = objectLoader.getGameObjectItemById(NumericalUtils.ByteArrayToUint16(objectValues.type, 1));
                    //Store.currentClient.messageQueue.addRpcMessage(PacketsUtils.createSystemMessage("[OI HELPER] Door StrType: !" + item.getName() + " with Type ID " + StringUtils.bytesToString_NS(objectValues.type), Store.currentClient));
                    this.processObjectInteraction(objectValues, item);
                }

                break;

            case (int)objectTypesStatic.HARDLINE_SYNC:

                pak.sendSystemChatMessage(Store.currentClient, "Hardline Interaction(not done yet)!", "MODAL");
                break;

            case (int)objectTypesStatic.HARDLINE_UPLOAD:
                Output.writeToLogForConsole("[OBJECT HELPER] Upload Hardline will be used for combat tests");
                Store.currentClient.playerData.lastClickedObjectId = numericObjectId;
                new TestUnitHandler().processTestCombat(ref packet);
                break;

            case (int)objectTypesStatic.HARDLINE_LAEXIT:
                // Exit LA
                pak.sendSystemChatMessage(Store.currentClient, "Exit to LA Dialog should popup", "MODAL");
                new TeleportHandler().processHardlineExitRequest();
                break;

            case (int)objectTypesStatic.HUMAN_NPC:
                pak.sendSystemChatMessage(Store.currentClient, "Open Vendor Dialog for Object ID" + StringUtils.bytesToString_NS(objectID), "MODAL");
                this.processVendorOpen(ref objectID);
                break;

            case (int)objectTypesStatic.COLLECTOR:
                pak.sendSystemChatMessage(Store.currentClient, "Collector Interaction (not done yet)!", "MODAL");
                break;

            case (int)objectTypesStatic.ENVIROMENT:
                GameObjectItem enviromentItem   = objectLoader.getGameObjectItemById(NumericalUtils.ByteArrayToUint16(objectValues.type, 1));
                UInt16         enviromentTypeID = NumericalUtils.ByteArrayToUint16(objectValues.type, 1);
                switch (enviromentTypeID)
                {
                case 6952:
                    // ToDo: implement Elevator Panel
                    pak.sendElevatorPanel(Store.currentClient, objectValues);
                    break;

                default:
                    pak.sendSystemChatMessage(Store.currentClient, "Enviroment Type ID " + objectValues.type + " name " + enviromentItem.getName(), "MODAL");
                    break;
                }
                pak.sendSystemChatMessage(Store.currentClient, "Enviroment Type ID " + objectValues.type + " name " + enviromentItem.getName(), "MODAL");
                break;


            default:
                pak.sendSystemChatMessage(Store.currentClient, "[OI HELPER] Unknown Object Type : " + objectTypeID.ToString() + "| Object ID :" + id, "MODAL");
                break;
            }
        }
Пример #28
0
        public void certConnectRequest(byte[] packet, NetworkStream client)
        {
            int firstnum  = BitConverter.ToInt16(packet, 3);
            int authstart = BitConverter.ToInt16(packet, 5);

            if (firstnum != 3)
            {
                //showMarginDebug("FirstNum is not 3, it is" + firstnum);
            }

            if (authstart != 310)
            {
                //showMarginDebug("AuthStart is not 0x3601");
            }



            // Get the Signature
            byte[] signature = new byte[128];

            ArrayUtils.copy(packet, 7, signature, 0, 128);

            // TODO MD5 Signature and verify it with RSA to check if everything is correct

            // Get the signedData
            byte[] signedData = new byte[packet.Length - 135];
            ArrayUtils.copy(packet, 135, signedData, 0, packet.Length - 135);
            int userid = BitConverter.ToInt32(signedData, 1);

            this.userID = (UInt32)userid;


            // Stripout Exponent and Modulus

            byte[] exponent = { 0x00, 0x00, 0x00, 0x11 };
            byte[] modulus  = new byte[96];

            ArrayUtils.copy(signedData, 82, modulus, 0, 96);

            // Init our encryptor with users modulus and exponent
            marginEncr.setUserPubKey(exponent, modulus);
            // build the final packet, it consists of 1 byte 0x00 + twofish key for world and margin + encryptIV

            byte[] encryptMeResponse = new byte[33];
            encryptMeResponse[0] = 0x00;

            ArrayUtils.copy(marginEncr.getTFKey(), 0, encryptMeResponse, 1, 16);
            ArrayUtils.copy(marginEncr.getIV(), 0, encryptMeResponse, 17, 16);

            byte[] encryptedShit = { };
            encryptedShit = marginEncr.encryptUsersPublic(encryptMeResponse);

            byte[] blobSize = NumericalUtils.uint16ToByteArray((UInt16)encryptedShit.Length, 1);

            byte[] header = { 0x02, 0x03, 0x00 };
            // Write final packet

            DynamicArray din = new DynamicArray();

            din.append(header);
            din.append(blobSize);
            din.append(encryptedShit);

            sendTCPVariableLenPacket(din.getBytes(), client);
        }
Пример #29
0
        public int detect03Plugin(ref byte[] packetData)
        {
            //CHAT PACKET: 02 03 02 00 01 02 73 00 00
            // 04 01 00 54 01 1d 28 10 00 08 00 00 00 00 13 00 3f 74 65 6c 65 70 6f 72 74 20 32 30 20 32 30 20 32 30 00

            byte actionFromClient = packetData[6];

            if (actionFromClient == 0x73)           //Do the 03->04 bypass to handle chat commands
            {
                if (packetData.Length > 12)
                {
                    Output.WriteLine("[03 Parser] PATCHING 03 PACKET TO SELF CHAT RPC PROCESS");
                    byte[] change = new byte[1 + packetData.Length - 9];
                    change[0] = 0x02;
                    ArrayUtils.copy(packetData, 9, change, 1, packetData.Length - 9);
                    packetData = change;
                    return((int)PluginList.PLUGIN_CHATSELF);
                }
            }

            byte[] selfUpdateHeader = { 0x02, 0x03, 0x02, 0x00, 0x01 };


            /* DOING A TRICK (03 self chat packet to 04 RPC) */
            byte[] temp = new byte[5];
            ArrayUtils.copy(packetData, 0, temp, 0, 5);


            if (au.equal(temp, selfUpdateHeader))
            {
                //02 03 02 02 01 02 73
                byte updateSelector      = packetData[5];
                byte possibleUpdateValue = packetData[6];

                switch ((int)updateSelector)
                {
                case 0x02:
                    //DO
                    return((int)PluginList.PLUGIN_SELFUPDATE);


                case 0x03:
                    return((int)PluginList.PLUGIN_SELFUPDATE);

                case 0x04:
                    return((int)PluginList.PLUGIN_SELFUPDATE);

                case 0x06:
                    return((int)PluginList.PLUGIN_SELFUPDATE);


                case 0x08:
                    return((int)PluginList.PLUGIN_SELFUPDATE);


                case 0x0a:
                    return((int)PluginList.PLUGIN_SELFUPDATE);
                }
            }


            return((int)PluginList.PLUGIN_NONE);            // Need more work here :P
        }