public static ByteArrayToUint32 ( byte data, int reversed ) : |
||
data | byte | |
reversed | int | |
return |
public UInt32 readUInt32(int reversed) { UInt32 value = 0; value = NumericalUtils.ByteArrayToUint32(new byte[] { packetData[offset], packetData[offset + 1], packetData[offset + 2], packetData[offset + 3] }, reversed); offset = offset + 4; return(value); }
public void processLoadFactionName(ref byte[] packet) { byte[] factionBytes = { packet[0], packet[1], packet[2], packet[3] }; UInt32 factionId = NumericalUtils.ByteArrayToUint32(factionBytes, 1); ServerPackets pak = new ServerPackets(); pak.sendFactionName(Store.currentClient, factionId, "The Duality Dude"); }
public void processSelfAnimation(AbilityItem ability) { // ServerPackets serverPackets = new ServerPackets(); // serverPackets.sendAbilitySelfAnimation(2, ability.getAbilityID(), (UInt32) ability.getAbilityExecutionFX()); ServerPackets serverPackets = new ServerPackets(); serverPackets.sendAbilitySelfAnimation(2, ability.getAbilityID(), NumericalUtils.ByteArrayToUint32(ability.getCastAnimStart(), 1)); }
private static void playerRSIPacket(out DynamicArray rsiPacket, out DynamicArray creationPacket, WorldClient client, ushort spawnIdCounter) { //Create the packet for the player rsiPacket = new DynamicArray(); byte[] rsi = PacketsUtils.getRSIBytes(client.playerData.getRsiValues()); byte[] CurCombatExclusiveAbility = { 0x00, 0x10, 0x00, 0x00 }; //TODO: fix this 03 01 00 rsiPacket.append(new byte[] { 0x01, 0x00 }); ///////////////////////////////////////////// client.playerInstance.DisableAllAttributes(); //Predisable to just send what we need to spawn client.playerInstance.RealFirstName.enable(); client.playerInstance.RealLastName.enable(); client.playerInstance.Health.enable(); client.playerInstance.MaxHealth.enable(); client.playerInstance.YawInterval.enable(); //ROTATION client.playerInstance.OrganizationID.enable(); client.playerInstance.StealthAwareness.setValue(0x01); // TODO: See what's stealth awareness client.playerInstance.InnerStrengthAvailable.enable(); client.playerInstance.CharacterName.enable(); client.playerInstance.TitleAbility.enable(); client.playerInstance.CharacterID.enable(); // It was set when grabbing from database client.playerInstance.RSIDescription.setValue(rsi); client.playerInstance.InnerStrengthMax.enable(); client.playerInstance.Position.enable(); client.playerInstance.Level.enable(); client.playerInstance.CombatantMode.setValue((byte)0x22); //TODO: see what's combatantmode client.playerInstance.ReputationCypherites.enable(); client.playerInstance.ReputationGMOrganization.enable(); client.playerInstance.ReputationNiobe.enable(); client.playerInstance.ReputationZionMilitary.enable(); if (NumericalUtils.ByteArrayToUint32(client.playerInstance.FactionID.getValue(), 1) > 0) { client.playerInstance.FactionID.enable(); } if (NumericalUtils.ByteArrayToUint32(client.playerInstance.CrewID.getValue(), 1) > 0) { client.playerInstance.CrewID.enable(); } client.playerInstance.CurExclusiveAbility.setValue(CurCombatExclusiveAbility); //TODO: see what's this // ok we set all our values - lets get the generated packet for us creationPacket = Store.world.objMan.GenerateCreationPacket(client.playerInstance, 0x0000, (byte)spawnIdCounter); }
public void processBuyItem(ref byte[] packet) { byte[] goByteID = { packet[0], packet[1], packet[2], packet[3] }; UInt32 itemGoID = NumericalUtils.ByteArrayToUint32(goByteID, 1); InventoryHandler inventory = new InventoryHandler(); inventory.processItemAdd(itemGoID, 0x10); // ToDo: decrease the money ?:) }
public ArrayList decrypt(byte[] encryptedData, int length) { ArrayList response = new ArrayList(); UInt16 pss = 0; UInt16 cseq = 0; UInt16 sseq = 0; PacketReader readerEncrypted = new PacketReader(encryptedData); readerEncrypted.incrementOffsetByValue(1); // skip 0x01 IV = readerEncrypted.readBytes(16); tf.setIV(IV); // Read the whole Data innerBuffer = new byte[encryptedData.Length - 17]; byte[] decryptBuffer = readerEncrypted.readBytes(encryptedData.Length - 17); tf.decrypt(decryptBuffer, innerBuffer); // just copy to clean byte[] decryptedPacket = innerBuffer; innerBuffer = new byte[2048]; PacketReader reader = new PacketReader(decryptedPacket); UInt32 crc32fromPacket = reader.readUInt32(1); byte[] packetCheckData = reader.readBytes(decryptedPacket.Length - 4); UInt32 crc32plainDataToCompare = NumericalUtils.ByteArrayToUint32(crc32.checksumB(packetCheckData, 1), 1); if (crc32plainDataToCompare != crc32fromPacket) { Output.WriteLine("Oh oh, CRC didnt matched in this packet"); } // as we read the whole packet for verifiy we reset the offset to read the other things reader.setOffsetOverrideValue(4); UInt16 packetSize = reader.readUInt16(1); // UInt32 timeStamp = reader.readUInt32(1); // Well we didnt need it - but just read it as uint32 UInt32 seqValues = reader.readUInt32(0); cseq = (UInt16)(seqValues & 0xFFF); sseq = (UInt16)(seqValues >> 12 & 0xFFF); pss = (UInt16)(seqValues >> 24 & 0xFF); // Finally add our responses and read the rest of the packet response.Add(reader.readBytes(packetSize - 4)); response.Add(pss); response.Add(cseq); response.Add(sseq); return(response); }
public void processEmote(ref byte[] packet) { byte[] emoteBytes = new byte[4]; emoteBytes[0] = packet[0]; emoteBytes[1] = packet[1]; emoteBytes[2] = packet[2]; emoteBytes[3] = packet[3]; byte emoteByte = packet[0]; UInt32 emoteKey = NumericalUtils.ByteArrayToUint32(emoteBytes, 0); ServerPackets server = new ServerPackets(); server.sendEmotePerform(Store.currentClient, emoteKey); }
public byte[] getFinalData(ClientData playerData) { // TODO: Sim Time with Client (not real time) on every 4 Local SSEQ we send playerData.IncrementSseq(); this.neededAckSSeq = playerData.getSseq(); if ((NumericalUtils.ByteArrayToUint32(TimeUtils.getCurrentSimTime(), 1) - playerData.lastSimTimeUpdate) > 3) { timed = true; playerData.lastSimTimeUpdate = NumericalUtils.ByteArrayToUint32(TimeUtils.getCurrentSimTime(), 1); } playerData.getRPCShutDown(); if (timed) { if (playerData.waitForRPCShutDown == true) { content.append((byte)0xc2); } else { content.append((byte)0x82); } content.append(TimeUtils.getCurrentSimTime()); } else { if (playerData.waitForRPCShutDown == true) { content.append((byte)0x42); } else { content.append((byte)0x02); } } // Merge all Message together and generate the Final Packet Header generateObjectMessageData(); generateRpcMessageData(); Output.WriteDebugLog("PACKET DATA (getFinalData):" + StringUtils.bytesToString(content.getBytes())); return(content.getBytes()); }
public void processVendorOpen(ref byte[] objectID) { // ToDo: Dynamic Shop Vendors PacketContent pak = new PacketContent(); Vendor vendor = DataLoader.getInstance().getVendorByGoIDandMetrId(NumericalUtils.ByteArrayToUint32(objectID, 1), 1); if (vendor != null) { // ToDo: send the Packet (and give it the items ?) ServerPackets serverPacket = new ServerPackets(); serverPacket.sendVendorWindow(Store.currentClient, vendor); } //pak.addHexBytes("810D7CADD943000000A07EB1D1400000008000BEA940000000E0E74CA7402000140000140080002000800018008000040080002C008000F4118000540680004C088000BC06800000068000AC058000700D8000740D8000900D8000940D8000980D80009C0D8000240080003C0080001C0080"); //Store.currentClient.messageQueue.addRpcMessage(pak.returnFinalPacket()); }
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; } }
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); }
public void loadWorldObjectsDb(string path) { Output.Write("Loading Static Objects from " + path + " - please wait..."); ArrayList staticWorldObjects = loadCSV(path, ','); StaticWorldObject worldObject = null; int linecount = 1; foreach (string[] data in staticWorldObjects) { if (linecount > 1) { //Output.WriteLine("Show Colums for Line : " + linecount.ToString() + " GOID: " + data[1].ToString() + " Name " + data[0].ToString()); worldObject = new StaticWorldObject(); worldObject.metrId = Convert.ToUInt16(data[0]); worldObject.sectorID = Convert.ToUInt16(data[1]); worldObject.mxoId = NumericalUtils.ByteArrayToUint32(StringUtils.hexStringToBytes(data[2]), 1); worldObject.staticId = NumericalUtils.ByteArrayToUint32(StringUtils.hexStringToBytes(data[3]), 1); worldObject.type = StringUtils.hexStringToBytes(data[4].Substring(0, 4)); worldObject.exterior = Convert.ToBoolean(data[5]); worldObject.pos_x = double.Parse(data[6], CultureInfo.InvariantCulture); worldObject.pos_y = double.Parse(data[7], CultureInfo.InvariantCulture); worldObject.pos_z = double.Parse(data[8], CultureInfo.InvariantCulture); worldObject.rot = double.Parse(data[9], CultureInfo.InvariantCulture); worldObject.quat = data[10]; if (data[3] == "01003039") { Output.writeToLogForConsole("[DEMO DOOR] 01003039, X: " + worldObject.pos_x + ", Y: " + worldObject.pos_y + ", Z: " + worldObject.pos_z + ", ROT: " + worldObject.rot + ", TypeId: " + StringUtils.bytesToString_NS(worldObject.type)); } WorldObjectsDB.Add(worldObject); worldObject = null; } linecount++; } }
public void processInitUDPSession(ref byte[] packetData) { byte[] cIDHex = new byte[4]; cIDHex[0] = packetData[11]; cIDHex[1] = packetData[12]; cIDHex[2] = packetData[13]; cIDHex[3] = packetData[14]; Store.currentClient.playerData.setCharID(NumericalUtils.ByteArrayToUint32(cIDHex, 1)); Store.dbManager.WorldDbHandler.setPlayerValues(); Store.dbManager.WorldDbHandler.setRsiValues(); // send the init UDP packet * 5 byte[] response = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05 }; Store.currentClient.messageQueue.addRawMessage(response); Store.currentClient.messageQueue.addRawMessage(response); Store.currentClient.messageQueue.addRawMessage(response); Store.currentClient.messageQueue.addRawMessage(response); Store.currentClient.messageQueue.addRawMessage(response); Store.currentClient.FlushQueue(); Store.margin.sendUDPSessionReply(Store.currentClient.playerData.getCharID()); }
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; } }
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); }
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); }
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 */ }
public void processLoadAbility(ref byte[] packet) { // read the values from the packet byte[] staticObjectByteID = new byte[4]; ArrayUtils.copyTo(packet, 0, staticObjectByteID, 0, 4); byte[] unloadFlagByte = new byte[2]; ArrayUtils.copyTo(packet, 4, unloadFlagByte, 0, 2); byte[] loadFlagByte = new byte[2]; ArrayUtils.copyTo(packet, 6, loadFlagByte, 0, 2); byte[] countAbilityBytes = new byte[2]; ArrayUtils.copyTo(packet, 8, countAbilityBytes, 0, 2); UInt16 countAbilities = NumericalUtils.ByteArrayToUint16(countAbilityBytes, 1); // Get the Ability Related Header Data UInt32 staticObjectID = NumericalUtils.ByteArrayToUint32(staticObjectByteID, 1); UInt16 unloadFlag = NumericalUtils.ByteArrayToUint16(unloadFlagByte, 1); UInt16 loadFlag = NumericalUtils.ByteArrayToUint16(loadFlagByte, 1); int pointer = 11; // Start at index 11 List <UInt16> abilitySlots = new List <UInt16>(); for (int i = 1; i <= countAbilities; i++) { // This must be looped byte[] slotByteID = new byte[2]; ArrayUtils.copyTo(packet, pointer, slotByteID, 0, 2); pointer = pointer + 2; byte[] abilityByteID = new byte[2]; ArrayUtils.copyTo(packet, pointer, abilityByteID, 0, 2); pointer = pointer + 4; byte[] abilityByteLevel = new byte[2]; ArrayUtils.copyTo(packet, pointer, abilityByteLevel, 0, 2); pointer = pointer + 3; UInt16 slotID = NumericalUtils.ByteArrayToUint16(slotByteID, 1); UInt16 AbilityID = NumericalUtils.ByteArrayToUint16(abilityByteID, 1); UInt16 AbilityLevel = NumericalUtils.ByteArrayToUint16(abilityByteLevel, 1); PacketContent pak = new PacketContent(); if (unloadFlag > 0) { pak.addUint16((UInt16)RPCResponseHeaders.SERVER_ABILITY_UNLOAD, 0); pak.addByteArray(abilityByteID); } else { pak.addUint16((UInt16)RPCResponseHeaders.SERVER_ABILITY_LOAD, 0); pak.addByteArray(abilityByteID); pak.addByteArray(abilityByteLevel); pak.addByteArray(slotByteID); } abilitySlots.Add(slotID); Store.currentClient.messageQueue.addRpcMessage(pak.returnFinalPacket()); } if (unloadFlag > 0) { Store.dbManager.WorldDbHandler.updateAbilityLoadOut(abilitySlots, 0); } else { Store.dbManager.WorldDbHandler.updateAbilityLoadOut(abilitySlots, 1); } }