/// <summary> /// Occurs when canceling the trade /// </summary> private void CM_TRADECANCEL(CMSG_TRADECANCEL cpkt) { if (this.character.TradeSession != null) { //OBTAIN THE ORGIN TARGET Character target = (this.character.TradeSession.Source == this.character) ? this.character.TradeSession.Target : this.character.TradeSession.Source; SMSG_TRADERESULT2 spkt = new SMSG_TRADERESULT2(); spkt.SessionId = target.id; spkt.Reason = (byte)TradeResult.TargetCanceled; target.client.Send((byte[])spkt); this.character.TradeSession.Target.TradeSession = null; this.character.TradeSession = null; } }
/// <summary> /// This function will notify the people on the tradesession the you /// have set the amount of money to trade. /// </summary> /// <param name="cpkt"></param> private void CM_TRADEMONEY(CMSG_TRADEZENY cpkt) { if (this.character.TradeSession != null) { //OBTAIN THE ORGIN TARGET Character target = (this.character.TradeSession.Source == this.character) ? this.character.TradeSession.Target : this.character.TradeSession.Source; if (cpkt.Zeny > this.character.ZENY) { //NOT ENOUGH MONEY SMSG_TRADERESULT2 spkt = new SMSG_TRADERESULT2(); spkt.Reason = (byte)TradeResult.NotEnoughMoney; spkt.SessionId = this.character.id; this.Send((byte[])spkt); } else { //THIS IS USED BY YOURSELF YOU HAVE SET YOUR AMOUNT OF MONEY SMSG_TRADEZENY spkt = new SMSG_TRADEZENY(); spkt.Zeny = cpkt.Zeny; spkt.SessionId = this.character.id; this.Send((byte[])spkt); //THIS IS USED TO NOTIFY THE OTHER PERSON YOU HAVE SET THE AMOUNT OF MONEY SMSG_TRADEZENYOTHER spkt2 = new SMSG_TRADEZENYOTHER(); spkt2.SessionId = target.id; spkt2.Zeny = cpkt.Zeny; target.client.Send((byte[])spkt2); //SET THE MONEY if (this.character == this.character.TradeSession.Source) { this.character.TradeSession.ZenySource = cpkt.Zeny; } else { this.character.TradeSession.ZenyTarget = cpkt.Zeny; } } } }
/// <summary> /// Occurs when your aggreeing with the trade. /// After the trade content has been agreed. /// </summary> private void CM_TRADECONFIRM(CMSG_TRADECONFIRM cpkt) { TradeSession session = this.character.TradeSession; if (session != null) { //OBTAIN THE ORGIN TARGET Character target; TradeSession.TradeItem[] Items; if (this.character.TradeSession.Source == this.character) { target = session.Target; Items = session.TargetItem; } else { target = session.Source; Items = session.SourceItem; } //Calculate required slots int slots = 0; for (int i = 0; i < 16; i++) { if (Items[i] == null) { continue; } slots++; } if (slots > this.character.container.Capacity - this.character.container.Count) { //Not enough space oponent SMSG_TRADERESULT2 spkt = new SMSG_TRADERESULT2(); spkt.Reason = (byte)TradeResult.TargetNotEnoughInventorySpace; spkt.SessionId = target.id; target.client.Send((byte[])spkt); //Not enough space myself SMSG_TRADERESULT2 spkt2 = new SMSG_TRADERESULT2(); spkt2.Reason = (byte)TradeResult.NotEnoughIventorySpace; spkt2.SessionId = this.character.id; this.Send((byte[])spkt2); //Set tradesession to null; this.character.TradeSession = null; target.TradeSession = null; return; } else { if (session.Source == this.character) { session.SourceHasAgreed = true; } else { session.TargetHasAgreed = true; } } if (session.TargetHasAgreed && session.SourceHasAgreed) { target.ZENY += session.ZenySource; this.character.ZENY -= session.ZenySource; target.ZENY -= session.ZenyTarget; this.character.ZENY += session.ZenyTarget; List <Rag2Item> SourceList = new List <Rag2Item>(); List <Rag2Item> TargetList = new List <Rag2Item>(); for (int i = 0; i < 16; i++) { TradeSession.TradeItem item = session.SourceItem[i]; if (item == null) { continue; } Rag2Item ragitem = this.character.container[item.Slot]; if (ragitem.count - item.Count == 0) { SourceList.Add(ragitem); this.character.container.RemoveAt(item.Slot); SMSG_DELETEITEM spkt = new SMSG_DELETEITEM(); spkt.Container = 2; spkt.Index = item.Slot; spkt.SessionId = this.character.id; spkt.UpdateReason = (byte)ItemUpdateReason.SendToTrader; this.Send((byte[])spkt); } else { SourceList.Add(ragitem.Clone(item.Count)); ragitem.count -= item.Count; SMSG_UPDATEITEM spkt = new SMSG_UPDATEITEM(); spkt.Container = 2; spkt.Index = item.Slot; spkt.SessionId = this.character.id; spkt.UpdateReason = (byte)ItemUpdateReason.SendToTrader; spkt.UpdateType = 4; this.Send((byte[])spkt); } } for (int i = 0; i < 16; i++) { TradeSession.TradeItem item = session.TargetItem[i]; if (item == null) { continue; } Rag2Item ragitem = target.container[item.Slot]; if (ragitem.count - item.Count == 0) { TargetList.Add(ragitem); this.character.container.RemoveAt(item.Slot); SMSG_DELETEITEM spkt = new SMSG_DELETEITEM(); spkt.Container = 2; spkt.Index = item.Slot; spkt.SessionId = target.id; spkt.UpdateReason = (byte)ItemUpdateReason.SendToTrader; target.client.Send((byte[])spkt); } else { TargetList.Add(ragitem.Clone(item.Count)); ragitem.count -= item.Count; SMSG_UPDATEITEM spkt = new SMSG_UPDATEITEM(); spkt.Container = 2; spkt.Index = item.Slot; spkt.SessionId = target.id; spkt.UpdateReason = (byte)ItemUpdateReason.SendToTrader; spkt.UpdateType = 4; target.client.Send((byte[])spkt); } } for (int i = 0; i < SourceList.Count; i++) { Rag2Item ragitem = SourceList[i]; int index = target.container.Add(ragitem); SMSG_ADDITEM spkt = new SMSG_ADDITEM(); spkt.Container = 2; spkt.UpdateReason = (byte)ItemUpdateReason.ReceiveFromTrade; spkt.SessionId = target.id; spkt.SetItem(ragitem, index); target.client.Send((byte[])spkt); } for (int i = 0; i < TargetList.Count; i++) { Rag2Item ragitem = TargetList[i]; int index = this.character.container.Add(ragitem); SMSG_ADDITEM spkt = new SMSG_ADDITEM(); spkt.Container = 2; spkt.UpdateReason = (byte)ItemUpdateReason.ReceiveFromTrade; spkt.SessionId = this.character.id; spkt.SetItem(ragitem, index); this.Send((byte[])spkt); } //Update zeny yourself SMSG_SENDZENY spkt4 = new SMSG_SENDZENY(); spkt4.SessionId = this.character.id; spkt4.Zeny = this.character.ZENY; this.Send((byte[])spkt4); //Update zeny opponent SMSG_SENDZENY spkt5 = new SMSG_SENDZENY(); spkt5.SessionId = target.id; spkt5.Zeny = target.ZENY; target.client.Send((byte[])spkt5); //Set traderesult to succesfull SMSG_TRADERESULT2 spkt3 = new SMSG_TRADERESULT2(); spkt3.SessionId = this.character.id; this.Send((byte[])spkt3); //Set traderesult successfull oponent SMSG_TRADERESULT2 spkt2 = new SMSG_TRADERESULT2(); spkt2.SessionId = target.id; target.client.Send((byte[])spkt2); //Set the tradesession to null this.character.TradeSession = null; target.TradeSession = null; } } }
/// <summary> /// Occurs when setting an tradeitem /// </summary> /// <param name="cpkt"></param> private void CM_TRADEITEM(CMSG_TRADEITEM cpkt) { byte status = 1; try { //OBTAIN THE ORGIN TARGET Character target; TradeSession.TradeItem[] Items; if (this.character.TradeSession.Source == this.character) { target = this.character.TradeSession.Target; Items = this.character.TradeSession.SourceItem; } else { target = this.character.TradeSession.Source; Items = this.character.TradeSession.TargetItem; } Rag2Item item = this.character.container[cpkt.Item]; if (item == null) { SMSG_TRADERESULT2 spkt = new SMSG_TRADERESULT2(); spkt.Reason = (byte)TradeResult.Error; spkt.SessionId = this.character.id; this.Send((byte[])spkt); } if (item.tradeable == false) { SMSG_TRADERESULT2 spkt = new SMSG_TRADERESULT2(); spkt.Reason = (byte)TradeResult.ItemNotTradeable; spkt.SessionId = this.character.id; this.Send((byte[])spkt); } else if (cpkt.Count > item.count) { SMSG_TRADERESULT2 spkt = new SMSG_TRADERESULT2(); spkt.Reason = (byte)TradeResult.NotEnoughItems; spkt.SessionId = this.character.id; this.Send((byte[])spkt); } else { TradeSession.TradeItem item2 = new TradeSession.TradeItem(); item2.Count = cpkt.Count; item2.Slot = cpkt.Item; Items[cpkt.Slot] = item2; SMSG_TRADEITEMOTHER spkt = new SMSG_TRADEITEMOTHER(); spkt.Tradeslot = cpkt.Slot; spkt.Item = item; spkt.SessionId = target.id; target.client.Send((byte[])spkt); status = 0; } } finally { SMSG_TRADEITEM spkt = new SMSG_TRADEITEM(); spkt.ItemSlot = cpkt.Item; spkt.Tradeslot = cpkt.Slot; spkt.Count = cpkt.Count; spkt.Status = status; spkt.SessionId = this.character.id; this.Send((byte[])spkt); } }