private void ProcessSpecial(PlayerObject player, NPCPage page)
{
List<UserItem> allGoods = new List<UserItem>();
var key = page.Key.ToUpper();
switch (key)
{
case BuyKey:
case BuySellKey:
var sentGoods = new List<UserItem>(Goods);
for (int i = 0; i < Goods.Count; i++)
player.CheckItem(Goods[i]);
if (Settings.GoodsOn)
{
var callingNPC = NPCObject.Get(player.NPCObjectID);
if (callingNPC != null)
{
for (int i = 0; i < callingNPC.UsedGoods.Count; i++)
player.CheckItem(callingNPC.UsedGoods[i]);
}
sentGoods.AddRange(callingNPC.UsedGoods);
}
player.Enqueue(new S.NPCGoods { List = sentGoods, Rate = PriceRate(player), Type = PanelType.Buy, HideAddedStats = Settings.GoodsHideAddedStats });
if (key == BuySellKey)
{
player.Enqueue(new S.NPCSell());
}
break;
case SellKey:
player.Enqueue(new S.NPCSell());
break;
case RepairKey:
player.Enqueue(new S.NPCRepair { Rate = PriceRate(player) });
break;
case SRepairKey:
player.Enqueue(new S.NPCSRepair { Rate = PriceRate(player) });
break;
case CraftKey:
for (int i = 0; i < CraftGoods.Count; i++)
player.CheckItemInfo(CraftGoods[i].Item.Info);
player.Enqueue(new S.NPCGoods { List = (from x in CraftGoods where x.CanCraft(player) select x.Item).ToList(), Rate = PriceRate(player), Type = PanelType.Craft });
break;
case RefineKey:
if (player.Info.CurrentRefine != null)
{
player.ReceiveChat("You're already refining an item.", ChatType.System);
player.Enqueue(new S.NPCRefine { Rate = (Settings.RefineCost), Refining = true });
break;
}
else
player.Enqueue(new S.NPCRefine { Rate = (Settings.RefineCost), Refining = false });
break;
case RefineCheckKey:
player.Enqueue(new S.NPCCheckRefine());
break;
case RefineCollectKey:
player.CollectRefine();
break;
case ReplaceWedRingKey:
player.Enqueue(new S.NPCReplaceWedRing { Rate = Settings.ReplaceWedRingCost });
break;
case StorageKey:
player.SendStorage();
player.Enqueue(new S.NPCStorage());
break;
case BuyBackKey:
{
if (Settings.GoodsOn)
{
var callingNPC = NPCObject.Get(player.NPCObjectID);
if (callingNPC != null)
{
if (!callingNPC.BuyBack.ContainsKey(player.Name)) callingNPC.BuyBack[player.Name] = new List<UserItem>();
for (int i = 0; i < callingNPC.BuyBack[player.Name].Count; i++)
{
player.CheckItem(callingNPC.BuyBack[player.Name][i]);
}
player.Enqueue(new S.NPCGoods { List = callingNPC.BuyBack[player.Name], Rate = PriceRate(player), Type = PanelType.Buy });
}
}
}
break;
case BuyUsedKey:
{
if (Settings.GoodsOn)
{
var callingNPC = NPCObject.Get(player.NPCObjectID);
if (callingNPC != null)
{
for (int i = 0; i < callingNPC.UsedGoods.Count; i++)
player.CheckItem(callingNPC.UsedGoods[i]);
player.Enqueue(new S.NPCGoods { List = callingNPC.UsedGoods, Rate = PriceRate(player), Type = PanelType.BuySub, HideAddedStats = Settings.GoodsHideAddedStats });
}
}
}
break;
case ConsignKey:
player.Enqueue(new S.NPCConsign());
break;
case MarketKey:
player.UserMatch = false;
player.GetMarket(string.Empty, ItemType.Nothing);
break;
case GuildCreateKey:
if (player.Info.Level < Settings.Guild_RequiredLevel)
{
player.ReceiveChat(String.Format("You have to be at least level {0} to create a guild.", Settings.Guild_RequiredLevel), ChatType.System);
}
else if (player.MyGuild == null)
{
player.CanCreateGuild = true;
player.Enqueue(new S.GuildNameRequest());
}
else
player.ReceiveChat("You are already part of a guild.", ChatType.System);
break;
case RequestWarKey:
if (player.MyGuild != null)
{
if (player.MyGuildRank != player.MyGuild.Ranks[0])
{
player.ReceiveChat("You must be the leader to request a war.", ChatType.System);
return;
}
player.Enqueue(new S.GuildRequestWar());
}
else
{
player.ReceiveChat(GameLanguage.NotInGuild, ChatType.System);
}
break;
case SendParcelKey:
player.Enqueue(new S.MailSendRequest());
break;
case CollectParcelKey:
sbyte result = 0;
if (player.GetMailAwaitingCollectionAmount() < 1)
{
result = -1;
}
else
{
foreach (var mail in player.Info.Mail)
{
if (mail.Parcel) mail.Collected = true;
}
}
player.Enqueue(new S.ParcelCollected { Result = result });
player.GetMail();
break;
case AwakeningKey:
player.Enqueue(new S.NPCAwakening());
break;
case DisassembleKey:
player.Enqueue(new S.NPCDisassemble());
break;
case DowngradeKey:
player.Enqueue(new S.NPCDowngrade());
break;
case ResetKey:
player.Enqueue(new S.NPCReset());
break;
case PearlBuyKey:
for (int i = 0; i < Goods.Count; i++)
player.CheckItem(Goods[i]);
player.Enqueue(new S.NPCPearlGoods { List = Goods, Rate = PriceRate(player), Type = PanelType.Buy });
break;
}
}