public static LtVector3dToDoubles ( byte LtVector3d, double &x, double &y, double &z ) : void | ||
LtVector3d | byte | |
x | double | |
y | double | |
z | double | |
return | void |
public void processHyperJumpCancel(ref byte[] rpcData) { double xDest = 0; double yDest = 0; double zDest = 0; PacketReader reader = new PacketReader(rpcData); xDest = reader.readDouble(1); yDest = reader.readDouble(1); zDest = reader.readDouble(1); // ToDo: figure out what this 6 bytes are could be // Skip 6 bytes as we currently didnt knew UInt32 clientJumpIdUnknown = reader.readUInt32(1); // Players current X Z Y double x = 0; double y = 0; double z = 0; byte[] Ltvector3d = Store.currentClient.playerInstance.Position.getValue(); NumericalUtils.LtVector3dToDoubles(Ltvector3d, ref x, ref y, ref z); int rotation = (int)Store.currentClient.playerInstance.YawInterval.getValue()[0]; float xPos = (float)x; float yPos = (float)y; float zPos = (float)z; float distance = Maths.getDistance(xPos, yPos, zPos, (float)xDest, (float)yDest, (float)zDest); UInt16 duration = (UInt16)(distance * 0.5); UInt32 startTime = TimeUtils.getUnixTimeUint32(); UInt32 endTime = startTime + duration; ServerPackets packets = new ServerPackets(); packets.sendHyperJumpID(clientJumpIdUnknown); packets.SendHyperJumpUpdate(xPos, yPos, zPos, (float)xDest, (float)yDest, (float)zDest, startTime, endTime); }
public void parseCommand(string data) { Output.WriteLine("[Chat Command helper] Chat command is: '" + data + "'"); string[] commands = data.Split(' '); string command = commands[0].ToLower(); try{ if (command.Equals("?fix") && commands.Length > 1) { int maxRPC = int.Parse(commands[1]); for (int i = 0; i < maxRPC; i++) { Store.currentClient.playerData.setRPCCounter((UInt16)i); Store.currentClient.messageQueue.addRpcMessage(PacketsUtils.createSystemMessage("Trying to fix! " + i, Store.currentClient)); } } if (command.Equals("?teleport") && commands.Length == 4) { // parse the coord parameters parameters as int Store.currentClient.messageQueue.addObjectMessage(new PlayerHelper().teleport(int.Parse(commands[1]), int.Parse(commands[2]), int.Parse(commands[3])), false); Store.currentClient.messageQueue.addRpcMessage(PacketsUtils.createSystemMessage("Teleported!", Store.currentClient)); } if (command.Equals("?rsi") && commands.Length == 3) { //parse the rsi part and value Store.currentClient.messageQueue.addObjectMessage(new PlayerHelper().changeRsi(commands[1], int.Parse(commands[2])), false); Store.currentClient.messageQueue.addRpcMessage(PacketsUtils.createSystemMessage("Rsi changed!", Store.currentClient)); } if (command.StartsWith("?message")) { Output.WriteLine("[COMMAND HELPER]MESSAGE RECEIVED"); byte[] theMessage = PacketsUtils.createSystemMessageWithoutRPC(commands[1]); Store.world.sendRPCToAllPlayers(theMessage); } if (command.Equals("?playanim")) { string animId = commands[1]; if (animId.Length == 4) { ServerPackets pak = new ServerPackets(); pak.sendPlayerAnimation(Store.currentClient, animId); } } if (command.StartsWith("?playfx")) { string fxHEDID = commands[1]; DynamicArray din = new DynamicArray(); byte[] animationId = StringUtils.hexStringToBytes(fxHEDID); byte[] viewID = { 0x02, 0x00 }; Random rand = new Random(); ushort updateViewCounter = (ushort)rand.Next(3, 200); byte[] updateCount = NumericalUtils.uint16ToByteArrayShort(updateViewCounter); Output.WriteLine("Check if its really one byte or two : " + StringUtils.bytesToString(updateCount)); din.append(viewID); din.append(0x02); din.append(0x80); din.append(0x80); din.append(0x80); din.append(0x90); din.append(0xed); din.append(0x00); din.append(0x30); din.append(animationId); din.append(updateCount); Store.currentClient.messageQueue.addObjectMessage(din.getBytes(), false); } if (command.Contains("?send")) { // Sends a packet from a file string filename = "packet.txt"; TextReader tr = new StreamReader(filename); string hexContent = tr.ReadToEnd(); hexContent = hexContent.Replace(" ", string.Empty); hexContent = hexContent.Replace(" ", Environment.NewLine); tr.Close(); if (hexContent.Length > 0) { Store.currentClient.messageQueue.addObjectMessage(StringUtils.hexStringToBytes(hexContent), false); Output.writeToLogForConsole("[SENDPACK FROM FILE] Content : " + hexContent); } } if (command.Contains("?combat")) { byte[] dummypak = new byte[4]; TestUnitHandler test = new TestUnitHandler(); test.testCloseCombat(ref dummypak); } if (command.Contains("?mob")) { UInt32[] rsiIDs = new UInt32[10]; rsiIDs[0] = 0xB7010058; rsiIDs[1] = 0x89090058; rsiIDs[2] = 0xB5010058; rsiIDs[3] = 0x3A030008; rsiIDs[4] = 0x32030008; rsiIDs[5] = 0xD0010058; rsiIDs[6] = 0xD4010058; rsiIDs[7] = 0xB8040004; // Smith rsiIDs[8] = 0x92010058; // Seraph rsiIDs[9] = 0x56050004; Random rand = new Random(); int index = rand.Next(0, 9); 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); byte[] xPos = NumericalUtils.floatToByteArray((float)x, 1); byte[] yPos = NumericalUtils.floatToByteArray((float)y, 1); byte[] zPos = NumericalUtils.floatToByteArray((float)z, 1); UInt64 currentEntityId = WorldSocket.entityIdCounter; WorldSocket.entityIdCounter++; uint rotation = 0; npc theMob = new npc(); theMob.setEntityId(currentEntityId); theMob.setDistrict(Convert.ToUInt16(data[0].ToString())); theMob.setDistrictName(Store.currentClient.playerData.getDistrict()); theMob.setName("HD Protector"); theMob.setLevel(255); theMob.setHealthM(UInt16.Parse(data[4].ToString())); theMob.setHealthC(UInt16.Parse(data[5].ToString())); theMob.setMobId((ushort)rsiIDs[index]); theMob.setRsiHex(StringUtils.bytesToString_NS(NumericalUtils.uint32ToByteArray(rsiIDs[index], 1))); theMob.setXPos(x); theMob.setYPos(y); theMob.setZPos(z); theMob.xBase = x; theMob.yBase = y; theMob.zBase = z; theMob.setRotation(rotation); theMob.setIsDead(false); theMob.setIsLootable(false); WorldSocket.npcs.Add(theMob); // we use this for a test to see if we can spawn mobs and how we can handle them // We refactor this } if (command.Contains("?sendrpc")) { // sends a RPC Packet from a File string filename = "rpcpacket.txt"; TextReader tr = new StreamReader(filename); string hexContent = tr.ReadToEnd(); hexContent = hexContent.Replace(" ", string.Empty); hexContent = hexContent.Replace(" ", Environment.NewLine); Output.Write("SEND RPC COMMAND : CONTENT : " + hexContent); tr.Close(); if (hexContent.Length > 0) { Store.currentClient.messageQueue.addRpcMessage(StringUtils.hexStringToBytes(hexContent)); Output.writeToLogForConsole("[SENDRPC FROM FILE] Content : " + hexContent); } } if (command.Contains("?checkrpc")) { DynamicArray din = new DynamicArray(); din.append(StringUtils.hexStringToBytes("2E1000FF7D020024000000310000000000000000000000000000000000000000000000000B0053796E61707A65373737001D004F6E2079656168204920646F2072656D656D62657220796F75203A2900")); Store.currentClient.messageQueue.addRpcMessage(din.getBytes()); } if (command.Contains("?testrpc")) { UInt16 maxRPC = 33279; // Just to reference if (Store.currentClient.playerData.currentTestRPC <= maxRPC) { // Only if it is below we send it - we test with a 5 size packet DynamicArray din = new DynamicArray(); if (Store.currentClient.playerData.currentTestRPC < 127) { din.append(NumericalUtils.uint16ToByteArrayShort(Store.currentClient.playerData.currentTestRPC)); } else { din.append(NumericalUtils.uint16ToByteArray(Store.currentClient.playerData.currentTestRPC, 0)); } din.append(0x00); din.append(0x00); din.append(0x00); Store.currentClient.messageQueue.addRpcMessage(din.getBytes()); ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(Store.currentClient, "Test RPC Header : " + Store.currentClient.playerData.currentTestRPC.ToString(), "MODAL"); Store.currentClient.playerData.currentTestRPC++; } } if (command.Equals("?save")) { new PlayerHelper().savePlayerInfo(Store.currentClient); ServerPackets pak = new ServerPackets(); pak.sendSaveCharDataMessage(Store.currentClient, StringUtils.charBytesToString_NZ(Store.currentClient.playerInstance.CharacterName.getValue())); } } catch (Exception e) { Store.currentClient.messageQueue.addRpcMessage(PacketsUtils.createSystemMessage("Error parsing command!", Store.currentClient)); Output.WriteLine("[CHAT COMMAND PARSER] Error parsing request: " + data); Output.WriteLine("[CHAT COMMAND PARSER] DEBUG: " + e.Message + "\n" + e.StackTrace); } }
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); }
private static void CheckPlayerMobViews() { // Spawn/Update for mobs int npcCount = WorldSocket.npcs.Count; for (int i = 0; i < npcCount; i++) { Mob thismob = (Mob)WorldSocket.npcs[i]; lock (WorldSocket.Clients.SyncRoot) { foreach (string clientKey in WorldSocket.Clients.Keys) { // Loop through all clients WorldClient thisclient = WorldSocket.Clients[clientKey] as WorldClient; if (thisclient.Alive == true) { // Check if if (thisclient.playerData.getOnWorld() == true && thisclient.playerData.waitForRPCShutDown == false) { Maths math = new Maths(); double playerX = 0; double playerY = 0; double playerZ = 0; NumericalUtils.LtVector3dToDoubles(thisclient.playerInstance.Position.getValue(), ref playerX, ref playerY, ref playerZ); Maths mathUtils = new Maths(); bool mobIsInCircle = mathUtils.IsInCircle((float)playerX, (float)playerZ, (float)thismob.getXPos(), (float)thismob.getZPos(), 5000); // Spawn Mob if its in Visibility Range ClientView mobView = thisclient.viewMan.getViewForEntityAndGo(thismob.getEntityId(), NumericalUtils.ByteArrayToUint16(thismob.getGoId(), 1)); if (mobView.viewCreated == false && thismob.getDistrict() == thisclient.playerData.getDistrictId() && thisclient.playerData.getOnWorld() && mobIsInCircle) { #if DEBUG ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(thisclient, "Mob with Name " + thismob.getName() + " with new View ID " + mobView.ViewID + " spawned", "BROADCAST"); #endif ServerPackets mobPak = new ServerPackets(); mobPak.SpawnMobView(thisclient, thismob, mobView); mobView.spawnId = thisclient.playerData.spawnViewUpdateCounter; mobView.viewCreated = true; thismob.isUpdateable = true; thismob.DoMobUpdate(thismob); } // Delete Mob's View from Client if we are outside if (mobView.viewCreated == true && !mobIsInCircle && thismob.getDistrict() == thisclient.playerData.getDistrictId()) { // ToDo: delete mob ServerPackets packets = new ServerPackets(); packets.sendDeleteViewPacket(thisclient, mobView.ViewID); #if DEBUG packets.sendSystemChatMessage(thisclient, "MobView (" + thismob.getName() + " LVL: " + thismob.getLevel() + " ) with View ID " + mobView.ViewID + " is out of range and is deleted!", "MODAL"); #endif thisclient.viewMan.removeViewByViewId(mobView.ViewID); thismob.isUpdateable = false; } } } } } } }
private static void CheckPlayerViews() { // Check for Player Views lock (WorldSocket.Clients.SyncRoot) { foreach (string clientKey in WorldSocket.Clients.Keys) { // get Current client WorldClient currentClient = WorldSocket.Clients[clientKey] as WorldClient; // Loop all Clients and check if we need to create a view for it foreach (string clientOtherKey in WorldSocket.Clients.Keys) { WorldClient otherClient = WorldSocket.Clients[clientOtherKey] as WorldClient; if (otherClient != currentClient) { ClientView clientView = currentClient.viewMan.getViewForEntityAndGo( otherClient.playerData.getEntityId(), NumericalUtils.ByteArrayToUint16(otherClient.playerInstance.GetGoid(), 1)); // Create Maths math = new Maths(); double currentPlayerX = 0; double currentPlayerY = 0; double currentPlayerZ = 0; double otherPlayerX = 0; double otherPlayerY = 0; double otherPlayerZ = 0; NumericalUtils.LtVector3dToDoubles(currentClient.playerInstance.Position.getValue(), ref currentPlayerX, ref currentPlayerY, ref currentPlayerZ); NumericalUtils.LtVector3dToDoubles(currentClient.playerInstance.Position.getValue(), ref otherPlayerX, ref otherPlayerY, ref otherPlayerZ); Maths mathUtils = new Maths(); bool playerIsInCircle = mathUtils.IsInCircle((float)currentPlayerX, (float)currentPlayerZ, (float)otherPlayerX, (float)otherPlayerZ, 5000); if (clientView.viewCreated == false && currentClient.playerData.getDistrictId() == otherClient.playerData.getDistrictId() && otherClient.playerData.getOnWorld() && currentClient.playerData.getOnWorld() && playerIsInCircle) { // Spawn player ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(currentClient, "Player " + StringUtils.charBytesToString_NZ(otherClient.playerInstance.CharacterName.getValue()) + " with new View ID " + clientView.ViewID + " jacked in", "BROADCAST"); pak.sendPlayerSpawn(currentClient, otherClient, clientView.ViewID); clientView.spawnId = currentClient.playerData.spawnViewUpdateCounter; clientView.viewCreated = true; } if (clientView.viewCreated && !playerIsInCircle) { // ToDo: delete mob ServerPackets packets = new ServerPackets(); packets.sendSystemChatMessage(currentClient, "Player " + StringUtils.charBytesToString_NZ(otherClient.playerInstance.CharacterName.getValue()) + " with View ID " + clientView.ViewID + " jacked out!", "MODAL"); packets.sendDeleteViewPacket(currentClient, clientView.ViewID); currentClient.viewMan.removeViewByViewId(clientView.ViewID); } } } } } }
public void ViewVisibleThread() { Output.WriteLine("[WORLD SERVER]View Visible Thread started"); while (true) { ArrayList deadPlayers = new ArrayList(); ArrayList removeEntities = new ArrayList(); // Clean lock (WorldSocket.Clients.SyncRoot) { foreach (string clientKey in WorldSocket.Clients.Keys) { // Collect dead players to arraylist WorldClient thisclient = WorldSocket.Clients[clientKey] as WorldClient; if (thisclient.Alive == false) { // Add dead Player to the List - we need later to clear them deadPlayers.Add(clientKey); } } cleanDeadPlayers(deadPlayers); } // Check for Player Views lock (WorldSocket.Clients.SyncRoot) { foreach (string clientKey in WorldSocket.Clients.Keys) { // get Current client WorldClient currentClient = WorldSocket.Clients[clientKey] as WorldClient; // Loop all Clients and check if we need to create a view for it foreach (string clientOtherKey in WorldSocket.Clients.Keys) { WorldClient otherClient = WorldSocket.Clients[clientOtherKey] as WorldClient; if (otherClient != currentClient) { ClientView clientView = currentClient.viewMan.getViewForEntityAndGo(otherClient.playerData.getEntityId(), NumericalUtils.ByteArrayToUint16(otherClient.playerInstance.GetGoid(), 1)); // Create Maths math = new Maths(); double currentPlayerX = 0; double currentPlayerY = 0; double currentPlayerZ = 0; double otherPlayerX = 0; double otherPlayerY = 0; double otherPlayerZ = 0; NumericalUtils.LtVector3dToDoubles(currentClient.playerInstance.Position.getValue(), ref currentPlayerX, ref currentPlayerY, ref currentPlayerZ); NumericalUtils.LtVector3dToDoubles(currentClient.playerInstance.Position.getValue(), ref otherPlayerX, ref otherPlayerY, ref otherPlayerZ); Maths mathUtils = new Maths(); bool playerIsInCircle = mathUtils.IsInCircle((float)currentPlayerX, (float)currentPlayerZ, (float)otherPlayerX, (float)otherPlayerZ, 5000); if (clientView.viewCreated == false && currentClient.playerData.getDistrictId() == otherClient.playerData.getDistrictId() && otherClient.playerData.getOnWorld() && currentClient.playerData.getOnWorld() && playerIsInCircle) { // Spawn player ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(currentClient, "Player " + otherClient.playerInstance.GetName() + " with new View ID " + clientView.ViewID + " jacked in", "BROADCAST"); pak.sendPlayerSpawn(currentClient, otherClient, clientView.ViewID); clientView.spawnId = currentClient.playerData.spawnViewUpdateCounter; clientView.viewCreated = true; } if (clientView.viewCreated && !playerIsInCircle) { // ToDo: delete mob ServerPackets packets = new ServerPackets(); packets.sendSystemChatMessage(currentClient, "Player " + otherClient.playerInstance.GetName() + " with View ID " + clientView.ViewID + " jacked out!", "MODAL"); packets.sendDeleteViewPacket(currentClient, clientView.ViewID); currentClient.viewMan.removeViewByViewId(clientView.ViewID); } } } } } // Spawn/Update for mobs int npcCount = WorldSocket.npcs.Count; for (int i = 0; i < npcCount; i++) { npc thismob = (npc)WorldSocket.npcs[i]; lock (WorldSocket.Clients.SyncRoot) { foreach (string clientKey in WorldSocket.Clients.Keys) { // Loop through all clients WorldClient thisclient = WorldSocket.Clients[clientKey] as WorldClient; if (thisclient.Alive == true) { // Check if if (thisclient.playerData.getOnWorld() == true && thisclient.playerData.waitForRPCShutDown == false) { Maths math = new Maths(); double playerX = 0; double playerY = 0; double playerZ = 0; NumericalUtils.LtVector3dToDoubles(thisclient.playerInstance.Position.getValue(), ref playerX, ref playerY, ref playerZ); Maths mathUtils = new Maths(); bool mobIsInCircle = mathUtils.IsInCircle((float)playerX, (float)playerZ, (float)thismob.getXPos(), (float)thismob.getZPos(), 5000); // ToDo: Check if mob is in circle of player (radian some value that is in a middle range for example 300m) // Create ClientView mobView = thisclient.viewMan.getViewForEntityAndGo(thismob.getEntityId(), NumericalUtils.ByteArrayToUint16(thismob.getGoId(), 1)); if (mobView.viewCreated == false && thismob.getDistrict() == thisclient.playerData.getDistrictId() && thisclient.playerData.getOnWorld() && mobIsInCircle) { ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(thisclient, "Mob with Name " + thismob.getName() + " with new View ID " + mobView.ViewID + " spawned", "BROADCAST"); ServerPackets mobPak = new ServerPackets(); mobPak.spawnMobView(thisclient, thismob, mobView); mobView.spawnId = thisclient.playerData.spawnViewUpdateCounter; mobView.viewCreated = true; } // Update Mob if (mobView.viewCreated == true && thismob.getDistrict() == thisclient.playerData.getDistrictId() && thisclient.playerData.getOnWorld()) { // ToDo: We need to involve the Statuslist here and we need to move them finaly if (thismob.getIsDead() == false) { updateMob(thisclient, ref thismob, mobView); } } // Mob moves outside - should delete it if (mobView.viewCreated == true && !mobIsInCircle && thismob.getDistrict() == thisclient.playerData.getDistrictId()) { // ToDo: delete mob ServerPackets packets = new ServerPackets(); packets.sendDeleteViewPacket(thisclient, mobView.ViewID); packets.sendSystemChatMessage(thisclient, "MobView (" + thismob.getName() + " LVL: " + thismob.getLevel() + " ) with View ID " + mobView.ViewID + " is out of range and is deleted!", "MODAL"); thisclient.viewMan.removeViewByViewId(mobView.ViewID); } } } } } thismob.updateClient = false; } Thread.Sleep(500); } }