public void Initialize(ref WS_PlayerData.CharacterObject objCharacter) { if (ObjectivesDeliver > 0) { ItemObject tmpItem = new(ObjectivesDeliver, objCharacter.GUID); if (!objCharacter.ItemADD(ref tmpItem)) { tmpItem.Delete(); Packets.PacketClass response = new(Opcodes.SMSG_QUESTGIVER_QUEST_FAILED); response.AddInt32(ID); response.AddInt32(4); objCharacter.client.Send(ref response); response.Dispose(); return; } objCharacter.LogLootItem(tmpItem, 1, Recieved: true, Created: false); } byte i = 0; do { checked { if (ObjectivesItem[i] != 0) { ProgressItem[i] = (byte)objCharacter.ItemCOUNT(ObjectivesItem[i]); } i = (byte)unchecked ((uint)(i + 1)); } }while (i <= 3u); if (((uint)ObjectiveFlags & 2u) != 0) { Explored = false; } IsCompleted(); }
private void DoTrade() { byte TargetReqItems = 0; byte TraderReqItems = 0; byte i = 0; do { checked { if (TraderSlots[i] > 0) { TargetReqItems = (byte)(TargetReqItems + 1); } if (TargetSlots[i] > 0) { TraderReqItems = (byte)(TraderReqItems + 1); } i = (byte)unchecked ((uint)(i + 1)); } }while (i <= 5u); try { if (Target.ItemFREESLOTS() < TargetReqItems) { Packets.PacketClass responseUnAccept2 = new(Opcodes.SMSG_TRADE_STATUS); try { responseUnAccept2.AddInt32(7); Target.client.SendMultiplyPackets(ref responseUnAccept2); TraderAccept = false; Trader.client.SendMultiplyPackets(ref responseUnAccept2); TraderAccept = false; } finally { responseUnAccept2.Dispose(); } Packets.PacketClass responseNoSlot2 = new(Opcodes.SMSG_INVENTORY_CHANGE_FAILURE); try { responseNoSlot2.AddInt8(50); responseNoSlot2.AddUInt64(0uL); responseNoSlot2.AddUInt64(0uL); responseNoSlot2.AddInt8(0); Target.client.Send(ref responseNoSlot2); } finally { responseNoSlot2.Dispose(); } return; } if (Trader.ItemFREESLOTS() < TraderReqItems) { Packets.PacketClass responseUnAccept = new(Opcodes.SMSG_TRADE_STATUS); try { responseUnAccept.AddInt32(7); Target.client.SendMultiplyPackets(ref responseUnAccept); TraderAccept = false; Trader.client.SendMultiplyPackets(ref responseUnAccept); TargetAccept = false; } finally { responseUnAccept.Dispose(); } Packets.PacketClass responseNoSlot = new(Opcodes.SMSG_INVENTORY_CHANGE_FAILURE); try { responseNoSlot.AddInt8(50); responseNoSlot.AddUInt64(0uL); responseNoSlot.AddUInt64(0uL); responseNoSlot.AddInt8(0); Trader.client.Send(ref responseNoSlot); } finally { responseNoSlot.Dispose(); } return; } if ((TargetGold > 0L) || (TraderGold > 0L)) { checked { Trader.Copper = Trader.Copper - TraderGold + TargetGold; Target.Copper = Target.Copper + TraderGold - TargetGold; Trader.SetUpdateFlag(1176, Trader.Copper); Target.SetUpdateFlag(1176, Target.Copper); } } if (TargetReqItems > 0 || TraderReqItems > 0) { byte j = 0; do { checked { if (TraderSlots[j] > 0) { var mySlot2 = (byte)(TraderSlots[j] & 0xFF); var myBag2 = (byte)(TraderSlots[j] >> 8); ItemObject myItem2 = null; myItem2 = (myBag2 != 0) ? Trader.Items[myBag2].Items[mySlot2] : Trader.Items[mySlot2]; if (myItem2.ItemInfo.ObjectClass != ITEM_CLASS.ITEM_CLASS_QUEST) { myItem2.OwnerGUID = Target.GUID; if (Target.ItemADD(ref myItem2)) { Trader.ItemREMOVE(myBag2, mySlot2, Destroy: false, Update: false); } } } if (TargetSlots[j] > 0) { var mySlot = (byte)(TargetSlots[j] & 0xFF); var myBag = (byte)(TargetSlots[j] >> 8); ItemObject myItem = null; myItem = (myBag != 0) ? Target.Items[myBag].Items[mySlot] : Target.Items[mySlot]; if (myItem.ItemInfo.ObjectClass != ITEM_CLASS.ITEM_CLASS_QUEST) { myItem.OwnerGUID = Trader.GUID; if (Trader.ItemADD(ref myItem)) { Target.ItemREMOVE(myBag, mySlot, Destroy: false, Update: false); } } } j = (byte)unchecked ((uint)(j + 1)); } }while (j <= 5u); } Trader.SendCharacterUpdate(); Target.SendCharacterUpdate(); Packets.PacketClass response = new(Opcodes.SMSG_TRADE_STATUS); try { response.AddInt32(8); Target.client.SendMultiplyPackets(ref response); Trader.client.SendMultiplyPackets(ref response); } finally { response.Dispose(); Dispose(); } } catch (Exception e) { WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "Error doing trade: {0}{1}", Environment.NewLine, e.ToString()); } }
public void Check() { if (Looters.Count != Rolls.Count) { return; } byte maxRollType = 0; foreach (KeyValuePair <WS_PlayerData.CharacterObject, int> looter2 in Looters) { if (looter2.Value == 1) { maxRollType = 1; } if (looter2.Value == 2 && maxRollType != 1) { maxRollType = 2; } } if (maxRollType == 0) { LootObject.GroupLootInfo.Remove(LootSlot); Packets.PacketClass response2 = new(Opcodes.SMSG_LOOT_ALL_PASSED); response2.AddUInt64(LootObject.GUID); response2.AddInt32(LootSlot); response2.AddInt32(Item.ItemID); response2.AddInt32(0); response2.AddInt32(0); Broadcast(ref response2); response2.Dispose(); return; } WS_PlayerData.CharacterObject looterCharacter = null; checked { int maxRoll = -1; foreach (KeyValuePair <WS_PlayerData.CharacterObject, int> looter in Looters) { if (looter.Value == maxRollType) { byte rollValue = (byte)WorldServiceLocator._WorldServer.Rnd.Next(0, 100); if (rollValue > maxRoll) { maxRoll = rollValue; looterCharacter = looter.Key; } Packets.PacketClass response = new(Opcodes.SMSG_LOOT_ROLL); response.AddUInt64(LootObject.GUID); response.AddInt32(LootSlot); response.AddUInt64(looter.Key.GUID); response.AddInt32(Item.ItemID); response.AddInt32(0); response.AddInt32(0); response.AddInt8(rollValue); response.AddInt8((byte)looter.Value); Broadcast(ref response); response.Dispose(); } } ItemObject itemObject = new(Item.ItemID, looterCharacter.GUID) { StackCount = Item.ItemCount }; ItemObject tmpItem = itemObject; Packets.PacketClass wonItem = new(Opcodes.SMSG_LOOT_ROLL_WON); wonItem.AddUInt64(LootObject.GUID); wonItem.AddInt32(LootSlot); wonItem.AddInt32(Item.ItemID); wonItem.AddInt32(0); wonItem.AddInt32(0); wonItem.AddUInt64(looterCharacter.GUID); wonItem.AddInt8((byte)maxRoll); wonItem.AddInt8(maxRollType); Broadcast(ref wonItem); if (looterCharacter.ItemADD(ref tmpItem)) { looterCharacter.LogLootItem(tmpItem, Item.ItemCount, Recieved: false, Created: false); LootObject.GroupLootInfo.Remove(LootSlot); LootObject.Items[LootSlot] = null; } else { tmpItem.Delete(); LootObject.GroupLootInfo.Remove(LootSlot); } } }
public void CreateCharacterItems(ref WS_PlayerData.CharacterObject objCharacter) { DataTable CreateInfoItems = new(); WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM playercreateinfo_item WHERE race = {(int)objCharacter.Race} AND class = {(int)objCharacter.Classe};", ref CreateInfoItems); if (CreateInfoItems.Rows.Count <= 0) { WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "No information found in playercreateinfo_item table for Race: {0}, Class: {1}", objCharacter.Race, objCharacter.Classe); } Dictionary <int, int> Items = new(); List <int> Used = new(); IEnumerator enumerator = default; try { enumerator = CreateInfoItems.Rows.GetEnumerator(); while (enumerator.MoveNext()) { DataRow row = (DataRow)enumerator.Current; Items.Add(row.As <int>("itemid"), row.As <int>("amount")); } } finally { if (enumerator is IDisposable) { (enumerator as IDisposable).Dispose(); } } foreach (var Item2 in Items) { if (!WorldServiceLocator._WorldServer.ITEMDatabase.ContainsKey(Item2.Key)) { WS_Items.ItemInfo newItem = new(Item2.Key); } if (WorldServiceLocator._WorldServer.ITEMDatabase[Item2.Key].ContainerSlots <= 0) { continue; } var Slots2 = WorldServiceLocator._WorldServer.ITEMDatabase[Item2.Key].GetSlots; var array = Slots2; foreach (var tmpSlot2 in array) { if (!objCharacter.Items.ContainsKey(tmpSlot2)) { objCharacter.ItemADD(Item2.Key, 0, tmpSlot2, Item2.Value); Used.Add(Item2.Key); break; } } } foreach (var Item in Items) { if (Used.Contains(Item.Key)) { continue; } var Slots = WorldServiceLocator._WorldServer.ITEMDatabase[Item.Key].GetSlots; var array2 = Slots; var num = 0; while (true) { if (num < array2.Length) { var tmpSlot = array2[num]; if (!objCharacter.Items.ContainsKey(tmpSlot)) { objCharacter.ItemADD(Item.Key, 0, tmpSlot, Item.Value); break; } num = checked (num + 1); continue; } objCharacter.ItemADD(Item.Key, byte.MaxValue, byte.MaxValue, Item.Value); break; } } }