public BonusUser RegisterUser(BonusUser requestedUser) { // use the player-id to request and retrieve the available bonuses Console.WriteLine("Retrieving available bonuses for player Id: {0} ...", requestedUser.PlayerId); Thread.Sleep(1500); // send request to corresponding Bonus system service Console.WriteLine("UserID {0} has: ", requestedUser.PlayerId); requestedUser.AvailableBonuses = new List <string>(); Random rnd = new Random(); requestedUser.AvailableBonuses.Add(new Guid().ToString()); requestedUser.AvailableBonuses.Add(new Guid().ToString()); Console.WriteLine("- applicable bonuses: " + requestedUser.AvailableBonuses.Count); return(requestedUser); }
public static void HandlePickupDrop(Character chr, Packet packet) { // 5F 18 FF 12 01 00 00 00 00 packet.Skip(4); // pos? int dropid = packet.ReadInt(); if (chr.AssertForHack(chr.Room != null, "Trying to loot a drop while in a 'room'") || !chr.Field.DropPool.Drops.TryGetValue(dropid, out Drop drop) || !drop.CanTakeDrop(chr)) { InventoryPacket.NoChange(chr); return; } var dropLootRange = drop.Pt2 - chr.Position; chr.AssertForHack(dropLootRange > 200, "Possible drop VAC! Distance: " + dropLootRange, dropLootRange > 250); bool SentDropNotice = false; Reward reward = drop.Reward; int dropNoticeItemIdOrMesos = reward.Drop; short pickupAmount = reward.Amount; if (reward.Mesos) { // Party meso distribution if (drop.SourceID != 0 && chr.PartyID != 0 && drop.OwnPartyID == chr.PartyID) { var PartyData = chr.Field.GetInParty(chr.PartyID); var Count = PartyData.Count(); if (Count > 1) { SentDropNotice = true; var Base = drop.Reward.Drop * 0.8 / Count + 0.5; Base = Math.Floor(Base); if (Base <= 0.0) { Base = 0.0; } var Bonus = Convert.ToInt32(drop.Reward.Drop - Count * Base); if (Bonus < 0) { Bonus = 0; } drop.Reward.Drop = Convert.ToInt32(Base); foreach (var BonusUser in PartyData) { int mesosGiven = reward.Drop; if (chr.ID == BonusUser.ID) { mesosGiven += Bonus; } // Now figure out what we really gave the user mesosGiven = BonusUser.AddMesos(mesosGiven, true); Common.Tracking.MesosTransfer.PlayerLootMesos(drop.SourceID, chr.ID, mesosGiven, "Party " + chr.PartyID + ", " + chr.MapID + ", " + drop.GetHashCode()); CharacterStatsPacket.SendGainDrop(BonusUser, true, mesosGiven, 0); } } } if (!SentDropNotice) { dropNoticeItemIdOrMesos = chr.AddMesos(reward.Drop, true); Common.Tracking.MesosTransfer.PlayerLootMesos( drop.SourceID, chr.ID, dropNoticeItemIdOrMesos, chr.MapID + ", " + drop.GetHashCode() ); } } else if (Constants.isStar(reward.ItemID)) { if (!chr.Inventory.HasSlotsFreeForItem(reward.ItemID, reward.Amount, Constants.isStackable(reward.ItemID))) { CannotLoot(chr, -1); InventoryPacket.NoChange(chr); return; } var rewardItem = drop.Reward.GetData(); chr.Inventory.AddItem2(rewardItem); ItemTransfer.ItemPickedUp(chr.ID, chr.MapID, reward.ItemID, reward.Amount, chr.MapID + ", " + drop.GetHashCode(), rewardItem); } else if (chr.Inventory.AddItem2(drop.Reward.GetData()) == drop.Reward.Amount) { CannotLoot(chr, -1); InventoryPacket.NoChange(chr); // ._. stupid nexon return; } else { if (Constants.isEquip(drop.Reward.ItemID)) { ItemTransfer.ItemPickedUp(chr.ID, chr.MapID, reward.ItemID, reward.Amount, chr.MapID + ", " + drop.GetHashCode(), drop.Reward.GetData()); } } if (!SentDropNotice) { CharacterStatsPacket.SendGainDrop(chr, reward.Mesos, dropNoticeItemIdOrMesos, pickupAmount); } chr.Field.DropPool.RemoveDrop(drop, RewardLeaveType.FreeForAll, chr.ID); }