/// <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 _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); }
/// <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); }
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 _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 _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); }
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); }
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(); }
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; } }
//error learning a skill private void _handleStatSkillReply(OldPacket pkt) { //short - should always be SKILLMASTER_REMOVE_ITEMS (1) or SKILLMASTER_WRONG_CLASS (2) //short - character class if (OnSpellLearnError != null) { OnSpellLearnError((SkillMasterReply)pkt.GetShort(), pkt.GetShort()); } }
//skill point added to spell private void _handleStatSkillAccept(OldPacket pkt) { //short - character skill pts remaining //short - stat ID (spell ID) //short - spell level if (OnSpellTrain != null) { OnSpellTrain(pkt.GetShort(), pkt.GetShort(), pkt.GetShort()); } }
private void _handleSpellRequest(OldPacket pkt) { short fromPlayerID = pkt.GetShort(); short spellID = pkt.GetShort(); if (OnOtherPlayerStartCastSpell != null) { OnOtherPlayerStartCastSpell(fromPlayerID, spellID); } }
internal InProgressQuestData(OldPacket pkt) { _name = pkt.GetBreakString(); _description = pkt.GetBreakString(); _icon = (BookIcon)pkt.GetShort(); _progress = pkt.GetShort(); _target = pkt.GetShort(); if (pkt.GetByte() != 255) { throw new ArgumentException("Malformed quest packet", nameof(pkt)); } }
internal LevelUpStats(OldPacket pkt, bool includeExp) { //includeExp will be false when leveling up from NPC, true from EXPReward //NPC handler happens slightly differently exp = includeExp ? pkt.GetInt() : 0; level = pkt.GetChar(); stat = pkt.GetShort(); skill = pkt.GetShort(); maxhp = pkt.GetShort(); maxtp = pkt.GetShort(); maxsp = pkt.GetShort(); }
private void _handleTradeOpen(OldPacket pkt) { if (OnTradeOpen == null) { return; } short player1ID = pkt.GetShort(); string player1Name = pkt.GetBreakString(); short player2ID = pkt.GetShort(); string player2Name = pkt.GetBreakString(); OnTradeOpen(player1ID, player1Name, player2ID, player2Name); }
private void _handleItemGet(OldPacket pkt) { if (OnGetItemFromMap == null) { return; } short uid = pkt.GetShort(); short id = pkt.GetShort(); int amountTaken = pkt.GetThree(); byte weight = pkt.GetChar(); byte maxWeight = pkt.GetChar(); OnGetItemFromMap(uid, id, amountTaken, weight, maxWeight); }
internal CharacterLoginData(OldPacket pkt) { name = pkt.GetBreakString(); id = pkt.GetInt(); level = pkt.GetChar(); gender = pkt.GetChar(); hairstyle = pkt.GetChar(); haircolor = pkt.GetChar(); race = pkt.GetChar(); admin = (AdminLevel)pkt.GetChar(); boots = pkt.GetShort(); armor = pkt.GetShort(); hat = pkt.GetShort(); shield = pkt.GetShort(); weapon = pkt.GetShort(); }
private void _handleNPCJunk(OldPacket pkt) { if (OnRemoveChildNPCs != null) { OnRemoveChildNPCs(pkt.GetShort()); } }
private void _handleTradeClose(OldPacket pkt) { if (OnTradeCancel != null) { OnTradeCancel(pkt.GetShort()); } }
//sent when your trade partner agrees private void _handleTradeAgree(OldPacket pkt) { if (OnTradeOtherPlayerAgree != null) { OnTradeOtherPlayerAgree(pkt.GetShort(), pkt.GetChar() != 0); } }
private void _handleItemRemove(OldPacket pkt) { if (OnRemoveItemFromMap != null) { OnRemoveItemFromMap(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()); } }
//forgetting a skill private void _handleStatSkillRemove(OldPacket pkt) { //short - spell id if (OnSpellForget != null) { OnSpellForget(pkt.GetShort()); } }
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 } }
//success learning a skill private void _handleStatSkillTake(OldPacket pkt) { //short - spell id //int - character gold remaining if (OnSpellLearnSuccess != null) { OnSpellLearnSuccess(pkt.GetShort(), pkt.GetInt()); } }
private void _handleEmotePlayer(OldPacket pkt) { short playerID = pkt.GetShort(); Emote emote = (Emote)pkt.GetChar(); if (OnOtherPlayerEmote != null) { OnOtherPlayerEmote(playerID, emote); } }
internal SkillmasterData(OldPacket pkt) { m_id = pkt.GetShort(); m_title = pkt.GetBreakString(); m_skills = new List <Skill>(); while (pkt.ReadPos < pkt.Length) { m_skills.Add(new Skill(pkt)); } }
private void _handleTradeRequest(OldPacket pkt) { pkt.Skip(1); //something - will always be 123 from this client short playerID = pkt.GetShort(); string name = pkt.GetEndString(); if (OnTradeRequested != null) { OnTradeRequested(playerID, name); } }
private void _handleItemAdd(OldPacket pkt) { if (OnDropItem == null) { return; } OldMapItem item = new OldMapItem { ItemID = pkt.GetShort(), UniqueID = pkt.GetShort(), Amount = pkt.GetThree(), X = pkt.GetChar(), Y = pkt.GetChar(), DropTime = DateTime.Now, IsNPCDrop = false, OwningPlayerID = -1 //another player dropped. drop protection says "Item protected" w/o player name }; OnDropItem(-1, 0, 0, item); }
/// <summary> /// Handles LOCKER_GET from server for taking an item from locker /// </summary> private void _handleLockerGet(OldPacket pkt) { if (OnLockerItemChange == null) { return; } short itemID = pkt.GetShort(); int amount = pkt.GetThree(); byte weight = pkt.GetChar(); byte maxWeight = pkt.GetChar(); List <InventoryItem> items = new List <InventoryItem>(); while (pkt.ReadPos != pkt.Length) { items.Add(new InventoryItem(pkt.GetShort(), pkt.GetThree())); } OnLockerItemChange(itemID, amount, weight, maxWeight, true, items); }