private void _handleMessageOpen(OldPacket pkt) { if (OnStatusMessage != null) { OnStatusMessage(pkt.GetEndString()); } }
public bool ResetCharacterStatSkill() { OldPacket pkt = new OldPacket(PacketFamily.StatSkill, PacketAction.Junk); pkt.AddInt(1234); //shop ID, ignored by eoserv - eomain may require this to be correct return(!m_client.ConnectedAndInitialized || !Initialized || m_client.SendPacket(pkt)); }
/// <summary> /// Handler for CHEST_AGREE packet, sent as update to other characters near a chest that was modified by another player /// </summary> private void _handleChestAgree(OldPacket pkt) { if (OnChestAgree != null) { OnChestAgree(new ChestData(pkt, false)); } }
private void _upgrade() { if (LockerUpgrades == 7) { EOMessageBox.Show(DialogResourceID.LOCKER_UPGRADE_IMPOSSIBLE, EODialogButtons.Ok, EOMessageBoxStyle.SmallDialogSmallHeader); return; } int requiredGold = (LockerUpgrades + 1) * 1000; InventoryItem item = OldWorld.Instance.MainPlayer.ActiveCharacter.Inventory.Find(i => i.ItemID == 1); if (item.Amount < requiredGold) { EOMessageBox.Show(DialogResourceID.WARNING_YOU_HAVE_NOT_ENOUGH, "gold", EODialogButtons.Ok, EOMessageBoxStyle.SmallDialogSmallHeader); return; } EOMessageBox.Show(DialogResourceID.LOCKER_UPGRADE_UNIT, $"{requiredGold} gold?", EODialogButtons.OkCancel, EOMessageBoxStyle.SmallDialogSmallHeader, (o, e) => { if (e.Result == XNADialogResult.Cancel) { return; } OldPacket pkt = new OldPacket(PacketFamily.Locker, PacketAction.Buy); OldWorld.Instance.Client.SendPacket(pkt); }); }
/// <summary> /// Handles LOCKER_BUY from server when buying a locker unit upgrade /// </summary> /// <param name="pkt"></param> private void _handleLockerBuy(OldPacket pkt) { if (OnLockerUpgrade != null) { OnLockerUpgrade(pkt.GetInt(), pkt.GetChar()); //gold remaining, num upgrades } }
/// <summary> /// Handler for CHEST_OPEN packet, sent in response to main player opening a chest /// </summary> private void _handleChestOpen(OldPacket pkt) { if (OnChestOpened != null) { OnChestOpened(new ChestData(pkt, true)); } }
private void btnImportMultis_Click(object sender, EventArgs e) { string inp = Microsoft.VisualBasic.Interaction.InputBox("Paste the raw, colon-delimited packet data here: ", "Enter packet data"); if (inp.Length == 0) { return; } inp = inp.Replace(":", ""); if (inp.Length % 2 != 0) { return; } inp = inp.Substring(4); byte[] data = new byte[inp.Length / 2]; for (int i = 0; i < inp.Length; i += 2) { data[i / 2] = Convert.ToByte(inp.Substring(i, 2), 16); } //no need to decrypt since it's init data OldPacket pkt = new OldPacket(data); pkt.Skip(3); txtDMulti.Text = pkt.GetByte().ToString(); txtEMulti.Text = pkt.GetByte().ToString(); _packetProcessActions.SetEncodeMultiples(pkt.Get()[5], pkt.Get()[6]); }
/// <summary> /// Performas a synchronous request for the list of online players /// </summary> /// <param name="includeFullInfo">True if requesting the full information including Name, Title, Class, Guild, and Icon. False if requesting names only</param> /// <param name="list">The list of players represented by OnlineEntry objects</param> /// <returns>True if operation was successful, false otherwise.</returns> public bool RequestOnlinePlayers(bool includeFullInfo, out List <OnlineEntry> list) { list = null; if (!m_client.ConnectedAndInitialized || !Initialized) { return(false); } //wait for file if it is in process if (m_client.ExpectingFile && !m_init_responseEvent.WaitOne(Constants.ResponseFileTimeout)) { return(false); } m_client.ExpectingPlayerList = true; OldPacket pkt = new OldPacket(PacketFamily.Players, includeFullInfo ? PacketAction.Request : PacketAction.List); if (!m_client.SendPacket(pkt)) { return(false); } if (!m_init_responseEvent.WaitOne(Constants.ResponseTimeout)) { return(false); } list = m_init_onlinePlayerList; return(true); }
private void _handleSpellTargetGroup(OldPacket pkt) { if (OnCastSpellTargetGroup == null) { return; } short spellID = pkt.GetShort(); short fromPlayerID = pkt.GetShort(); short fromPlayerTP = pkt.GetShort(); short spellHealthGain = pkt.GetShort(); var spellTargets = new List <GroupSpellTarget>(); while (pkt.ReadPos != pkt.Length) { //malformed packet - eoserv puts 5 '255' bytes between party members if (pkt.GetBytes(5).Any(x => x != 255)) { return; } spellTargets.Add(new GroupSpellTarget(pkt)); } OnCastSpellTargetGroup(spellID, fromPlayerID, fromPlayerTP, spellHealthGain, spellTargets); }
//handlers private void _handleStatSkillOpen(OldPacket pkt) { if (OnSkillmasterOpen != null) { OnSkillmasterOpen(new SkillmasterData(pkt)); } }
/// <summary> /// Handles SHOP_CREATE from server, response to crafting an item /// </summary> private void _handleShopCreate(OldPacket pkt) { if (OnShopCraftItem == null) { return; } short itemID = pkt.GetShort(); byte weight = pkt.GetChar(); byte maxWeight = pkt.GetChar(); List <InventoryItem> inventoryItems = new List <InventoryItem>(4); while (pkt.ReadPos != pkt.Length) { if (pkt.PeekShort() <= 0) { break; } inventoryItems.Add(new InventoryItem(pkt.GetShort(), pkt.GetInt())); } OnShopCraftItem(itemID, weight, maxWeight, inventoryItems); }
private void _handleItemReply(OldPacket pkt) { if (OnUseItem != null) { OnUseItem(new ItemUseData(pkt)); } }
/// <summary> /// Handler for NPC_REPLY packet, when NPC takes damage from an attack (spell cast or weapon) but is still alive /// </summary> private void _handleNPCReply(OldPacket pkt) { if (OnNPCTakeDamage == null) { return; } short spellID = -1; if (pkt.Family == PacketFamily.Cast) { spellID = pkt.GetShort(); } short fromPlayerID = pkt.GetShort(); EODirection fromDirection = (EODirection)pkt.GetChar(); short npcIndex = pkt.GetShort(); int damageToNPC = pkt.GetThree(); int npcPctHealth = pkt.GetShort(); short fromTP = -1; if (pkt.Family == PacketFamily.Cast) { fromTP = pkt.GetShort(); } else if (pkt.GetChar() != 1) //some constant 1 in EOSERV { return; } OnNPCTakeDamage((byte)npcIndex, fromPlayerID, fromDirection, damageToNPC, npcPctHealth, spellID, fromTP); }
internal PaperdollDisplayData(OldPacket pkt) { //need to be applied to the character that is passed to the dialog name = pkt.GetBreakString(); home = pkt.GetBreakString(); partner = pkt.GetBreakString(); title = pkt.GetBreakString(); guild = pkt.GetBreakString(); rank = pkt.GetBreakString(); playerID = pkt.GetShort(); clas = pkt.GetChar(); gender = pkt.GetChar(); if (pkt.GetChar() != 0) { throw new ArgumentException("Invalid/malformed packet", nameof(pkt)); } paperdoll = new short[(int)EquipLocation.PAPERDOLL_MAX]; for (int i = 0; i < (int)EquipLocation.PAPERDOLL_MAX; ++i) { paperdoll[i] = pkt.GetShort(); } iconType = (PaperdollIconType)pkt.GetChar(); }
private void _handleSpellTargetOther(OldPacket pkt) { if (OnCastSpellTargetOther == null) { return; } short targetPlayerID = pkt.GetShort(); short sourcePlayerID = pkt.GetShort(); EODirection sourcePlayerDirection = (EODirection)pkt.GetChar(); short spellID = pkt.GetShort(); int recoveredHP = pkt.GetInt(); byte targetPercentHealth = pkt.GetChar(); short targetPlayerCurrentHP = -1; if (pkt.ReadPos != pkt.Length) //include current hp for player if main player is the target { targetPlayerCurrentHP = pkt.GetShort(); } OnCastSpellTargetOther( targetPlayerID, sourcePlayerID, sourcePlayerDirection, spellID, recoveredHP, targetPercentHealth, targetPlayerCurrentHP); }
private void _handleMusicPlayer(OldPacket pkt) { if (OnPlaySoundEffect != null) { OnPlaySoundEffect(pkt.GetChar()); } }
private void _handleNPCJunk(OldPacket pkt) { if (OnRemoveChildNPCs != null) { OnRemoveChildNPCs(pkt.GetShort()); } }
//sent when your trade partner agrees private void _handleTradeAgree(OldPacket pkt) { if (OnTradeOtherPlayerAgree != null) { OnTradeOtherPlayerAgree(pkt.GetShort(), pkt.GetChar() != 0); } }
private void _handleSpellTargetSelf(OldPacket pkt) { short fromPlayerID = pkt.GetShort(); short spellID = pkt.GetShort(); int spellHP = pkt.GetInt(); byte percentHealth = pkt.GetChar(); if (pkt.ReadPos == pkt.Length) { //another player was the source of this packet if (OnOtherPlayerCastSpellSelf != null) { OnOtherPlayerCastSpellSelf(fromPlayerID, spellID, spellHP, percentHealth); } return; } short characterHP = pkt.GetShort(); short characterTP = pkt.GetShort(); if (pkt.GetShort() != 1) //malformed packet! eoserv sends '1' here { return; } //main player was source of this packet if (OnCastSpellSelf != null) { OnCastSpellSelf(fromPlayerID, spellID, spellHP, percentHealth, characterHP, characterTP); } }
private void _handleItemRemove(OldPacket pkt) { if (OnRemoveItemFromMap != null) { OnRemoveItemFromMap(pkt.GetShort()); } }
private void _sharedTradeDataProcess(OldPacket pkt, TradeUpdateEvent handler) { if (handler == null) { return; } short player1ID = pkt.GetShort(); List <InventoryItem> player1Items = new List <InventoryItem>(); while (pkt.PeekByte() != 255) { player1Items.Add(new InventoryItem(pkt.GetShort(), pkt.GetInt())); } pkt.Skip(1); short player2ID = pkt.GetShort(); List <InventoryItem> player2Items = new List <InventoryItem>(); while (pkt.PeekByte() != 255) { player2Items.Add(new InventoryItem(pkt.GetShort(), pkt.GetInt())); } pkt.Skip(1); handler(player1ID, player1Items, player2ID, player2Items); }
private void _handleItemDrop(OldPacket pkt) { if (OnDropItem == null) { return; } short _id = pkt.GetShort(); int _amount = pkt.GetThree(); int characterAmount = pkt.GetInt(); //amount remaining for the character OldMapItem item = new OldMapItem { ItemID = _id, Amount = _amount, UniqueID = pkt.GetShort(), X = pkt.GetChar(), Y = pkt.GetChar(), //turn off drop protection since main player dropped it DropTime = DateTime.Now.AddSeconds(-5), IsNPCDrop = false, OwningPlayerID = 0 //id of 0 means the currently logged in player owns it }; byte characterWeight = pkt.GetChar(), characterMaxWeight = pkt.GetChar(); //character adjusted weights OnDropItem(characterAmount, characterWeight, characterMaxWeight, item); }
private void _handleTradeClose(OldPacket pkt) { if (OnTradeCancel != null) { OnTradeCancel(pkt.GetShort()); } }
//reset character private void _handleStatSkillJunk(OldPacket pkt) { if (OnCharacterStatsReset != null) { OnCharacterStatsReset(new StatResetData(pkt)); } }
//sent in response to you agreeing private void _handleTradeSpec(OldPacket pkt) { if (OnTradeYouAgree != null) { OnTradeYouAgree(pkt.GetChar() != 0); } }
//forgetting a skill private void _handleStatSkillRemove(OldPacket pkt) { //short - spell id if (OnSpellForget != null) { OnSpellForget(pkt.GetShort()); } }
//potion effect (only known use based on eoserv code) private void _handleEffectPlayer(OldPacket pkt) { if (OnEffectPotion != null) { OnEffectPotion(playerID: pkt.GetShort(), effectID: pkt.GetThree()); } }
private void _handleRecoverAgree(OldPacket pkt) { //when a heal item is used by another player if (OnPlayerHeal != null) { OnPlayerHeal(pkt.GetShort(), pkt.GetInt(), pkt.GetChar()); //player id - hp gain - percent heal } }
internal ItemUseData(OldPacket pkt) { type = (ItemType)pkt.GetChar(); itemID = pkt.GetShort(); characterAmount = pkt.GetInt(); weight = pkt.GetChar(); maxWeight = pkt.GetChar(); hpGain = hp = tp = 0; hairColor = 0; effect = 0; curecurse_stats = null; expreward_stats = null; //format differs based on item type //(keeping this in order with how eoserv ITEM_USE handler is ordered switch (type) { case ItemType.Teleport: /*Warp packet handles the rest!*/ break; case ItemType.Heal: { hpGain = pkt.GetInt(); hp = pkt.GetShort(); tp = pkt.GetShort(); } break; case ItemType.HairDye: { hairColor = pkt.GetChar(); } break; case ItemType.Beer: /*No additional data*/ break; case ItemType.EffectPotion: { effect = pkt.GetShort(); } break; case ItemType.CureCurse: { curecurse_stats = new CureCurseStats(pkt); } break; case ItemType.EXPReward: { //note: server packets may be incorrect at this point (src/handlers/Item.cpp) because of unused builder in eoserv //note: server also sends an ITEM_ACCEPT packet to surrounding players on level-up? expreward_stats = new LevelUpStats(pkt, true); } break; } }
//timed spikes private void _handleEffectReport(OldPacket pkt) { pkt.GetChar(); //always 83 - sent from eoserv when Map::TimedSpikes is called //as of rev 487 this is not sent anywhere else. May need to update event handler if this changes. if (OnTimedSpike != null) { OnTimedSpike(); } }