public static void TradePutItem(InPacket lea, Client c) { var chr = c.Character; int SourceType = lea.ReadShort(); int SourceSlot = lea.ReadShort(); int Quantity = lea.ReadInt(); if (SourceType == 0x64 && SourceSlot == 0x64) { // Money欄位 chr.Money -= Quantity; chr.Trade.Money = Quantity; InventoryPacket.getInvenMoney(c, chr.Money, -Quantity); TradePacket.TradePutItem(c); TradePacket.TradePutItem(chr.Trader.Client); return; } Item Source = chr.Items.getItem((byte)SourceType, (byte)SourceSlot); chr.Trade.SourceQuantity.Add(Source.Quantity); if (Source != null) { chr.Trade.Item.Add(Source); chr.Trade.TargetQuantity.Add((short)Quantity); chr.Items.Remove((byte)SourceType, (byte)SourceSlot, Quantity); InventoryHandler.UpdateInventory(c, (byte)SourceType); TradePacket.TradePutItem(c); TradePacket.TradePutItem(chr.Trader.Client); } }
public static void p_Damage_c(InPacket lea, Client c) { int CharacterID = lea.ReadInt(); short Damage = lea.ReadShort(); short Unk = lea.ReadShort(); float PositionX = BitConverter.ToSingle(BitConverter.GetBytes(lea.ReadInt()), 0); float PositionY = BitConverter.ToSingle(BitConverter.GetBytes(lea.ReadInt()), 0); var chr = c.Character; if (chr == null) { if (chr.CharacterID == CharacterID) { } else { return; } } if (Damage > 0) { chr.Hp -= Damage; } if (PositionX != 0) { chr.PlayerX = ((short)PositionX); } }
public static void SellStart_Req(InPacket lea, Client c) { string Name = lea.ReadString(40); var chr = c.Character; //if (!(chr.MapX == 1 && chr.MapY == 51) && !(chr.MapX == 1 && chr.MapY == 52) && !(chr.MapX == 1 && chr.MapY == 53) && !(chr.MapX == 1 && chr.MapY == 54) && !(chr.MapX == 1 && chr.MapY == 55)) // return; Map map = MapFactory.GetMap(chr.MapX, chr.MapY); CharacterShop PlayerShop = new CharacterShop(Name); for (int i = 0; i < 12; i++) { int SourceType = lea.ReadShort(); int SourceSlot = lea.ReadShort(); int Quantity = lea.ReadInt(); int Price = lea.ReadInt(); Item Source = chr.Items.getItem((byte)SourceType, (byte)SourceSlot); if (Source != null) { PlayerShop.Add(new ShopData(Source.ItemID, Quantity, SourceType, SourceSlot, (byte)i, Source.Spirit, Source.Level1, Source.Level2, Source.Level3, Source.Level4, Source.Level5, Source.Level6, Source.Level7, Source.Level8, Source.Level9, Source.Level10, Source.Fusion, Source.IsLocked, Source.Icon, Source.Term, Price)); } } chr.Shop = PlayerShop; foreach (Character All in map.Characters) { PlayerShopPacket.SellStart(All.Client, chr, Name); } }
public static void MoveItemToStorage(InPacket lea, Client gc) { int SourceType = lea.ReadShort(); int SourceSlot = lea.ReadShort(); int TargetType = lea.ReadShort(); int TargetSlot = lea.ReadShort(); int Quantity = lea.ReadInt(); var chr = gc.Character; Storage Target = chr.Storages.GetItem((byte)TargetType, (byte)TargetSlot); Item Source = chr.Items.getItem((byte)SourceType, (byte)SourceSlot); if (Target != null || Source.ItemID / 100000 == 86 || Source.ItemID / 100000 == 87 || Source.ItemID / 100000 == 92 || Source.ItemID / 100000 == 94 || Source.ItemID / 100000 == 95) { return; } chr.Storages.Add(new Storage(Source.ItemID, Quantity, Source.Spirit, Source.Level1, Source.Level2, Source.Level3, Source.Level4, Source.Level5, Source.Level6, Source.Level7, Source.Level8, Source.Level9, Source.Level10, Source.Fusion, Source.IsLocked, Source.Icon, Source.Term, TargetType, TargetSlot, 0)); chr.Items.Remove((byte)SourceType, (byte)SourceSlot, Quantity); chr.Save(); StoragePacket.getStoreInfo(gc); InventoryHandler.UpdateInventory(gc, (byte)SourceType); }
public static void Buy_Req(InPacket lea, Client c) { int CharacterID = lea.ReadInt(); int ItemID = lea.ReadInt(); int Slot = lea.ReadShort(); int Quantity = lea.ReadShort(); var chr = c.Character; try { Map map = MapFactory.GetMap(chr.MapX, chr.MapY); Character Seller = null; foreach (Character find in map.Characters) { if (find.CharacterID == CharacterID) { Seller = find; } } ShopData Item = Seller.Shop.Find(i => ItemID == i.ItemID && Slot == i.TargetSlot); byte Type = InventoryType.getItemType(ItemID); byte FreeSlot = chr.Items.GetNextFreeSlot((InventoryType.ItemType)Type); if (Item.Quantity < Quantity || Item == null) { PlayerShopPacket.Buy(c, 0); return; } chr.Money -= (Item.Price * Quantity); InventoryPacket.getInvenMoney(c, chr.Money, -(Item.Price * Quantity)); chr.Items.Add(new Item(Item.ItemID, (short)Quantity, 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, FreeSlot)); InventoryHandler.UpdateInventory(c, Type); //Seller.Shop.Remove(Item); Seller.Items.Remove((byte)Item.SourceType, (byte)Item.SourceSlot); Seller.Items.Add(new Item(Item.ItemID, (short)(Item.Quantity - Quantity), 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, (byte)Item.SourceType, (byte)Item.SourceSlot)); Item.Quantity = Item.Quantity - Quantity; Seller.Shop.Money += (Item.Price * Quantity); Seller.Money += (Item.Price * Quantity); PlayerShopPacket.ShopInfo(c, Seller, CharacterID); InventoryHandler.UpdateInventory(Seller.Client, (byte)Item.SourceType); PlayerShopPacket.SellInfo(Seller.Client); InventoryPacket.getInvenMoney(Seller.Client, Seller.Money, Item.Price * Quantity); PlayerShopPacket.Buy(c, 1); } catch { PlayerShopPacket.Buy(c, 0); return; } }
public static void AbilityRecover_Req(InPacket lea, Client c) { short Slot = lea.ReadShort(); short Type = lea.ReadShort(); var chr = c.Character; switch (Type) { case 0: // 力量還原本 if (chr.Str < 4) { return; } chr.Str--; chr.AbilityBonus++; chr.Items.Remove(3, (byte)Slot, 1); break; case 1: // 精力還原本 if (chr.Dex < 4) { return; } chr.Dex--; chr.AbilityBonus++; chr.Items.Remove(3, (byte)Slot, 1); break; case 2: // 氣力還原本 if (chr.Vit < 4) { return; } chr.Vit--; chr.AbilityBonus++; chr.Items.Remove(3, (byte)Slot, 1); break; case 3: // 智力還原本 if (chr.Int < 4) { return; } chr.Int--; chr.AbilityBonus++; chr.Items.Remove(3, (byte)Slot, 1); break; } InventoryHandler.UpdateInventory(c, 3); StatusPacket.getStatusInfo(c); }
protected override void Dispatch(InPacket inPacket) { try { #if DEBUG Log.Hex("<<< Received (0x{0:X2}) packet from {1}: ", inPacket.Content, inPacket.OperationCode, this.Title); #endif if (inPacket.OperationCode == (ushort)ClientOpcode.SERVER) { short Header = inPacket.ReadShort(); // Read header inPacket.ReadInt(); // Original length + CRC inPacket.ReadInt(); #if DEBUG Log.Debug("^^^--- <<< Received opcode (0x{0:X}): ", Header); #endif switch ((ClientOpcode)Header) { case ClientOpcode.MYCHAR_INFO_REQ: Log.Debug("Send >> CharHandler.MyChar_Info_Req"); CharHandler.MyChar_Info_Req(inPacket, this); break; case ClientOpcode.CREATE_MYCHAR_REQ: Log.Debug("Send >> CharHandler.Create_MyChar_Req"); CharHandler.Create_MyChar_Req(inPacket, this); break; case ClientOpcode.CHECK_SAMENAME_REQ: Log.Debug("Send >> CharHandler.Check_SameName_Req"); CharHandler.Check_SameName_Req(inPacket, this); break; case ClientOpcode.DELETE_MYCHAR_REQ: Log.Debug("Send >> CharHandler.Delete_MyChar_Req"); CharHandler.Delete_MyChar_Req(inPacket, this); break; case ClientOpcode.CREATE_PREVIEW_REQ: Log.Debug("Send >> CharHandler.Create_Preview_Req"); CharHandler.Create_Preview_Req(inPacket, this); break; case ClientOpcode.CHAR_PAGE2_REQ: Log.Debug("Send >> CharHandler.Char_page2_preview "); CharHandler.Char_page2_preview(inPacket, this); break; } } } catch (HackException e) { Log.Warn("Hack from {0}: \n{1}", this.Account.Username, e.ToString()); } catch (Exception e) { Log.Error("Unhandled exception from {0}: \n{1}", this.Title, e.ToString()); } }
public static void InvenUseSpendStart_Req(InPacket lea, Client c) { short PositionX = lea.ReadShort(); short PositionY = lea.ReadShort(); int Slot = lea.ReadInt(); var chr = c.Character; Map map = MapFactory.GetMap(chr.MapX, chr.MapY); Item Item = chr.Items.getItem((byte)InventoryType.ItemType.Spend3, (byte)Slot); foreach (Character All in map.Characters) { InventoryPacket.UseSpendStart(All.Client, chr, PositionX, PositionY, Item.ItemID, (byte)InventoryType.ItemType.Spend3, Slot); } chr.Items.Remove((byte)InventoryType.ItemType.Spend3, (byte)Slot, 1); UpdateInventory(c, (byte)InventoryType.ItemType.Spend3); }
private void Handle(byte[] rawPacket, bool fromCommand = false, InPacket packet = null) { InPacket inPacket = fromCommand ? packet : new InPacket(this.Cryptograph.Decrypt(rawPacket)); if (Enum.IsDefined(typeof(TReceiveOP), inPacket.OperationCode)) { switch (PacketBase.LogLevel) { case LogLevel.Name: Log.Inform("Received {0} packet from {1}.", Enum.GetName(typeof(TReceiveOP), inPacket.OperationCode), this.Title); break; case LogLevel.Full: Log.Hex("Received {0} packet from {1}: ", inPacket.Content, Enum.GetName(typeof(TReceiveOP), inPacket.OperationCode), this.Title); break; } } else { #if DEBUG Log.Hex("Received unknown (0x{0:X2}) packet from {1}: ", inPacket.Content, inPacket.OperationCode, this.Title); #endif } if (fromCommand) { inPacket.Position = 0; inPacket.ReadShort(); } this.Dispatch(inPacket); }
public static void OnMobMove(MapleClient client, InPacket iPacket) { int objectID = iPacket.ReadInt(); Mob mob; try { mob = client.Character.ControlledMobs[objectID]; } catch (KeyNotFoundException) { return; } short moveAction = iPacket.ReadShort(); bool cheatResult = (iPacket.ReadByte() & 0xF) != 0; byte centerSplit = iPacket.ReadByte(); int illegalVelocity = iPacket.ReadInt(); byte unknown = iPacket.ReadByte(); iPacket.ReadInt(); Movements movements = Movements.Decode(iPacket); Movement lastMovement = movements[movements.Count - 1]; mob.Position = lastMovement.Position; mob.Foothold = lastMovement.Foothold; mob.Stance = lastMovement.Stance; using (OutPacket oPacket = new OutPacket(SendOps.MobCtrlAck)) { oPacket .WriteInt(objectID) .WriteShort(moveAction) .WriteBool(cheatResult) .WriteShort() // NOTE: Mob mana. .WriteByte() // NOTE: Ability ID. .WriteByte(); // NOTE: Ability level. client.Send(oPacket); } using (OutPacket oPacket = new OutPacket(SendOps.MobMove)) { oPacket .WriteInt(objectID) .WriteBool(cheatResult) .WriteByte(centerSplit) .WriteInt(illegalVelocity); movements.Encode(oPacket); client.Character.Map.Broadcast(oPacket, client.Character); } }
public static void MoveItemToBag(InPacket lea, Client gc) { int SourceType = lea.ReadShort(); int SourceSlot = lea.ReadShort(); int TargetSlot = lea.ReadShort(); lea.ReadShort(); int Quantity = lea.ReadInt(); var chr = gc.Character; Storage Source = chr.Storages.GetItem((byte)SourceType, (byte)SourceSlot); int TargetType = InventoryType.getItemType(Source.ItemID); Item Item = chr.Items.getItem((byte)TargetType, (byte)TargetSlot); if (Item == null) { chr.Items.Add(new Item(Source.ItemID, (short)Quantity, Source.Spirit, Source.Level1, Source.Level2, Source.Level3, Source.Level4, Source.Level5, Source.Level6, Source.Level7, Source.Level8, Source.Level9, Source.Level10, Source.Fusion, Source.IsLocked, Source.Icon, Source.Term, (byte)TargetType, (byte)TargetSlot)); } else { if (Source.ItemID != Item.ItemID) { return; } int QuantityTemp = Item.Quantity; chr.Items.Remove((byte)TargetType, (byte)TargetSlot); chr.Items.Add(new Item(Item.ItemID, (short)(QuantityTemp + Quantity), 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, (byte)TargetType, (byte)TargetSlot)); } chr.Storages.Remove((byte)Source.Type, (byte)Source.Slot, Quantity); chr.Save(); StoragePacket.getStoreInfo(gc); InventoryHandler.UpdateInventory(gc, (byte)TargetType); }
public static void HandleSpawnCharacter(MapleConnection connection, InPacket packet) { Character character = new Character(); character.ID = packet.ReadInt(); character.Level = packet.ReadByte(); packet.ReadShort(); character.Name = packet.ReadString(); Main.Instance.DrawCharacterObject(character); }
public static void DecodeCharacterData(Character character, InPacket packet) { packet.ReadShort(); for (int i = 0; i < 3; i++) { uint damageSeed = packet.ReadUInt(); } ulong flags = packet.ReadULong(); }
public override void OnPacket(InPacket iPacket) { try { iPacket.Decrypt(CRYPT_KEY); CenterOpcodes uOpcode = (CenterOpcodes)iPacket.ReadShort(); int uSize = iPacket.ReadInt(); bool isCompress = iPacket.ReadBool(); int cSize = 0; if (isCompress == true) { cSize = iPacket.ReadInt(); LogFactory.GetLog("Main").LogInfo("Pacote comprimido {0}({1})", (int)uOpcode, uOpcode.ToString()); } else { LogFactory.GetLog("Main").LogInfo("Packet {0}({1})", (int)uOpcode, uOpcode.ToString()); } LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray()); switch (uOpcode) { case CenterOpcodes.HEART_BIT_NOT: OnHeartBeatNot(); break; case CenterOpcodes.ENU_CLIENT_CONTENTS_FIRST_INIT_INFO_REQ: MyLoading.NotifyContentInfo(this); break; case CenterOpcodes.ENU_VERIFY_ACCOUNT_REQ: MyUser.OnLogin(this, iPacket); break; default: { LogFactory.GetLog("Main").LogWarning("Pacote indefinido foi recebida. Opcode: {0}({1})", (int)uOpcode, uOpcode.ToString()); LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray()); break; } } } catch (Exception e) { LogFactory.GetLog("Main").LogError(e.ToString()); Close(); } }
public override void OnPacket(InPacket iPacket) { try { iPacket.Decrypt(CRYPT_KEY); GameOpcodes uOpcode = (GameOpcodes)iPacket.ReadShort(); int uSize = iPacket.ReadInt(); bool isCompress = iPacket.ReadBool(); int cSize = 0; if (isCompress == true) { cSize = iPacket.ReadInt(); LogFactory.GetLog("Main").LogInfo("Pacote comprimido {0}({1})", (int)uOpcode, uOpcode.ToString()); } else { LogFactory.GetLog("Main").LogInfo("Packet {0}({1})", (int)uOpcode, uOpcode.ToString()); } LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray()); switch (uOpcode) { case GameOpcodes.HEART_BIT_NOT: OnHeartBeatNot(); break; case GameOpcodes.EVENT_INVITE_REQ: //31 EVENT_FRIEND_LIST_REQ MsgUser.FriendList(this, iPacket); break; case GameOpcodes.EVENT_LEAVE_ROOM_ACK: //34 ADD_FRIEND MsgUser.Add(this, iPacket); break; default: { LogFactory.GetLog("Main").LogWarning("Pacote indefinido foi recebida. 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 HandleItemMove(MapleClient client, InPacket iPacket) { iPacket.Skip(4); // NOTE: tRequestTime (ticks). InventoryType inventory = (InventoryType)iPacket.ReadByte(); short slot1 = iPacket.ReadShort(); short slot2 = iPacket.ReadShort(); short quantity = iPacket.ReadShort(); bool dropped = slot2 == 0; bool equippedSlot1 = slot1 < 0; bool equippedSlot2 = slot2 < 0; if (dropped) { } else { client.Character.Items.Swap(inventory, slot1, slot2); } if (equippedSlot1 || equippedSlot2) { } }
protected override void Dispatch(InPacket inPacket) { try { PacketCrypt pd = new PacketCrypt(0); byte[] ii; if (inPacket.Array[0] == 0xAA && inPacket.Array[1] == 0x55) { ii = inPacket.Array; } else { ii = pd.Decrypt(inPacket.Array); } InPacket ip = new InPacket(ii); if (ip.OperationCode == (ushort)ClientOpcode.SERVER) { var Header = ip.ReadShort(); #if DEBUG Log.Hex("Received (0x{0:X2}) packet from {1}: ", ip.Content, Header, this.Title); #endif switch (Header) { case 0x0C: FriendPacket.FriendList(this); break; } } } catch (HackException e) { // TODO: Register offense using the exception's message. Log.Warn("Hack exception from {0}: \n{1}", this.Title, e.ToString()); } catch (Exception e) { Log.Error("Unhandled exception from {0}: \n{1}", this.Title, e.ToString()); } }
public static void Char_Damage_Req(InPacket lea, Client c) { short Damage = lea.ReadShort(); var chr = c.Character; if (Damage < 0) { Damage = short.MaxValue; } chr.Hp -= Damage; if (chr.Hp <= 0) { chr.IsAlive = false; 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)) { chr.Exp -= (int)(GameConstants.getExpNeededForLevel(chr.Level) * 0.2); if (chr.Exp < 0) { chr.Exp = 0; } StatusPacket.UpdateExp(c); } MapPacket.userDead(c); if (chr.Competitor != null) { PvPPacket.PvPEnd(c, chr.Competitor.CharacterID); PvPPacket.PvPEnd(chr.Competitor.Client, chr.Competitor.CharacterID); chr.Competitor = null; chr.Competitor.Competitor = null; } chr.Hp = 1; chr.Mp = 1; } StatusPacket.UpdateHpMp(c, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); }
protected override void Dispatch(InPacket inPacket) { try { Log.Hex("Received (0x{0:X2}) packet from {1}: ", inPacket.Content, inPacket.OperationCode, this.Title); if (inPacket.OperationCode == (ushort)ClientOpcode.SERVER) { var Header = inPacket.ReadShort(); // 讀取包頭 inPacket.ReadInt(); // 原始長度 + CRC inPacket.ReadInt(); switch ((ClientOpcode)Header) { case ClientOpcode.MYCHAR_INFO_REQ: CharHandler.MyChar_Info_Req(inPacket, this); break; case ClientOpcode.CREATE_MYCHAR_REQ: CharHandler.Create_MyChar_Req(inPacket, this); break; case ClientOpcode.CHECK_SAMENAME_REQ: CharHandler.Check_SameName_Req(inPacket, this); break; case ClientOpcode.DELETE_MYCHAR_REQ: CharHandler.Delete_MyChar_Req(inPacket, this); break; } } } catch (HackException e) { Log.Warn("Hack from {0}: \n{1}", this.Account.Username, e.ToString()); } catch (Exception e) { Log.Error("Unhandled exception from {0}: \n{1}", this.Title, e.ToString()); } }
public static void Move(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook cargo movement while not being ingame."); c.Close(); return; } byte fromCargoIndex = p.ReadByte(); short unknownMovement = p.ReadShort(); byte toCargoSlot = p.ReadByte(); byte toCargoLine = p.ReadByte(); byte toCargoRow = p.ReadByte(); Character chr = c.getAccount().activeCharacter; Cargo cargo = chr.getCargo(); Console.WriteLine("Cargo > {0} | {1} | {2} | {3}", fromCargoIndex, toCargoSlot, toCargoLine, toCargoRow); if (!cargo.moveItem(fromCargoIndex, toCargoSlot, toCargoRow, toCargoLine)) { Console.WriteLine("problem with move item"); return; } OutPacket op = new OutPacket(24); op.WriteInt(24); op.WriteShort(4); op.WriteShort(46); op.WriteInt(1); op.WriteInt(chr.getuID()); op.WriteShort(1); op.WriteByte(fromCargoIndex); op.WriteShort(unknownMovement); op.WriteByte(toCargoSlot); op.WriteByte(toCargoLine); op.WriteByte(toCargoRow); c.WriteRawPacket(op.ToArray()); }
public void OnNewRequestReceived(MapleClient client, PacketRequestInfo packetInfo) { if (!client.RecvCipher.CheckPacket(packetInfo.Header)) { throw new Exception("封包不正确"); } var data = new byte[packetInfo.Data.Length]; Buffer.BlockCopy(packetInfo.Data, 0, data, 0, data.Length); client.RecvCipher.Transform(data); var p = new InPacket(data); var handler = Processor[p.ReadShort()]; if (handler != null) { handler(client, p); } else { Console.WriteLine($"未知封包 长度:{data.Length} 封包:{BitTool.GetHexStr(data)}"); } }
public static void Chat(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked chat with null of activeCharacter"); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte messageType = (byte)p.ReadShort(); string receiver = MiscFunctions.obscureString(p.ReadString(17)); byte messageLength = (byte)p.ReadInt(); if (messageLength > 65) { Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to send a message of size {0}", messageLength); c.Close(); return; } string message = p.ReadString(messageLength); switch (messageType) { case 0: WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), StaticPackets.chatRelay(chr, messageType, message)); break; case 1: { if (receiver == null) { return; } Character player = WMap.Instance.findPlayerByName(receiver); if (player == null) { chr.getAccount().mClient.WriteRawPacket(StaticPackets.playerIsntConnected(chr)); break; } player.getAccount().mClient.WriteRawPacket(StaticPackets.chatRelay(chr, messageType, message)); break; } case 6: // karma notice { if (chr.getKarmaMessagingTimes() == 0) { } WMap.Instance.sendToAllCharactersExcept(chr, StaticPackets.chatRelay(chr, messageType, message)); break; } case 7: // "GM Shout" { if (chr.getAccount().gmLvl == 0 && chr.getGMShoutMessagingCounts() == 0) { } WMap.Instance.sendToAllCharactersExcept(chr, StaticPackets.chatRelay(chr, messageType, message)); break; } case 9: // admin commands { string[] cmd = Regex.Split(message, " "); if (chr.getAccount().gmLvl == 0) { Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to parse GM Command {0}", cmd[0]); c.Close(); break; } if (cmd.Length == 0) { Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to parse null GM Command"); c.Close(); break; } if (cmd[0][0] != '/') { Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to parse command without '/' slash"); c.Close(); break; } CommandProcessor.ParseCommand(c, cmd); break; } default: { break; } } }
public static void Quick_Slot_Req(InPacket lea, Client gc) { var chr = gc.Character; int KeymapType = lea.ReadShort(); int KeymapSlot = lea.ReadShort(); int SkillID = lea.ReadInt(); int SkillType = lea.ReadShort(); int SkillSlot = lea.ReadShort(); string QuickSlotName = ""; switch (KeymapType) { case 0: switch (KeymapSlot) { case 0: QuickSlotName = "Z"; break; case 1: QuickSlotName = "X"; break; case 2: QuickSlotName = "C"; break; case 3: QuickSlotName = "V"; break; case 4: QuickSlotName = "B"; break; case 5: QuickSlotName = "N"; break; } break; case 1: switch (KeymapSlot) { case 0: QuickSlotName = "1"; break; case 1: QuickSlotName = "2"; break; case 2: QuickSlotName = "3"; break; case 3: QuickSlotName = "4"; break; case 4: QuickSlotName = "5"; break; case 5: QuickSlotName = "6"; break; } break; case 2: switch (KeymapSlot) { case 0: QuickSlotName = "Insert"; break; case 1: QuickSlotName = "Home"; break; case 2: QuickSlotName = "PageUp"; break; case 3: QuickSlotName = "Delete"; break; case 4: QuickSlotName = "End"; break; case 5: QuickSlotName = "PageDown"; break; } break; case 3: switch (KeymapSlot) { case 0: QuickSlotName = "7"; break; case 1: QuickSlotName = "8"; break; case 2: QuickSlotName = "9"; break; case 3: QuickSlotName = "0"; break; case 4: QuickSlotName = "-"; break; case 5: QuickSlotName = "="; break; } break; } if (SkillID == -1 && SkillType == -1 && SkillSlot == -1) { chr.Keymap.Remove(QuickSlotName); return; } chr.Keymap.Remove(QuickSlotName); chr.Keymap.Add(QuickSlotName, new Shortcut(SkillID, (byte)SkillType, (byte)SkillSlot)); }
public static void ServerHandlerReceive(InPacket ip, Client gc) { var Header = ip.ReadShort(); // Read header ip.ReadInt(); // Original length + CRC ip.ReadInt(); #if DEBUG Log.Hex("Received {0}({1}) packet from {2}: ", ip.Array, ((ClientOpcode)Header).ToString(), Header, gc.Title); #endif switch ((ClientOpcode)Header) { // Game case ClientOpcode.COMMAND_REQ: GameHandler.Command_Req(ip, gc); break; case ClientOpcode.GAMELOG_REQ: GameHandler.Game_Log_Req(ip, gc); break; case ClientOpcode.QUICK_SLOT_REQ: GameHandler.Quick_Slot_Req(ip, gc); break; //2019-09-01 16:48 GMT+7 case ClientOpcode.CHARACTER_INFO_REQ: // OPCODE = 76 // Try Change test = E4 GameHandler.Character_Info_Req(ip, gc); break; case ClientOpcode.GAME_ISACTIVE: GameHandler.GameisActive_Ack(ip, gc); break; // Shop case ClientOpcode.NPC_SHOP_BUY_REQ: NpcShopHandler.Buy_Req(ip, gc); break; case ClientOpcode.NPC_SHOP_SELL_REQ: NpcShopHandler.Sell_Req(ip, gc); break; // Status case ClientOpcode.CHAR_DAMAGE_REQ: StatusHandler.Char_Damage_Req(ip, gc); break; case ClientOpcode.CHAR_DEAD_REQ: StatusHandler.Char_Dead_Req(ip, gc); break; case ClientOpcode.CHAR_STATUP_REQ: StatusHandler.Char_Statup_Req(ip, gc); break; case ClientOpcode.CHAR_FURY: StatusHandler.Char_Fury_Req(ip, gc); break; // Inventory case ClientOpcode.MOVE_ITEM_REQ: InventoryHandler.MoveItem_Req(ip, gc); break; case ClientOpcode.INVEN_SELECTSLOT_REQ: InventoryHandler.SelectSlot_Req(ip, gc); break; case ClientOpcode.USE_SPEND_REQ: InventoryHandler.UseSpend_Req(ip, gc); break; case ClientOpcode.INVEN_USESPEND_REQ: InventoryHandler.InvenUseSpendStart_Req(ip, gc); break; case ClientOpcode.INVEN_USESPEND_SHOUT_REQ: case ClientOpcode.INVEN_USESPEND_SHOUT_ALL_REQ: InventoryHandler.InvenUseSpendShout_Req(ip, gc); break; case ClientOpcode.PICKUP_ITEM: InventoryHandler.PickupItem(ip, gc); break; // Skill case ClientOpcode.SKILL_LEVELUP_REQ: SkillHandler.SkillLevelUp_Req(ip, gc); break; //case ClientOpcode.USE_SKILL_REQ: // SkillHandler.UseSkill_Req(ip, gc); // break; // Quest case ClientOpcode.QUEST_ALL_REQ: QuestHandler.Quest_All_Req(ip, gc); break; case ClientOpcode.QUEST_GIVEUP_REQ: QuestHandler.Quest_GiveUp_Req(ip, gc); break; case ClientOpcode.QUEST_DONE_REQ: QuestHandler.Quest_Done_Req(ip, gc); break; case ClientOpcode.QUEST_RETURN_REQ: QuestHandler.Quest_Return_Req(ip, gc); break; case ClientOpcode.QUEST_DONE2_REQ: QuestHandler.Quest_Done2_Req(ip, gc); break; case ClientOpcode.QUEST_UPDATE_REQ: QuestHandler.Quest_Update_Req(ip, gc); break; // Map case ClientOpcode.ENTER_WARP_ACK_REQ: MapHandler.WarpToMap_Req(ip, gc); break; case ClientOpcode.CAN_WARP_ACK_REQ: MapHandler.WarpToMapAuth_Req(ip, gc); break; // Monster case ClientOpcode.ATTACK_MONSTER_REQ: MonsterHandler.AttackMonster_Req(ip, gc); break; // Storage case ClientOpcode.MOVE_ITEM_STORAGE_REQ: StorageHandler.MoveItemToStorage(ip, gc); break; case ClientOpcode.MOVE_ITEM_TO_BAG_REQ: StorageHandler.MoveItemToBag(ip, gc); break; case ClientOpcode.SAVE_MONEY_REQ: StorageHandler.SaveStorageMoney(ip, gc); break; case ClientOpcode.GIVE_MONEY_REQ: StorageHandler.GiveStorageMoney(ip, gc); break; // Coupon case ClientOpcode.CASH_SN: CouponHandler.Use_Coupon_Req(ip, gc); break; // Action case ClientOpcode.P_WARP_C: ActionHandler.p_Warp_c(ip, gc); break; case ClientOpcode.P_MOVE_C: ActionHandler.p_Move_c(ip, gc); break; case ClientOpcode.P_JUMP_C: ActionHandler.p_Jump_c(ip, gc); break; case ClientOpcode.P_SPEED_C: ActionHandler.p_Speed_c(ip, gc); break; case ClientOpcode.P_ATTACK_C: ActionHandler.p_Attack_c(ip, gc); break; //case ClientOpcode.P_DAMAGE_C: // ActionHandler.p_Damage_c(ip, gc); // break; //case ClientOpcode.P_DEAD_C: // ActionHandler.p_Dead_c(ip, gc); // break; case ClientOpcode.P_MOVE_C_2: ActionHandler.p_Move_c_2(ip, gc); break; //case ClientOpcode.PET_MOVE_C: // ActionHandler.Pet_Move_C(ip, gc); // break; //case ClientOpcode.PET_ATTACK_C: // ActionHandler.Pet_Attack_C(ip, gc); // break; // Trade case ClientOpcode.TRADE_INVITE_REQ: TradeHandler.TradeInvite(ip, gc); break; case ClientOpcode.TRADE_INVITE_RESPONSE_REQ: TradeHandler.TradeInviteResponses(ip, gc); break; case ClientOpcode.TRADE_READY_REQ: TradeHandler.TradeReady(ip, gc); break; case ClientOpcode.TRADE_CONFIRM_REQ: TradeHandler.TradeConfirm(ip, gc); break; case ClientOpcode.TRADE_CANCEL_REQ: TradeHandler.TradeCancel(ip, gc); break; case ClientOpcode.TRADE_PUT_REQ: TradeHandler.TradePutItem(ip, gc); break; // Party case ClientOpcode.PARTY_INVITE_REQ: PartyHandler.PartyInvite(ip, gc); break; case ClientOpcode.PARTY_INVITE_RESPONSES_REQ: PartyHandler.PartyInviteResponses(ip, gc); break; case ClientOpcode.PARTY_LEAVE: PartyHandler.PartyLeave(ip, gc); break; // PvP case ClientOpcode.PVP_REQ: PvPHandler.PvPInvite(ip, gc); break; case ClientOpcode.PVP_ACK_REQ: PvPHandler.PvPInviteResponses(ip, gc); break; // PlayerShop case ClientOpcode.PSHOP_OPEN_REQ: PlayerShopHandler.OpenShop_Req(ip, gc); break; case ClientOpcode.PSHOP_SELLSTART_REQ: PlayerShopHandler.SellStart_Req(ip, gc); break; case ClientOpcode.PSHOP_SELLEND_REQ: PlayerShopHandler.SellEnd_Req(ip, gc); break; case ClientOpcode.PSHOP_INFO_REQ: PlayerShopHandler.ShopInfo_Req(ip, gc); break; case ClientOpcode.PSHOP_BUYACK_REQ: PlayerShopHandler.Buy_Req(ip, gc); break; // Fish case ClientOpcode.FISH_REQ: FishHandler.Fish_Req(ip, gc); break; // CashShop //case ClientOpcode.CASHSHOP_LIST_REQ: // CashShopHandler.CashShopList_Req(ip, gc); // break; case ClientOpcode.CASH_MGAMECASH_REQ: CashShopHandler.MgameCash_Req(ip, gc); break; case ClientOpcode.CASH_BUY_REQ: CashShopHandler.BuyCommodity_Req(ip, gc); break; case ClientOpcode.CASH_GIFT_REQ: CashShopHandler.Gifts_Req(ip, gc); break; case ClientOpcode.CASH_TO_INVEN_REQ: CashShopHandler.CommodityToInventory_Req(ip, gc); break; case ClientOpcode.ABILITY_RECOVER_REQ: CashShopHandler.AbilityRecover_Req(ip, gc); break; case ClientOpcode.CASH_CHECKCHARNAME_REQ: CashShopHandler.CheckName_Req(ip, gc); break; case ClientOpcode.DISMANTLE_REQ: CashShopHandler.Dismantle_Req(ip, gc); break; // Pet case ClientOpcode.PET_NAME_REQ: PetHandler.Pet_Name_Req(ip, gc); break; case ClientOpcode.SPIRIT_MOVE_REQ: SpiritHandler.SpiritMove(ip, gc); break; case ClientOpcode.EQUIPMENT_COMPOUND_REQ: SpiritHandler.EquipmentCompound(ip, gc); break; case ClientOpcode.EVENTITEM_ACK: TradeHandler.TradeEventItem(ip, gc); break; } }
public static void Login_Req(InPacket lea, Client c) { string username = lea.ReadString(); string password = lea.ReadString(); short encryptKey = lea.ReadShort(); if (username.IsAlphaNumeric() == false) { LoginPacket.Login_Ack(c, ServerState.LoginState.NO_USERNAME); return; } c.SetAccount(new Account(c)); try { c.Account.Load(username); var pe = new PasswordEncrypt(encryptKey); string encryptPassword = ServerConstants.PASSWORD_DECODE ? pe.encrypt(c.Account.Password, c.RetryLoginCount > 0 ? password.ToCharArray() : null) : c.Account.Password; if (!password.Equals(encryptPassword)) { LoginPacket.Login_Ack(c, ServerState.LoginState.PASSWORD_ERROR); Log.Error("Login Fail!"); c.RetryLoginCount += 1; } else if (c.Account.Banned == 1) { LoginPacket.Login_Ack(c, ServerState.LoginState.USER_LOCK); } else { LoginPacket.Login_Ack(c, ServerState.LoginState.OK, encryptKey, c.Account.Master > 0 ? true : false); c.Account.LoggedIn = 1; Log.Success("Login Success!"); } Log.Inform("Password = {0}", password); //Log.Inform("encryptKey = {0}", encryptKey); //Log.Inform("encryptPassword = {0}", encryptPassword); } catch (NoAccountException) { if (ServerConstants.AUTO_REGISTRATION == true) { if (username.Length < 5 || password.Length < 5) { LoginPacket.Login_Ack(c, ServerState.LoginState.NO_USERNAME); } Account account = new Account(c); account.Username = username.ToLower(); account.Password = password; account.Creation = DateTime.Now; account.LoggedIn = 0; account.Banned = 0; account.Master = 0; account.GamePoints = 0; account.GiftPoints = 0; account.BonusPoints = 0; account.Save(); LoginPacket.Login_Ack(c, ServerState.LoginState.USER_LOCK); return; } LoginPacket.Login_Ack(c, ServerState.LoginState.NO_USERNAME); } }
public static void AttackMonster_Req(InPacket lea, Client gc) { short CharacterID = lea.ReadShort(); short OriginalID = lea.ReadShort(); lea.ReadShort(); short Damage = lea.ReadShort(); short HitX = lea.ReadShort(); short HitY = lea.ReadShort(); short SkillID = lea.ReadShort(); var chr = gc.Character; Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); Monster Monster = Map.getMonsterByOriginalID(OriginalID); if (Monster == null) { return; } Monster.HP -= Damage; switch (SkillID) { case 10108: // 點穴定身 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 1; } break; case 10204: // 餵毒術 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 2; } break; case 10304: // 玄冰擊 case 10305: // 冰凍大地 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 5; } break; case 10306: // 矇蔽蝕眼 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 3; } break; default: //Log.Inform("[Attack Monster] SkillID = {0}", SkillID); break; } if (Monster.HP <= 0) { //if (Monster.IsAlive == false) // return; Monster.State = 9; Monster.Effect = 0; //map.Monster.Remove(Monster); Monster.IsAlive = false; chr.Exp += Monster.Exp; if (chr.Exp >= GameConstants.getExpNeededForLevel(chr.Level)) { chr.LevelUp(); } StatusPacket.UpdateExp(gc); // 加入要掉落物品 int Max_Count = 2; // 設定最大物品掉落數 int Current_Count = 0; foreach (Loot loot in MobFactory.Drop_Data) { if (Current_Count == Max_Count) { break; } if (loot.MobID == Monster.MonsterID) { if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < loot.Chance) { Monster.Drops.Add(new Drop(0, loot.ItemID, (short)Randomizer.Next(loot.MinimumQuantity, loot.MaximumQuantity))); Current_Count++; } } } // 加入要掉落靈魂 //【藍色鬼魂】能恢復20%的鬼力值 //【綠色鬼魂】能恢復40%的鬼力值 //【紅色鬼魂】累積憤怒計量值用,當憤怒計滿之後能轉為憤怒狀態,攻防都會*1.2倍 //【紫色鬼魂】能吸收到封印裝備,蒐集越多越能增加封印物合成的成功機率 // 無 : 1% // 9900001 : 20% // 9900002 : 19% // 9900003 : 20% // 9900004 : 40% int[] Soul = { 0, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, // 20% 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, // 19% 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, // 20% 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004 // 40% }; int rnd = Randomizer.Next(0, 100); if (rnd != 0) { Monster.Drops.Add(new Drop(0, Soul[rnd], 20)); } //int Max_Soul_Count = 1; // 設定最大物品掉落數 //int Current_Soul_Count = 0; //int[] Soul = new int[] { 15000, 250000, 800000, 650000 }; //for (int i = 1; i < 5; i++) //{ // if (Max_Soul_Count == Current_Soul_Count) // break; // if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < Soul[i-1]) // { // Monster.Drops.Add(new Drop(0, 9900001 + (i -1), 20)); // Current_Soul_Count++; // } //} short rndMoney = (short)(Monster.Exp + Randomizer.Next(6)); if (rndMoney != 0 && Monster.MonsterID != 1010002) // rndMoney != 0 (少數怪物未寫入經驗值) { Monster.Drops.Add(new Drop(0, InventoryType.getMoneyStyle(rndMoney), rndMoney)); // 錢 } for (int i = 0; i < Monster.Drops.Count; i++) { Monster.Drops[i].PositionX = Monster.PositionX; Monster.Drops[i].PositionY = Monster.PositionY - 50; //Item it = new Item(Monster.Drops[i].ItemID, 0x63, 0x63, Monster.Drops[i].Quantity); Monster.Drops[i].ID = Map.ObjectID; Map.Item.Add(Map.ObjectID, new Drop(Map.ObjectID, Monster.Drops[i].ItemID, Monster.Drops[i].Quantity)); Map.ObjectID++; } foreach (Character All in Map.Characters) { MapPacket.MonsterDrop(All.Client, Monster); } Monster.Drops.Clear(); } else { Monster.State = 7; if (chr.PlayerX < HitX && Monster.Direction == 1) { Monster.Direction = 0xFF; } else if (chr.PlayerX > HitX && Monster.Direction == 0xFF) { Monster.Direction = 1; } } foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, Damage, HitX, HitY); } if (Monster.State == 9 && Monster.tmr1 != null) { Monster.tmr1.Cancel(); Monster.tmr1 = null; return; } if (Monster.State == 9 && Monster.tmr2 != null) { Monster.tmr2.Cancel(); Monster.tmr2 = null; return; } if (Monster.State == 9 && Monster.tmr3 != null) { Monster.tmr3.Cancel(); Monster.tmr3 = null; return; } int r = Randomizer.Next(0, 2); if (r == 0 && Monster.Effect == 0 && Monster.State == 7 && Monster.AttackType != 0 && Monster.tmr1 == null) { Monster.tmr1 = new Delay(600, false, () => { if (Monster.State == 9) { Monster.tmr1.Cancel(); Monster.tmr2.Cancel(); Monster.tmr3.Cancel(); Monster.tmr1 = null; Monster.tmr2 = null; Monster.tmr3 = null; return; } Monster.State = 3; foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, 0, HitX, HitY); } Monster.tmr1 = null; if (Monster.State == 3 && Monster.tmr2 == null) { Monster.tmr2 = new Delay(500, false, () => { if (Monster.State == 9) { Monster.tmr1.Cancel(); Monster.tmr2.Cancel(); Monster.tmr3.Cancel(); Monster.tmr1 = null; Monster.tmr2 = null; Monster.tmr3 = null; return; } Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr2 = null; }); Monster.tmr2.Execute(); } }); Monster.tmr1.Execute(); } if ((r == 1 && Monster.Effect == 0 && Monster.State != 9) || (Monster.State != 9 && Monster.Effect == 0 && Monster.AttackType == 0)) { Monster.tmr2 = new Delay(500, false, () => { Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr2 = null; }); Monster.tmr2.Execute(); } if (Monster.Effect != 0) { Monster.tmr3 = new Delay(6000, false, () => { Monster.Effect = 0; Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr3 = null; }); Monster.tmr3.Execute(); } }
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 Sell_Req(InPacket lea, Client gc) { int ItemID = lea.ReadInt(); byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); short Quantity = lea.ReadShort(); if (Quantity > 100) { return; } int Money = 0; switch (ItemID / 100000) { case 75: // 耳環 Money = ItemFactory.earringData[ItemID].Price; Money /= 5; break; case 79: // 武器 case 80: // 武器 Money = ItemFactory.weaponData[ItemID].Price; Money /= 5; break; case 81: // 衣服 Money = ItemFactory.topData[ItemID].Price; Money /= 5; break; case 84: // 披風 Money = ItemFactory.capeData[ItemID].Price; Money /= 5; break; case 86: // 帽子 Money = ItemFactory.hatData[ItemID].Price; Money /= 5; break; case 87: // 面具 Money = ItemFactory.maskData[ItemID].Price; Money /= 5; break; case 93: // 武器 Money = ItemFactory.weaponData[ItemID].Price; Money /= 5; break; case 94: // 鬍子 Money = ItemFactory.beardData[ItemID].Price; Money /= 5; break; case 95: // 服裝 Money = ItemFactory.clothingData[ItemID].Price; Money /= 5; break; case 82: // 戒指 Money = ItemFactory.ringData[ItemID].Price; Money /= 5; break; case 83: // 項鍊 Money = ItemFactory.necklaceData[ItemID].Price; Money /= 5; break; case 85: // 封印箱 Money = ItemFactory.soulData[ItemID].Price; Money /= 5; break; case 11: // 拼圖 Money = ItemFactory.jigsawData[ItemID].Price; break; case 88: // 消耗 Money = ItemFactory.useData[ItemID].Price; Money /= 5; break; case 89: // 其他 Money = ItemFactory.etcData[ItemID].Price; break; default: Log.Error("未知的物品型態:" + ItemID / 100000); break; } if (ItemID == 8880011 || ItemID == 8880021 || ItemID == 8880031 || ItemID == 8880041 || ItemID == 8880051 || ItemID == 8880061 || ItemID == 8880071 || ItemID == 8880081 || ItemID == 8880091 || ItemID == 8880101) { Money = 0; } Item Source = gc.Character.Items.getItem(Type, Slot); if (Source != null) { if (Source.Quantity > Quantity) { if (Quantity <= 0) { return; } gc.Character.Items[(InventoryType.ItemType)Source.Type, Source.Slot].Quantity -= Quantity; } else { if (Quantity > Source.Quantity) { return; } gc.Character.Items.Remove(Type, Slot); } gc.Character.Money += (Money * Quantity); InventoryPacket.getInvenMoney(gc, gc.Character.Money, Money); InventoryHandler.UpdateInventory(gc, Type); } }
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 List <ILifeMovementFragment> ParseMovement(InPacket lea) { var res = new List <ILifeMovementFragment>(); var numCommands = lea.ReadByte(); for (var i = 0; i < numCommands; i++) { var command = lea.ReadByte(); switch (command) { case 0: // normal move case 5: case 17: // Float { var xpos = lea.ReadShort(); var ypos = lea.ReadShort(); var xwobble = lea.ReadShort(); var ywobble = lea.ReadShort(); var unk = lea.ReadShort(); var newstate = lea.ReadByte(); var duration = lea.ReadShort(); var alm = new AbsoluteLifeMovement(command, new Point(xpos, ypos), duration, newstate); alm.Unk = unk; alm.PixelsPerSecond = new Point(xwobble, ywobble); res.Add(alm); break; } case 1: case 2: case 6: // fj case 12: case 13: // Shot-jump-back thing case 16: // Float { var xmod = lea.ReadShort(); var ymod = lea.ReadShort(); var newstate = lea.ReadByte(); var duration = lea.ReadShort(); var rlm = new RelativeLifeMovement(command, new Point(xmod, ymod), duration, newstate); res.Add(rlm); // log.trace("Relative move {},{} state {}, duration {}", new Object[] { xmod, ymod, newstate, duration }); break; } case 3: case 4: // tele... -.- case 7: // assaulter case 8: // assassinate case 9: // rush case 14: { var xpos = lea.ReadShort(); var ypos = lea.ReadShort(); var xwobble = lea.ReadShort(); var ywobble = lea.ReadShort(); var newstate = lea.ReadByte(); var tm = new TeleportMovement(command, new Point(xpos, ypos), newstate); tm.PixelsPerSecond = new Point(xwobble, ywobble); res.Add(tm); break; } case 10: // change equip ??? { res.Add(new ChangeEquipSpecialAwesome(lea.ReadByte())); break; } case 11: // chair { var xpos = lea.ReadShort(); var ypos = lea.ReadShort(); var unk = lea.ReadShort(); var newstate = lea.ReadByte(); var duration = lea.ReadShort(); var cm = new ChairMovement(command, new Point(xpos, ypos), duration, newstate); cm.Unk = unk; res.Add(cm); break; } case 15: { var xpos = lea.ReadShort(); var ypos = lea.ReadShort(); var xwobble = lea.ReadShort(); var ywobble = lea.ReadShort(); var unk = lea.ReadShort(); var fh = lea.ReadShort(); var newstate = lea.ReadByte(); var duration = lea.ReadShort(); var jdm = new JumpDownMovement(command, new Point(xpos, ypos), duration, newstate); jdm.Unk = unk; jdm.PixelsPerSecond = new Point(xwobble, ywobble); jdm.Fh = fh; res.Add(jdm); break; } case 20: case 21: case 22: { var unk = lea.ReadShort(); var newstate = lea.ReadByte(); var acm = new ArasMovement(command, new Point(0, 0), unk, newstate); res.Add(acm); break; } default: { Console.WriteLine("Unhandeled movement command {0} received", command); //Console.WriteLine("Movement packet: {0}" lea.ToArray()); return(null); } } } if (numCommands != res.Count) { Console.WriteLine( "numCommands ({0}) does not match the number of deserialized movement commands ({1})", numCommands, res.Count); } return(res); }