public void sendCastAbilityOnEntityId(UInt16 viewId, UInt32 animationId, UInt16 value) { ClientView theView = Store.currentClient.viewMan.getViewById(viewId); Random randomObject = new Random(); ushort randomHealth = (ushort)randomObject.Next(3, 1800); // RSI Health FX "send 02 03 02 00 02 80 80 80 90 ed 00 30 22 0a 00 28 06 00 00;" PacketContent pak = new PacketContent(); if (viewId == 0) { viewId = 2; } pak.addUint16(viewId, 1); UInt32 theGoID = 12; if (theView != null) { theGoID = theView.GoID; } switch (theGoID) { case 12: pak.addByte(0x02); pak.addByte(0x80); pak.addByte(0x80); pak.addByte(0x80); if (viewId == 2) { pak.addByte(0x80); pak.addByte(0xb0); } else { pak.addByte(0x0c); } pak.addUint32(animationId, 1); pak.addUintShort(Store.currentClient.playerData.assignSpawnIdCounter()); break; case 599: // Its more a demo - we "one hit" the mob currently so we must update this lock (WorldSocket.npcs.SyncRoot) { for (int i = 0; i < WorldSocket.npcs.Count; i++) { Mob thismob = (Mob)WorldSocket.npcs[i]; if (theView != null && thismob.getEntityId() == theView.entityId) { thismob.HitEnemyWithDamage(value, animationId); if (thismob.getHealthC() <= 0) { thismob.setIsDead(true); this.SendNpcDies(theView.ViewID, Store.currentClient, thismob); // We got some Exp for it - currently we just make a simple trick to calculate some exp // Just take currentLevel * modifier Random rand = new Random(); UInt32 expModifier = (UInt32)rand.Next(100, 500); UInt32 expGained = thismob.getLevel() * expModifier; // Update EXP new PlayerHandler().IncrementPlayerExp(expGained); thismob.setIsLootable(true); } WorldSocket.npcs[i] = thismob; } } } break; default: pak.addByte(0x02); pak.addByte(0x80); pak.addByte(0x80); pak.addByte(0x80); if (viewId == 2) { pak.addByte(0x80); pak.addByte(0xb0); } else { pak.addByte(0x0c); } pak.addUint32(animationId, 1); pak.addUintShort(Store.currentClient.playerData.assignSpawnIdCounter()); break; } string hex = StringUtils.bytesToString(pak.returnFinalPacket()); Store.currentClient.messageQueue.addObjectMessage(pak.returnFinalPacket(), false); Store.currentClient.FlushQueue(); }
public void loadMobs(string path) { // This is just an example of loading CSV //return dataTable; Output.Write("Loading Hostile Mobs .."); ArrayList goDB = loadCSV(path, ';'); int linecount = 1; foreach (string[] data in goDB) { //Output.WriteLine("Show Colums for Line : " + linecount.ToString() + " GOID: " + data[1].ToString() + " Name " + data[0].ToString()); if (linecount > 1) { UInt64 currentEntityId = WorldSocket.entityIdCounter; WorldSocket.entityIdCounter++; uint rotation = 0; if (data[10].Length > 0) { rotation = uint.Parse(data[10]); } if (data[4].Length > 0 && data[5].Length > 0) { bool error = false; Mob theMob = new Mob(); theMob.setEntityId(currentEntityId); theMob.setDistrict(Convert.ToUInt16(data[0])); theMob.setDistrictName(data[1]); theMob.setName(data[2]); theMob.setLevel(ushort.Parse(data[3])); theMob.setHealthM(UInt16.Parse(data[4])); theMob.setHealthC(UInt16.Parse(data[4])); // As max Health should be the current onload if (UInt16.Parse(data[4]) == 0) { error = true; } theMob.setMobId((ushort)linecount); theMob.setRsiHex(data[6]); if (!isNumberEven(data[6].Length)) { error = true; } theMob.setXPos(double.Parse(data[7])); theMob.setYPos(double.Parse(data[8])); theMob.setZPos(double.Parse(data[9])); theMob.xBase = double.Parse(data[7]); theMob.yBase = double.Parse(data[8]); theMob.zBase = double.Parse(data[9]); theMob.setRotation(rotation); theMob.setIsDead(bool.Parse(data[11])); theMob.setIsLootable(bool.Parse(data[12])); // Init the Mob Update if (!error) { theMob.DoMobUpdate(theMob); WorldSocket.npcs.Add(theMob); WorldSocket.gameServerEntities.Add(theMob); } } } linecount++; } }
public void parseCommand(string 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); ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(Store.currentClient, "Trying to fix!", "BROADCAST"); } } 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); ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(Store.currentClient, "Teleported!", "BROADCAST"); } 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); ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(Store.currentClient, "Rsi changed!", "BROADCAST"); } if (command.Contains("?updatersi")) { int[] current = Store.currentClient.playerData.getRsiValues(); byte[] rsiData = PacketsUtils.getRSIBytes(current); ServerPackets packets = new ServerPackets(); packets.sendAppeareanceUpdate(Store.currentClient, rsiData); } if (command.StartsWith("?spawndatanode")) { ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(Store.currentClient, "Spawn Datanode!", "BROADCAST"); pak.spawnDataNodeView(Store.currentClient); } if (command.StartsWith("?message")) { byte[] theMessage = PacketsUtils.createSystemMessageWithoutRPC(commands[1]); Store.world.sendRPCToAllPlayers(theMessage); } if (command.Contains("?loot")) { UInt32 objectId = UInt32.Parse(commands[1]); ServerPackets packets = new ServerPackets(); packets.sendLootWindowTest(Store.currentClient, objectId); } if (command.Contains("?moa")) { string hexMoa = commands[1]; byte[] moaRSI = StringUtils.hexStringToBytes(hexMoa); Array.Reverse(moaRSI, 0, moaRSI.Length); ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(Store.currentClient, "Changed MOA to hexMoa d!", "BROADCAST"); pak.sendChangeChangeMoaRSI(Store.currentClient, moaRSI); } if (command.Equals("?playanim")) { string animId = commands[1]; if (animId.Length == 4) { ServerPackets pak = new ServerPackets(); pak.sendPlayerAnimation(Store.currentClient, animId); } } if (command.Equals("?playmove")) { string animIdString = commands[1]; // Should just one byte if (animIdString.Length == 2) { byte animId = Byte.Parse(animIdString); ServerPackets pak = new ServerPackets(); pak.sendPlayerMoveAnim(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); 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; Mob theMob = new Mob(); 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); lock (WorldSocket.npcs) { WorldSocket.npcs.Add(theMob); } lock (WorldSocket.gameServerEntities) { WorldSocket.gameServerEntities.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); 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()); #if DEBUG ServerPackets pak = new ServerPackets(); pak.sendSystemChatMessage(Store.currentClient, "Test RPC Header : " + Store.currentClient.playerData.currentTestRPC.ToString(), "MODAL"); #endif 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)); #if DEBUG Output.WriteLine("[CHAT COMMAND PARSER] Error parsing request: " + data); Output.WriteLine("[CHAT COMMAND PARSER] DEBUG: " + e.Message + "\n" + e.StackTrace); #endif } }