public void Handle(User u, InPacket p) { ushort usernameLength = p.ReadUShort(); string username = p.ReadString(usernameLength); ushort passwordLength = p.ReadUShort(); string password = p.ReadString(passwordLength); Console.WriteLine("Login Request: {0}:{1}", username, password); }
public override void Dispatch(InPacket inPacket) { if (inPacket.OperationCode == Program.ServerIP) { ushort status = inPacket.ReadUShort(); ushort status2 = inPacket.ReadUShort(); byte[] ip = inPacket.ReadBytes(4); ushort port = inPacket.ReadUShort(); byte[] leftover = inPacket.ReadLeftoverBytes(); Program.IP = string.Format("{0}.{1}.{2}.{3}", ip[0], ip[1], ip[2], ip[3]); Program.Port = port; using (OutPacket outPacket = new OutPacket(Program.ServerIP)) { outPacket.WriteUShort(status); outPacket.WriteUShort(status2); outPacket.WriteBytes(127, 0, 0, 1); outPacket.WriteUShort(8484); outPacket.WriteBytes(leftover); if (ClientSession.Instance != null) { ClientSession.Instance.Send(outPacket.ToArray()); } } } else { using (OutPacket outPacket = new OutPacket(inPacket)) { if (ClientSession.Instance != null) { ClientSession.Instance.Send(outPacket.ToArray()); } } } }
// Preview Page 2 2019-08-29 11:3 [GMT+7] public static void Char_page2_preview(InPacket lea, Client gc) { int unknown1 = lea.ReadInt(); CharPacket.Char_page2_preview_ack(gc); }
public override void Handle(Server sender, InPacket packetReader) { // TODO Implement something here? }
public Item(InPacket packet) { DisplayId = packet.ReadUInt32(); InventoryType = packet.ReadByte(); packet.ReadUInt32(); // ??? }
public void HandlePacket(InPacket inPacket) { this.Handle(null, true, inPacket); }
public static void MoveItem_Req(InPacket lea, Client gc) { byte SourceType = lea.ReadByte(); byte SourceSlot = lea.ReadByte(); byte TargetType = lea.ReadByte(); byte TargetSlot = lea.ReadByte(); int Quantity = lea.ReadInt(); Item Source = gc.Character.Items.getItem(SourceType, SourceSlot); Item Target = gc.Character.Items.getItem(TargetType, TargetSlot); var chr = gc.Character; if (SourceType != (byte)InventoryType.ItemType.Pet5 && Source.IsLocked == 1 && TargetType == (byte)InventoryType.ItemType.Equip) { Source.IsLocked = 0; } if (TargetType == 0x63 && TargetSlot == 0x63) { if (SourceType == 0xFF && SourceSlot == 0xFF) { return; } Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); foreach (Character All in Map.Characters) { InventoryPacket.CharDropItem(All.Client, Map.ObjectID, Source.ItemID, chr.PlayerX, (short)(chr.PlayerY - 50), Quantity == 0 ? 1 : Quantity); } Map.Item.Add(Map.ObjectID, new Drop(Map.ObjectID, Source.ItemID, Quantity == 0 ? (short)1 : (short)Quantity)); Map.ObjectID++; chr.Items.Remove(SourceType, SourceSlot, Quantity == 0 ? 1 : Quantity); } else { if (chr.Items.getItem(TargetType, TargetSlot) == null) { if (SourceType != 5 && TargetType != 5) { // 普通物品 Source.Type = TargetType; Source.Slot = TargetSlot; if (TargetType == (byte)InventoryType.ItemType.Equip || SourceType == (byte)InventoryType.ItemType.Equip) { UpdateCharacterInventoryStatus(gc, Source, SourceType > 0); } } else { // 寵物 Pet Src = chr.Pets.Pet(SourceType, SourceSlot); Pet Tar = chr.Pets.Pet(TargetType, TargetSlot); if (SourceType == 5) { chr.UseSlot[(byte)InventoryType.ItemType.Pet5] = Src.Slot; } else if (TargetType == 5) { chr.UseSlot[(byte)InventoryType.ItemType.Pet5] = 0xFF; } if (chr.Pets.Pet(TargetType, TargetSlot) == null) { Src.Type = TargetType; Src.Slot = TargetSlot; } else { // 交換位置(swap) chr.Pets.Remove(SourceType, SourceSlot); chr.Pets.Remove(TargetType, TargetSlot); // 類型 byte swapType = Src.Type; Src.Type = Tar.Type; Tar.Type = swapType; // 欄位 byte swapSlot = Src.Slot; Src.Slot = Tar.Slot; Tar.Slot = swapSlot; // chr.Pets.Add(Src); chr.Pets.Add(Tar); } } } else { if ((SourceType == TargetType) && ((TargetType == (byte)InventoryType.ItemType.Spend3) || (TargetType == (byte)InventoryType.ItemType.Other4)) && (Source.ItemID == Target.ItemID)) { // 合併消費物品跟其他物品 if (chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity + Source.Quantity > 100) { short newqu = (short)(Source.Quantity - (100 - chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity)); chr.Items[(InventoryType.ItemType)Source.Type, Source.Slot].Quantity = newqu; chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity = 100; } else { chr.Items.Remove(SourceType, SourceSlot); chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity += Source.Quantity; } } else { // 交換位置(swap) chr.Items.Remove(SourceType, SourceSlot); chr.Items.Remove(TargetType, TargetSlot); // 類型 byte swapType = Source.Type; Source.Type = Target.Type; Target.Type = swapType; // 欄位 byte swapSlot = Source.Slot; Source.Slot = Target.Slot; Target.Slot = swapSlot; // chr.Items.Add(Source); chr.Items.Add(Target); } if (SourceType == (byte)InventoryType.ItemType.Equip && TargetType == (byte)InventoryType.ItemType.Equip1) { UpdateCharacterInventoryStatus(gc, Source, false); UpdateCharacterInventoryStatus(gc, Target, true); } else if (SourceType == (byte)InventoryType.ItemType.Equip || TargetType == (byte)InventoryType.ItemType.Equip) { UpdateCharacterInventoryStatus(gc, Target, false); UpdateCharacterInventoryStatus(gc, Source, true); } } } UpdateInventory(gc, SourceType, TargetType); }
public static void PickupItem(InPacket lea, Client gc) { int OriginalID = lea.ReadInt(); int ItemID = lea.ReadInt(); lea.ReadInt(); var chr = gc.Character; Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); // 撿取靈魂 if (ItemID >= 9900001 && ItemID <= 9900004) { if (Map.getDropByOriginalID(OriginalID) == null) { return; } switch (ItemID) { case 9900001: // Blue chr.Mp += (short)(chr.MaxMp * 0.2); if (chr.Mp > chr.MaxMp) { chr.Mp = chr.MaxMp; } break; case 9900002: // Green chr.Mp += (short)(chr.MaxMp * 0.4); if (chr.Mp > chr.MaxMp) { chr.Mp = chr.MaxMp; } break; case 9900003: // Red int rnd = Randomizer.Next(3, 7); chr.Fury += (short)(chr.MaxFury / 100 * rnd); if (chr.Fury > chr.MaxFury) { chr.Fury = chr.MaxFury; } break; case 9900004: // Purple if (chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal] != null) { chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal].Spirit++; InventoryPacket.getInvenEquip(gc); } break; } StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } return; } // 撿取錢 if (ItemID >= 9800001 && ItemID <= 9800005) { if (Map.getDropByOriginalID(OriginalID) == null) { return; } chr.Money += Map.getDropByOriginalID(OriginalID).Quantity; InventoryPacket.getInvenMoney(gc, chr.Money, Map.getDropByOriginalID(OriginalID).Quantity); foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } return; } if (!Map.Item.ContainsKey(OriginalID)) { return; } byte Type = InventoryType.getItemType(ItemID); Item finditem = null; foreach (Item it in gc.Character.Items) { if (it.ItemID == ItemID) { finditem = it; } } if (((Type == (byte)InventoryType.ItemType.Spend3) || (Type == (byte)InventoryType.ItemType.Other4)) && (finditem != null) && (finditem.Quantity + Map.getDropByOriginalID(OriginalID).Quantity) <= 100) { // 合併消費物品跟其他物品 chr.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity += Map.getDropByOriginalID(OriginalID).Quantity; } else { byte Slot = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type); Item oItem = new Item(ItemID, Type, Slot, Map.getDropByOriginalID(OriginalID).Quantity); chr.Items.Add(oItem); } foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } Map.Item.Remove(OriginalID); UpdateInventory(gc, Type); }
private void OnDataReceived(IAsyncResult iAr) { try { int bytesReceived = socket.EndReceive(iAr); if (bytesReceived > 0) { byte[] packetBuffer = new byte[bytesReceived]; Buffer.BlockCopy(buffer, 0, packetBuffer, 0, packetBuffer.Length); // Decrypt the bytes with the xOrKey. for (int i = 0; i < bytesReceived; i++) { packetBuffer[i] ^= Core.Constants.xOrKeyReceive; } int oldLength = cacheBuffer.Length; Array.Resize(ref cacheBuffer, oldLength + bytesReceived); Array.Copy(packetBuffer, 0, cacheBuffer, oldLength, packetBuffer.Length); int startIndex = 0; // Determs whre the bytes should split for (int i = 0; i < cacheBuffer.Length; i++) { // loop trough our cached buffer. if (cacheBuffer[i] == 0x0A) { // Found a complete packet byte[] newPacket = new byte[i - startIndex]; // determ the new packet size. for (int j = 0; j < (i - startIndex); j++) { newPacket[j] = cacheBuffer[startIndex + j]; // copy the buffer to the buffer of the new packet. } // Handle the packet instantly. InPacket inPacket = new InPacket(newPacket); if (inPacket.Id > 0) { PacketHandler <User> pHandler = NetworkTable.Instance.FindExternal(inPacket); if (pHandler != null) { try { pHandler.Handle(this, inPacket); } catch { /*Disconnect();*/ } } else { Console.WriteLine("UNKNOWN PACKET :: " + newPacket); } } startIndex = i + 1; } } if (startIndex > 0) { byte[] fullCopy = cacheBuffer; Array.Resize(ref cacheBuffer, (cacheBuffer.Length - startIndex)); for (int i = 0; i < (cacheBuffer.Length - startIndex); i++) { cacheBuffer[i] = fullCopy[startIndex + i]; } fullCopy = null; } socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); } else { Disconnect(); } } catch { Disconnect(); } }
public static void TradeConfirm(InPacket lea, Client c) { var chr = c.Character; int j = 0; int k = 0; int m = 0; int l = 0; try { // 交易成功 // Item // 個人接收 foreach (Item Item in chr.Trader.Trade.Item) { byte Type = Item.Type; byte Slot = chr.Items.GetNextFreeSlot((InventoryType.ItemType)Type); chr.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.TargetQuantity[m], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, Slot)); InventoryHandler.UpdateInventory(c, Item.Type); m++; } // 對方接收 foreach (Item Item in chr.Trade.Item) { byte Type = Item.Type; byte Slot = chr.Trader.Items.GetNextFreeSlot((InventoryType.ItemType)Type); chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trade.TargetQuantity[l], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, Slot)); InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type); l++; } // Money // 個人 chr.Money += chr.Trader.Trade.Money; // 對方 chr.Trader.Money += chr.Trade.Money; // 個人 if (chr.Trader.Trade.Money > 0) { InventoryPacket.getInvenMoney(c, chr.Money, chr.Trader.Trade.Money); } // 對方 if (chr.Trade.Money > 0) { InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trade.Money); } } catch { // 交易失敗 // Item // 個人 foreach (Item Item in chr.Trade.Item) { Item i = chr.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trade.SourceQuantity[j] + chr.Trade.TargetQuantity[j] <= 100) { chr.Items.Remove(Item.Type, Item.Slot); chr.Items.Add(new Item(Item.ItemID, chr.Trade.SourceQuantity[j], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Items.Add(Item); } } else { chr.Items.Add(Item); } InventoryHandler.UpdateInventory(c, Item.Type); j++; } // 對方 foreach (Item Item in chr.Trader.Trade.Item) { Item i = chr.Trader.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trader.Trade.SourceQuantity[k] + chr.Trader.Trade.TargetQuantity[k] <= 100) { chr.Trader.Items.Remove(Item.Type, Item.Slot); chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.SourceQuantity[k], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Trader.Items.Add(Item); } } else { chr.Trader.Items.Add(Item); } InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type); k++; } // Money // 個人 chr.Money += chr.Trade.Money; // 對方 chr.Trader.Money += chr.Trader.Trade.Money; // 個人 if (chr.Trade.Money > 0) { InventoryPacket.getInvenMoney(c, chr.Money, chr.Trade.Money); } // 對方 if (chr.Trader.Trade.Money > 0) { InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trader.Trade.Money); } TradePacket.TradeFail(c); TradePacket.TradeFail(chr.Trader.Client); return; } TradePacket.TradeSuccessful(c); TradePacket.TradeSuccessful(chr.Trader.Client); }
private void ReadPacket() { if (BytesToSkip > 0) { int skipped = Math.Min(BytesToSkip, (int)Memory.Length); Memory.Position += skipped; BytesToSkip -= skipped; } while (Memory.Length - Memory.Position > 2) { // Commands are always the first two bytes // Followed by either the packet data in case the packet // has its size fixed, or the packet length var tmp = new byte[2]; Memory.Read(tmp, 0, 2); ushort cmd = BitConverter.ToUInt16(tmp, 0); if (!RegisteredPackets.ContainsKey(cmd)) { // We gotta break because we don't know the size of the packet Debug.LogWarning($"Received Unknown Command: {string.Format("0x{0:x4}", cmd)}\nProbably: {(PacketHeader)cmd}"); Memory.Position -= 2; break; } else { int size = RegisteredPackets[cmd].Size; bool isFixed = true; if (size <= 0) { isFixed = false; // Do we have more than two bytes left? if (Memory.Length - Memory.Position > 2) { Memory.Read(tmp, 0, 2); size = BitConverter.ToUInt16(tmp, 0); } else { Memory.Position -= 4; break; } } // Read skipping command and length byte[] data = new byte[size]; Memory.Read(data, 0, size - (isFixed ? 2 : 4)); ConstructorInfo ci = RegisteredPackets[cmd].Type.GetConstructor(new Type[] { }); InPacket packet = (InPacket)ci.Invoke(null); using (var br = new BinaryReader(data)) { var shouldContinue = packet.Read(br); ThreadManager.ExecuteOnMainThread(() => { if (PacketHooks.ContainsKey(cmd)) { PacketHooks[cmd].DynamicInvoke(cmd, size, packet); } else { Debug.LogWarning($"Received Unhadled Command {(PacketHeader)cmd}"); } PacketReceived?.Invoke(cmd, size, packet); }); if (!shouldContinue) { break; } } } } if (Memory.Length - Memory.Position > 0) { MemoryStream ms = new MemoryStream(); ms.Write(Memory.GetBuffer(), (int)Memory.Position, (int)Memory.Length - (int)Memory.Position); Memory.Dispose(); Memory = ms; } }
private void OnDataReceived(IAsyncResult iAr) { try { int bytesReceived = socket.EndReceive(iAr); if (bytesReceived > 0) { byte[] packetBuffer = new byte[bytesReceived]; // Decrypt the bytes with the xOrKey. for (int i = 0; i < bytesReceived; i++) { packetBuffer[i] = (byte)(this.buffer[i] ^ Core.Constants.xOrKeyReceive); } int oldLength = cacheBuffer.Length; Array.Resize(ref cacheBuffer, oldLength + bytesReceived); Array.Copy(packetBuffer, 0, cacheBuffer, oldLength, packetBuffer.Length); int startIndex = 0; // Determs where the bytes should split for (int i = 0; i < cacheBuffer.Length; i++) { // loop trough our cached buffer. if (cacheBuffer[i] == 0x0A) { // Found a complete packet byte[] newPacket = new byte[i - startIndex]; // determ the new packet size. for (int j = 0; j < (i - startIndex); j++) { newPacket[j] = cacheBuffer[startIndex + j]; // copy the buffer to the buffer of the new packet. } packetCount++; // Instant handeling InPacket inPacket = new InPacket(newPacket); if (inPacket != null) { if (inPacket.Id > 0) { PacketHandler <User> pHandler = NetworkTable.Instance.FindExternal(inPacket); if (pHandler != null) { try { pHandler.Handle(this, inPacket); } catch (Exception e) { Log.Instance.WriteError(e.ToString()); } } } } // Increase start index. startIndex = i + 1; } } if (startIndex > 0) { byte[] fullCopy = cacheBuffer; Array.Resize(ref cacheBuffer, (cacheBuffer.Length - startIndex)); for (int i = 0; i < (cacheBuffer.Length - startIndex); i++) { cacheBuffer[i] = fullCopy[startIndex + i]; } fullCopy = null; } socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); } else { Disconnect(); } } catch { Disconnect(); } }
public void PushIn(ByteBuffer receiveIn) { InPacket inPacket = ParseIn(receiveIn); this.PushIn(inPacket); }
public void PushIn(InPacket inPacket) { client.PacketManager.AddIncomingPacket(inPacket, ID); }
public OutPacket RetrieveSent(InPacket inPacket) { return(helper.RetriveSent(inPacket)); }
// Holy Grail ftw public static void useItem(Character chr, Item item, byte usingIndex, InPacket p) { MartialClient c = chr.getAccount().mClient; ItemData itemData = ItemDataCache.Instance.getItemData(item.getItemID()); Boolean shouldDecrease = false; string determined = null; int determiner = 0; if (itemData.getIsStackable()) { shouldDecrease = true; } else { if (itemData.getTimeToExpire() == 0) { shouldDecrease = true; } } // well.. we don't care if it's handled by server.. let's just remove them & f**k haterz! qq if (shouldDecrease) { if (!chr.getInventory().decrementItem(usingIndex)) { Console.WriteLine("something went wrong with decrement.."); return; } } switch (itemData.getCategory()) { case 1001: // healingz { if (itemData.getHealHP() > 0 || itemData.getHealMana() > 0 || itemData.getHealStamina() > 0) { StaticPackets.releaseHealPacket(chr, (int)(chr.getCurHP() + itemData.getHealHP()), (short)(chr.getCurMP() + itemData.getHealMana()), (short)(chr.getCurSP() + itemData.getHealStamina())); } break; } case 1002: // skillz o.o { StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "If you'd like to learn any skill, go to skills list and press CTRL+LMB."); break; } case 1003: // teleport { if (chr.getMap() == itemData.getTeleportMap() || chr.getMap() != itemData.getTeleportMap() && itemData.getSpecialEffect() != 0) { CharacterFunctions.setPlayerPosition(chr, itemData.getTeleportX(), itemData.getTeleportY(), (short)itemData.getTeleportMap()); } break; } case 1007: // reset skills { chr.getSkills().resetAll(); chr.getSkillBar().getSkillBar().Clear(); break; } case 1011: // effect potions { chr.setEffect((byte)itemData.getSpecialEffect()); break; } case 1012: // tae potion { break; } case 1013: // faction change { if (chr.getFaction() == 0) { return; } chr.setFaction(chr.getFaction() == 1 ? (byte)2 : (byte)1); break; } case 1015: // chuk amulet { determiner = BitConverter.ToInt32(p.ReadBytes(4), 0); if (determiner == 0) { return; } ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner); if (determinedItem == null || determinedItem.getCategory() != 1003 || (determiner < 212100146 && determiner > 212100164 && determiner != 212100185 && determiner != 212100187)) { Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ"); return; } CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap()); break; } case 1016: // karma amulet { chr.setKarmaMessagingTimes((short)(chr.getKarmaMessagingTimes() + 1)); break; } case 1020: // name changer { p.Skip(4); string charName = MiscFunctions.obscureString(p.ReadString(16)); if (charName.Length < 3 || Regex.Replace(charName, "[^A-Za-z0-9]+", "") != charName || MySQLTool.NameTaken(charName)) { StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Wrong input " + charName + "."); return; } chr.setName(charName); determined = charName; CharacterFunctions.refreshCharacterForTheWorld(chr); break; } case 1021: // face changer { chr.setFace((byte)itemData.getSpecialEffect()); break; } case 1024: { // yy..? break; } case 1031: // red castle { determiner = BitConverter.ToInt32(p.ReadBytes(4), 0); if (determiner == 0) { return; } ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner); if (determinedItem == null || determinedItem.getCategory() != 56 || ((determiner < 273001255 && determiner > 273001257) && determiner != 283000472 && determiner != 283000543 && determiner != 283000575 && determiner != 283000614 && determiner != 283000934 && determiner != 283001078 && determiner != 283001373 && determiner != 283001376)) { Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ"); return; } CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap()); break; } default: { StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Feature not implemented yet"); return; } } OutPacket op = new OutPacket(52); op.WriteInt(52); op.WriteShort(0x04); op.WriteShort(0x05); op.WriteInt(140328705); op.WriteInt(chr.getuID()); op.WriteShort(0x01); op.WriteByte(0x01); op.WriteByte(usingIndex); op.WriteInt(item.getQuantity()); op.WriteInt(793149441); op.WriteInt(/*determiner > 0 ? determiner : 0*/); op.WritePaddedString(determined, 17); op.WriteByte(0x90); op.WriteByte(0xd2); op.WriteByte(0x2a); c.WriteRawPacket(op.ToArray()); OutPacket ops = new OutPacket(40); ops.WriteInt(40); ops.WriteShort(0x05); ops.WriteShort(0x05); ops.WriteInt(779458561); ops.WriteInt(chr.getuID()); ops.WriteInt(item.getItemID()); ops.WritePaddedString(determined, 17); ops.WriteByte(0x9e); ops.WriteByte(0x0f); ops.WriteByte(0xbf); WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), ops.ToArray()); }
public abstract void Decode(InPacket packet);
public static void TradeEventItem(InPacket lea, Client c) { lea.ReadShort(); // 活動ID ? byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); int Quantity = lea.ReadInt(); var chr = c.Character; Item Item = null; foreach (Item im in chr.Items.getItems()) { if (im.Type == 4 && im.ItemID == 8990049 && im.Quantity >= Quantity) { Item = im; break; } } if (Item == null && Quantity <= 100) { return; } switch (Quantity) { case 5: chr.Rank += 1; StatusPacket.UpdateFame(c, 1); break; case 8: chr.Rank += 2; StatusPacket.UpdateFame(c, 2); break; case 12: chr.Rank += 3; StatusPacket.UpdateFame(c, 3); break; case 20: chr.Items.Add(new Item(8510071, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510071); break; case 30: chr.Items.Add(new Item(8510081, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510081); break; case 40: chr.Items.Add(new Item(8510091, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510091); break; case 50: chr.Items.Add(new Item(8510101, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510101); break; case 60: chr.Money += 2000000; InventoryPacket.getInvenMoney(c, chr.Money, 2000000); break; case 100: chr.Money += 4000000; InventoryPacket.getInvenMoney(c, chr.Money, 4000000); break; case 200: chr.Money += 8200000; InventoryPacket.getInvenMoney(c, chr.Money, 8200000); break; case 300: chr.Money += 13000000; InventoryPacket.getInvenMoney(c, chr.Money, 13000000); break; case 500: chr.Money += 24000000; InventoryPacket.getInvenMoney(c, chr.Money, 24000000); break; } if (Quantity > 100) { Item Target1 = null; Item Target2 = null; Item Target3 = null; Item Target4 = null; Item Target5 = null; int i = 0; foreach (Item Target in chr.Items.getItems()) { if (i == 0 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target1 = Target; i++; } else if (i == 1 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target2 = Target; i++; } else if (i == 2 && (Quantity == 300 || Quantity == 500) && Target.ItemID == 8990049 && Target.Quantity == 100) { Target3 = Target; i++; } else if (i == 3 && Quantity == 500 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target4 = Target; i++; } else if (i == 4 && Quantity == 500 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target5 = Target; i++; } else if (i == 5) { break; } } if (Target1 != null) { chr.Items.Remove(Target1.Type, Target1.Slot, 100); } if (Target2 != null) { chr.Items.Remove(Target2.Type, Target2.Slot, 100); } if (Target3 != null) { chr.Items.Remove(Target3.Type, Target3.Slot, 100); } if (Target4 != null) { chr.Items.Remove(Target4.Type, Target4.Slot, 100); } if (Target5 != null) { chr.Items.Remove(Target5.Type, Target5.Slot, 100); } } else { chr.Items.Remove(Type, Slot, Quantity); } InventoryHandler.UpdateInventory(c, Type); }
public static void DeclareWar(MartialClient c, InPacket p) { return; }
protected void HandleTransferPending(InPacket packet) { Player.ResetPosition(); var newMap = packet.ReadUInt32(); }
public static void CreateGuild(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked guild.Refresh with null of activeCharacter"); c.Close(); return; } Character chr = c.getAccount().activeCharacter; Guild guild = chr.getGuild(); byte managementType = p.ReadByte(); // 0 - disband; 1 - create; 2 - donate; 3 - hat byte managementArg = p.ReadByte(); // 1 - bang, 2 - mun, 3 - pa, 4 - nohing, 5 - dan, 6 - gak, 7 - gyo, 8 - gung string managementName = MiscFunctions.obscureString(p.ReadString(18)); switch (managementType) { case 0: { if (guild == null) { Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild disband with char that ain't in guild"); c.Close(); return; } guild.Delete(); WMap.Instance.removeGuild(guild); foreach (GuildMember i in guild.guildMembers) { Character tmp = i.getOnlineCharacter(); tmp.getAccount().mClient.WriteRawPacket(GuildPackets.quitGuildForInternal(tmp)); WMap.Instance.getGrid(tmp.getMap()).sendTo3x3Area(tmp, tmp.getArea(), GuildPackets.quitGuildForExternals(tmp)); tmp.setGuild(null); i.setOnlineCharacter(null); } return; } case 1: { if (guild != null) { Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild create with char that is in guild"); c.Close(); return; } Guild newGuild = new Guild(managementArg, managementName); c.WriteRawPacket(GuildPackets.createGuildResponse(chr, managementType, managementArg, managementName)); WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), GuildPackets.extCharGuild(chr)); return; } case 2: { if (guild == null) { Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild donate with char that ain't in guild"); c.Close(); return; } return; } case 3: { if (guild == null) { Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild hat change with char that ain't in guild"); c.Close(); return; } guild.guildHat = managementArg; WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), GuildPackets.extCharGuild(chr)); c.WriteRawPacket(GuildPackets.refreshGuild(chr)); return; } } return; }
public static void UseSpend_Req(InPacket lea, Client gc) { var chr = gc.Character; byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); Item Item = chr.Items.getItem(Type, Slot); Map map = MapFactory.GetMap(chr.MapX, chr.MapY); var use = ItemFactory.useData[Item.ItemID]; // 使用回復HP 跟 MP 的物品 switch (Item.ItemID) { case 8841006: // 全部還原本 int Recover = 0; Recover = Recover + (chr.Str - 3); Recover = Recover + (chr.Dex - 3); Recover = Recover + (chr.Vit - 3); Recover = Recover + (chr.Int - 3); chr.Str = 3; chr.Dex = 3; chr.Vit = 3; chr.Int = 3; chr.AbilityBonus += (short)Recover; StatusPacket.getStatusInfo(gc); break; case 8850011: // 回城符 switch (chr.MapX) { case 1: case 2: case 3: case 4: case 5: case 6: case 22: case 23: chr.MapX = 1; chr.MapY = 1; break; case 7: case 8: case 9: chr.MapX = 16; chr.MapY = 1; break; case 10: case 11: case 20: chr.MapX = 10; chr.MapY = 1; break; case 12: case 13: chr.MapX = 12; chr.MapY = 1; break; case 14: case 15: case 17: case 18: case 19: case 21: chr.MapX = 15; chr.MapY = 1; break; case 16: chr.MapX = 16; chr.MapY = 1; break; case 24: case 25: case 26: case 31: case 32: case 33: chr.MapX = 25; chr.MapY = 1; break; case 27: case 28: chr.MapX = 27; chr.MapY = 1; break; default: chr.MapX = 1; chr.MapY = 1; break; } chr.PlayerX = 0; chr.PlayerY = 0; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850021: // 清陰符 chr.MapX = 1; chr.MapY = 2; chr.PlayerX = 2955; chr.PlayerY = 1116; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850031: // 龍林符(龍林城) chr.MapX = 15; chr.MapY = 2; chr.PlayerX = 3600; chr.PlayerY = 1041; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850041: // 冥珠符 chr.MapX = 10; chr.MapY = 3; chr.PlayerX = 1645; chr.PlayerY = 899; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850051: // 古樂符 chr.MapX = 25; chr.MapY = 1; chr.PlayerX = 4237; chr.PlayerY = 1230; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850061: // 無名符 chr.MapX = 16; chr.MapY = 1; chr.PlayerX = 2005; chr.PlayerY = 1101; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850071: // 龍林符(龍林客棧) chr.MapX = 12; chr.MapY = 1; chr.PlayerX = 1040; chr.PlayerY = 782; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8890011: // 蠟燭 case 8890021: // 火把 InventoryPacket.UseSpendStart(gc, chr, chr.PlayerX, chr.PlayerY, Item.ItemID, (byte)InventoryType.ItemType.Spend3, Slot); break; case 8899017: // 逮巴符 chr.MapX = 27; chr.MapY = 1; chr.PlayerX = 2070; chr.PlayerY = 1330; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; default: switch (use.Type) { case 0: // 恢復鬼力 if ((chr.MaxMp > chr.Mp + use.Recover)) { chr.Mp += (short)use.Recover; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxMp - chr.Mp < use.Recover) { chr.Mp = chr.MaxMp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 1: // 恢復鬼力(%) if ((chr.MaxMp > chr.Mp + chr.MaxMp * use.Recover / 100)) { chr.Mp += (short)(chr.MaxMp * use.Recover / 100); StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxMp - chr.Mp < chr.MaxMp * use.Recover / 100) { chr.Mp = chr.MaxMp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 2: // 恢復體力 if ((chr.MaxHp > chr.Hp + use.Recover)) { chr.Hp += (short)use.Recover; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxHp - chr.Hp < use.Recover) { chr.Hp = chr.MaxHp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 3: // 恢復體力(%) if ((chr.MaxHp > chr.Hp + chr.MaxHp * use.Recover / 100)) { chr.Hp += (short)(chr.MaxHp * use.Recover / 100); StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxHp - chr.Hp < chr.MaxHp * use.Recover / 100) { chr.Hp = chr.MaxHp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; default: break; } break; } chr.Items.Remove(Type, Slot, 1); UpdateInventory(gc, Type); }
public override void OnPacket(InPacket iPacket) { try { iPacket.Decrypt(CRYPT_KEY); GameOpcodes uOpcode = (GameOpcodes)iPacket.ReadUShort(); int uSize = iPacket.ReadInt(); bool isCompress = iPacket.ReadBool(); int cSize = 0; if (isCompress == true) { cSize = iPacket.ReadInt(); LogFactory.GetLog("Main").LogWarning("[{0}] pacote comprimido chegada {1} ({2})", Login, (int)uOpcode, uOpcode.ToString()); } else { LogFactory.GetLog("Main").LogInfo("[{0}] de chegada de pacotes {1} ({2})", Login, (int)uOpcode, uOpcode.ToString()); } LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray()); switch (uOpcode) { case GameOpcodes.EVENT_HEART_BIT_NOT: // 0 OnHeartBeatNot(); break; case GameOpcodes.EVENT_CHANGE_CHARACTER_INFO_REQ: //1618 InfoChars.ChangeCharInfo(this); break; case GameOpcodes.EVENT_VERIFY_ACCOUNT_REQ: // 2 MyUser.OnLogin(this, iPacket); break; case GameOpcodes.EVENT_SET_CURRENT_CHARACTER_REQ: MyCommon.SetCurretChar(this, iPacket); break; case GameOpcodes.EVENT_GET_FULL_SP_INFO_REQ: // 423 0x1A7 MyCommon.OnGetFullSPInfo(this, iPacket); break; case GameOpcodes.EVENT_PET_COSTUM_LIST_REQ: // 517 0x205 MyCommon.OnPetCostumList(this, iPacket); break; case GameOpcodes.EVENT_INVEN_BUFF_ITEM_LIST_REQ: // 1226 0x04CA MyCommon.OnInvenBuffItemList(this, iPacket); break; case GameOpcodes.EVENT_DEPOT_INFO_REQ: // 1340 0x053C MyCommon.OnDepotInfo(this, iPacket); break; case GameOpcodes.EVENT_STAT_CLIENT_INFO: // 226 0x00E2 MyCommon.OnStatClientInfo(this, iPacket); break; case GameOpcodes.EVENT_COST_RATE_FOR_GAMBLE_BUY_REQ: // 871 0x0367 MyCommon.OnCostRateForGambleBuy(this); break; case GameOpcodes.EVENT_REGISTER_NICKNAME_REQ: // 134 0x0086 MyUser.OnRegisterNick(this, iPacket); break; case GameOpcodes.EVENT_SET_IDLE_STATE_REQ: // 835 0x0343 MyCommon.OnSetIDLE(this, iPacket); break; case GameOpcodes.EVENT_CHAR_SELECT_JOIN_REQ: // 1557 0x0613 MyUser.OnCharSelectJoin(this, iPacket); break; case GameOpcodes.EVENT_CHOICE_BOX_LIST_REQ: // 1012 0x03F4 MyCommon.OnChoiceBoxList(this); break; case GameOpcodes.EVENT_EXP_POTION_LIST_REQ: // 1338 0x053A MyCommon.OnExpPotionList(this); break; case GameOpcodes.EVENT_AGIT_STORE_CATALOG_REQ: // 1114 0x054A MyCommon.OnAgitStoreCatalog(this); break; case GameOpcodes.EVENT_AGIT_STORE_MATERIAL_REQ: // 1116 0x045C MyCommon.OnAgitStoreMaterial(this); break; case GameOpcodes.EVENT_AGIT_MAP_CATALOGUE_REQ: // 1106 0x0452 MyCommon.OnAgitMapCatalogue(this); break; case GameOpcodes.EVENT_FAIRY_TREE_LV_TABLE_REQ: // 1184 0x04A0 MyCommon.OnFaityTreeLvTable(this); break; case GameOpcodes.EVENT_INVITE_DENY_NOT: // 348 0x015C InviteDeny = iPacket.ReadBool(); break; case GameOpcodes.EVENT_GET_USER_DONATION_INFO_REQ: // 523 0x020B MyCommon.OnGetUserDonationInfo(this); break; case GameOpcodes.EVENT_RECOMMEND_FULL_INFO_REQ: // 567 0x0237 MyCommon.OnRecommentUser(this); break; case GameOpcodes.EVENT_USER_BINGO_DATA_REQ: // 654 0x28E MyCommon.OnUserBingoData(this); break; case GameOpcodes.EVENT_CHANNEL_LIST_REQ: // 14 0x0E MyCommon.OnChannelList(this); break; case GameOpcodes.EVENT_DONATION_INFO_REQ: // 525 0x020D MyCommon.OnDonationInfo(this); break; case GameOpcodes.EVENT_ENTER_CHANNEL_REQ: // 12 0x0C MyUser.OnEnterChannel(this, iPacket); break; case GameOpcodes.EVENT_LEAVE_CHANNEL_NOT: // 26 MyUser.OnLeaveChannel(this); break; case GameOpcodes.EVENT_CREATE_ROOM_REQ: MyUser.OnCreateRoom(this, iPacket); break; case GameOpcodes.EVENT_CHANGE_ROOM_INFO_REQ: CurrentRoom.OnChangeRoomInfo(this, iPacket); break; case GameOpcodes.EVENT_CHANGE_ROOMUSER_INFO_REQ: CurrentRoom.OnChangeUserInfo(this, iPacket); break; case GameOpcodes.EVENT_LEAVE_ROOM_REQ: CurrentRoom.OnLeaveRoom(this, iPacket); break; case GameOpcodes.EVENT_ROOM_LIST_REQ: CurrentChannel.OnRoomList(this, iPacket); break; case GameOpcodes.EVENT_JOIN_ROOM_REQ: CurrentChannel.OnJoinRoom(this, iPacket); break; case GameOpcodes.EVENT_START_GAME_REQ: CurrentRoom.StartGame(this, iPacket); break; case GameOpcodes.EVENT_RELAY_LOADING_STATE: CurrentRoom.OnLoadState(this, iPacket); break; case GameOpcodes.EVENT_LOAD_COMPLETE_NOT: //MyUser.LoadComplete(this, iPacket); CurrentRoom.OnLoadComplete(this, iPacket); break; case GameOpcodes.EVENT_STAGE_LOAD_COMPLETE_NOT: //MyUser.StageLoadComplete(this, iPacket); CurrentRoom.OnStageLoadComplete(this, iPacket); break; case GameOpcodes.EVENT_ROOM_MEMBER_PING_INFO_REQ: CurrentRoom.OnPingInfo(this, iPacket); break; case GameOpcodes.EVENT_GET_ROOMUSER_IDLE_STATE_REQ: CurrentRoom.OnIdleInfo(this, iPacket); break; case GameOpcodes.EVENT_END_GAME_REQ: CurrentRoom.OnGameEnd(this, iPacket); break; case GameOpcodes.EVENT_CHAT_REQ: CurrentChannel.OnChat(this, iPacket); break; case GameOpcodes.EVENT_LEAVE_GAME_REQ: CurrentRoom.OnLeaveGame(this, iPacket); break; case GameOpcodes.EVENT_EQUIP_ITEM_REQ: MyCharacter.OnEquipItem(this, iPacket); break; case GameOpcodes.EVENT_CHANGE_LOOK_EQUIP_REQ: MyCharacter.OnChangeEquipInRoom(this, iPacket); break; case GameOpcodes.EVENT_SET_PRESS_STATE_REQ: CurrentRoom.OnSetPressState(this, iPacket); break; case GameOpcodes.EVENT_SKILL_TRAINING_REQ: MyCharacter.OnTrainSkill(this, iPacket); break; case GameOpcodes.EVENT_SET_SKILL_REQ: MyCharacter.OnSetSkill(this, iPacket); break; case GameOpcodes.DB_EVENT_SYSTEM_GUIDE_COMPLETE_INFO_REQ: MyCommon.SendGuideCompleteInfo(this); break; case GameOpcodes.EVENT_CASHBACK_EXTRA_RATIO_INFO_REQ: MyShop.CashRatio(this); break; case GameOpcodes.EVENT_PACKAGE_INFO_REQ: MyShop.packageInfo(this); break; case GameOpcodes.EVENT_PACKAGE_INFO_DETAIL_REQ: MyShop.packageInfoDetail(this, iPacket); break; default: { LogFactory.GetLog("Main").LogWarning("pacote indefinido foi recebido. Opcode: {0}({1})", (int)uOpcode, uOpcode.ToString()); LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray()); break; } } } catch (Exception e) { LogFactory.GetLog("Main").LogFatal(e); Close(); } }
public static void OpenShop_Req(InPacket lea, Client c) { int Slots = 6; PlayerShopPacket.OpenShop(c, Slots); }
public static void WarpToMapAuth_Req(InPacket lea, Client gc) { var chr = gc.Character; short MapX = lea.ReadShort(); short MapY = lea.ReadShort(); short PositionX = lea.ReadShort(); short PositionY = lea.ReadShort(); bool IsAvailableMap = true; if (chr.IsAlive == false) { StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); chr.IsAlive = true; switch (MapX) { case 1: case 2: case 3: case 4: case 5: case 6: case 22: case 23: MapX = 1; MapY = 1; break; case 7: case 8: case 9: MapX = 16; MapY = 1; break; case 10: case 11: case 20: MapX = 10; if ((chr.MapX == 10 && chr.MapY == 60) || (chr.MapX == 10 && chr.MapY == 61) || (chr.MapX == 10 && chr.MapY == 62) || (chr.MapX == 10 && chr.MapY == 63) || (chr.MapX == 10 && chr.MapY == 64)) { MapY = 60; } else { MapY = 1; } break; case 12: case 13: MapX = 12; MapY = 1; break; case 14: case 15: case 17: case 18: case 19: case 21: MapX = 15; MapY = 1; break; case 16: MapX = 16; MapY = 1; break; case 24: case 25: case 26: case 31: case 32: case 33: MapX = 25; MapY = 1; break; case 27: case 28: MapX = 27; MapY = 1; break; default: MapX = 1; MapY = 1; break; } PositionX = 0; PositionY = 0; } MapPacket.warpToMapAuth(gc, IsAvailableMap, MapX, MapY, PositionX, PositionY); }
private static void OnUDPPacketReceived(InPacket inPacket, IPEndPoint endpoint) { }
public static void WarpToMap_Req(InPacket lea, Client gc) { int CharacterID = lea.ReadInt(); short MapX = lea.ReadShort(); short MapY = lea.ReadShort(); short PositionX = lea.ReadShort(); short PositionY = lea.ReadShort(); var chr = gc.Character; chr.MapX = MapX; chr.MapY = MapY; chr.PlayerX = PositionX; chr.PlayerY = PositionY; if (MapX == 77 && MapY == 1) { CashShopPacket.CashShopList1(gc); // 人物 CashShopPacket.CashShopList2(gc); // 裝備 CashShopPacket.CashShopList3(gc); // 能力 CashShopPacket.CashShopList4(gc); // 靈物 CashShopPacket.CashShopList5(gc); // 寶牌 CashShopPacket.CashShopList6(gc); CashShopPacket.CashShopList7(gc); // 紅利積點 CashShopPacket.CashShopList8(gc); CashShopPacket.CashShopList9(gc); CashShopPacket.MgameCash(gc); CashShopPacket.GuiHonCash(gc); // 接收禮物 List <int> Gifts = new List <int>(); foreach (dynamic datum in new Datums("Gifts").Populate()) { if (chr.Name.Equals(datum.name) && datum.receive == 0) { Gifts.Add(datum.itemID); datum.receive = 1; datum.Update("id = '{0}'", datum.id); } } foreach (int ItemID in Gifts) { chr.Items.Add(new Item(ItemID, true, 0, -1, (byte)InventoryType.ItemType.Cash, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Cash))); chr.Items.Save(); } InventoryPacket.getInvenCash(gc); MapPacket.warpToMap(gc, chr, CharacterID, MapX, MapY, PositionX, PositionY); return; } Map Map = MapFactory.GetMap(MapX, MapY); MapPacket.warpToMap(gc, chr, CharacterID, MapX, MapY, PositionX, PositionY); if (Map.GetMapCharactersTotal() > 0) { foreach (Character All in Map.Characters) { MapPacket.warpToMap(All.Client, chr, CharacterID, MapX, MapY, PositionX, PositionY); } MapPacket.createUser(gc, Map); } Map.Characters.Add(chr); //if ((MapX == 1 && MapY == 53) || (MapX == 1 && MapY == 54) || (MapX == 1 && MapY == 55)) // return; //if ((MapX == 10 && MapY == 63) || (MapX == 10 && MapY == 64)) //{ // Monster Monster = new Monster(0, 1020001, 200, 10000, 10000, 0, 0, 1, 0xFF, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1408, 659, true); // Map.Monster.Add(Monster); //} MonsterPacket.createAllMonster(gc, Map, Map.Monster); int j = 0; for (int i = 0; i < 50; i++) { if (Map.Monster[i] != null) { j++; } } //for (int i = 0; i < j; i++) //{ // foreach (Character All in map.Characters) // { // if (map.Monster[i].IsAlive == true) // MonsterPacket.spawnMonster(All.Client, map.Monster[i], 0, 0, 0, 0); // } //} //if (map.GetMapCharactersTotal() < 1) //{ Map.ControlMonster(gc, j); //} //if (chr.IsFuring == true) //{ // foreach (Character All in Map.Characters) // { // StatusPacket.Fury(All.Client, chr, chr.FuringType); // } //} }
public static void Check_SameName_Req(InPacket lea, Client gc) { string name = lea.ReadString(20); CharPacket.Check_SameName_Ack(gc, (Database.Exists("Characters", "name = '{0}'", name) ? 0 : 1)); }
protected override void Process(InPacket data) { }
public static void Create_MyChar_Req(InPacket lea, Client gc) { string name = lea.ReadString(20); int gender = lea.ReadByte(); int value1 = lea.ReadByte(); int value2 = lea.ReadByte(); int value3 = lea.ReadByte(); int eyes = lea.ReadInt(); int hair = lea.ReadInt(); int weapon = lea.ReadInt(); int outfit = lea.ReadInt(); int job = lea.ReadByte(); int seal = 8510011; /* * Private * [05 01 ] [0A 00 38 00] [47 01 01 00] 00 00 Header * 4E 69 6E 6A 61 35 35 35 35 CharacterName * 00 00 00 00 00 00 00 00 00 00 00 Empty * 01 E7 19 00 // Unknow * DD A1 8B 00 // Eye = * D1 18 8A 00 // hair = * 3C 87 7A 00 // weapon 8030012 * 01 00 7D 00 // Outfit 8192001 * 02 00 00 00 * */ Log.Inform(">> Create Character"); Log.Debug(">> Character Name: {0} Gender : {1} Value1 : {2} Value2 : {3} Value3 : {4}", name, gender, value1, value2, value3); Log.Debug(">> Character ITEM : Eye : {0} Hair: {1} Weapon: {2} Outfit: {3} Job: {4}", eyes, hair, weapon, outfit, job); var account_id = gc.Account.ID; if (gender != 1 && gender != 2) { account_id = 0; gc.Dispose(); } // Hack Check int DefaultCharacterLevel = 1; if (job >= 6 && job < 12) { DefaultCharacterLevel = 60; } if (job < 1 || job > 11) { job = 0; account_id = 0; gc.Dispose(); } Character chr = new Character(); chr.AccountID = account_id; chr.WorldID = gc.WorldID; chr.Name = name; chr.Title = "Kanghoin"; chr.Level = (byte)DefaultCharacterLevel; chr.Class = 0; chr.ClassLevel = 0xFF; chr.Guild = 0xFF; chr.Gender = (byte)gender; chr.Job = job; chr.Eyes = eyes; chr.Hair = hair; chr.MapX = 0; chr.MapY = 0; chr.Str = 3; chr.Dex = 3; chr.Vit = 3; chr.Int = 3; chr.Hp = 75; chr.MaxHp = 75; chr.Mp = 25; chr.MaxMp = 25; chr.Fury = 0; chr.MaxFury = 1200; chr.Exp = 0; chr.Money = 0; chr.Attack = 9; chr.MaxAttack = 11; chr.Magic = 4; chr.MaxMagic = 4; chr.Defense = 12; chr.JumpHeight = 3; int pos = 1; foreach (Character cc in gc.Account.Characters) { if (cc.Position != pos) { break; } pos++; } chr.Position = (byte)(pos); chr.Items.Add( new Item(weapon, (byte)(InventoryType.ItemType.Equip), (byte)InventoryType.EquipType.Weapon)); chr.Items.Add( new Item(outfit, (byte)(InventoryType.ItemType.Equip), (byte)InventoryType.EquipType.Outfit)); chr.Items.Add(new Item(seal, (byte)(InventoryType.ItemType.Equip), (byte)InventoryType.EquipType.Seal)); chr.Items.Add(new Item(8810011, (byte)InventoryType.ItemType.Spend3, 0, 10)); chr.Items.Add(new Item(8820011, (byte)InventoryType.ItemType.Spend3, 1, 10)); chr.Storages.Add(new Storage(0)); chr.Skills.Add(new Skill(1, 1, 0, 0)); chr.Skills.Add(new Skill(2, 1, 0, 1)); chr.Skills.Add(new Skill(3, 1, 0, 2)); chr.Skills.Add(new Skill(4, 1, 0, 3)); chr.Keymap.Add("Z", new Shortcut(1, 0, 0)); chr.Keymap.Add("X", new Shortcut(4, 0, 3)); chr.Keymap.Add("C", new Shortcut(3, 0, 2)); chr.UseSlot.Add((byte)InventoryType.ItemType.Spend3, 0xFF); chr.UseSlot.Add((byte)InventoryType.ItemType.Pet5, 0xFF); Log.Debug("[Create_MyChar_Req] total char = '{0}'", gc.Account.Characters.Count); if ((gc.Account.Characters.Count + 1) <= 4) { Log.Debug("[Create_MyChar_Req] trying to save '{0}' to DB", name); chr.Save(); gc.Account.Characters.Insert(pos - 1, chr); pos = (chr.Position << 8) + 1; Log.Debug("[Create_MyChar_Req] save status is: '{0}'", pos); } else if (Database.Exists("Characters", "name = '{0}'", name)) { Log.Debug("[Create_MyChar_Req] user exist: '{0}'", name); pos = -1; } else if ((gc.Account.Characters.Count + 1) > 4) { Log.Debug("[Create_MyChar_Req] user maxed: {0} - total 4/4: '{0}'", name); pos = -2; } else { Log.Debug("[Create_MyChar_Req] unknown error during save: '{0}'", name); pos = 0; } Log.Debug("Send Create_MyChar_Ack: '{0}'", name); CharPacket.Create_MyChar_Ack(gc, pos); }
public static void TradeCancel(InPacket lea, Client c) { var chr = c.Character; int j = 0; // 個人 chr.Money += chr.Trade.Money; // 對方 chr.Trader.Money += chr.Trader.Trade.Money; // 個人 if (chr.Trade.Money > 0) { InventoryPacket.getInvenMoney(c, chr.Money, chr.Trade.Money); } // 對方 if (chr.Trader.Trade.Money > 0) { InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trader.Trade.Money); } // 個人 foreach (Item Item in chr.Trade.Item) { Item i = chr.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trade.SourceQuantity[j] + chr.Trade.TargetQuantity[j] <= 100) { chr.Items.Remove(Item.Type, Item.Slot); chr.Items.Add(new Item(Item.ItemID, chr.Trade.SourceQuantity[j], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Items.Add(Item); } } else { chr.Items.Add(Item); } InventoryHandler.UpdateInventory(c, Item.Type); j++; } int k = 0; // 對方 foreach (Item Item in chr.Trader.Trade.Item) { Item i = chr.Trader.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trader.Trade.SourceQuantity[k] + chr.Trader.Trade.TargetQuantity[k] <= 100) { chr.Trader.Items.Remove(Item.Type, Item.Slot); chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.SourceQuantity[k], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Trader.Items.Add(Item); } } else { chr.Trader.Items.Add(Item); } InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type); k++; } TradePacket.TradeCancel(chr.Trader.Client); chr.Trade = null; chr.Trader = null; }
protected abstract void Dispatch(InPacket inPacket);
public void Push(InPacket packet) { #region Playable unit events if (packet is ReceiveDestination) { ReceiveDestination pos = packet as ReceiveDestination; if (presentedUnits.Contains(pos.Name)) { events.Enqueue(PacketConverter.ReceiveDestination(pos, ReceiveDestinationForm.MOVE)); } else { presentedUnits.Add(pos.Name); events.Enqueue(PacketConverter.ReceiveDestination(pos, ReceiveDestinationForm.SPAWN)); } } else if (packet is LeaveMessage) { LeaveMessage lev = packet as LeaveMessage; presentedUnits.Remove(lev.Name); events.Enqueue(lev.ToString()); } #endregion #region Fauna events else if (packet is UpdateMonster) { UpdateMonster monster = packet as UpdateMonster; if (presentedFauna.Contains(monster.Id)) { events.Enqueue(PacketConverter.UpdateMonster(monster, UpdateMonsterForm.MOVE)); } else { presentedFauna.Add(monster.Id); events.Enqueue(PacketConverter.UpdateMonster(monster, UpdateMonsterForm.SPAWN)); } } #endregion #region Flora events else if (packet is UpdateHerb) { UpdateHerb herb = packet as UpdateHerb; if (presentedFauna.Contains(herb.Id)) { if (herb.State == 0) { events.Enqueue(PacketConverter.UpdateHerb(herb, UpdateHerbForm.REMOVE)); } else { events.Enqueue(PacketConverter.UpdateHerb(herb, UpdateHerbForm.GROWTH)); } } else { presentedFlora.Add(herb.Id); events.Enqueue(PacketConverter.UpdateHerb(herb, UpdateHerbForm.SPAWN)); } } #endregion }