void Player_DropItem(byte slot)
{
#region Drop Item
try
{
if (Character.Action.nAttack) return;
if (Character.Action.sAttack) return;
if (Character.Stall.Stallactive) return;
if (Character.State.Exchanging) return;
if (Character.Alchemy.working) return;
if (Character.State.Busy) return;
if (Character.Network.Guild.UsingStorage) return;
//Else we continue
else
{
//Get item information from slot.
Global.slotItem item = GetItem((uint)Character.Information.CharacterID, slot, 0);
//Check if the item is a item mall item before dropping.
if (Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.AVATAR28D ||
Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.CHANGESKIN ||
Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.GLOBALCHAT ||
Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.INVENTORYEXPANSION ||
Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.REVERSESCROLL ||
Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.STALLDECORATION ||
Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.WAREHOUSE ||
Data.ItemBase[item.ID].Etctype == Global.item_database.EtcType.AVATAR28D ||
Data.ItemBase[item.ID].Type == Global.item_database.ArmorType.AVATAR ||
Data.ItemBase[item.ID].Type == Global.item_database.ArmorType.AVATARATTACH ||
Data.ItemBase[item.ID].Type == Global.item_database.ArmorType.AVATARHAT ||
Data.ItemBase[item.ID].Pettype == Global.item_database.PetType.ATTACKPET ||
Data.ItemBase[item.ID].Pettype == Global.item_database.PetType.GRABPET)
return;
//If the id model is lower then 4 dont allow to drop.
//Gold drop requires another drop part.
if (item.ID < 4) return;
//Anti hack check
int owner = MsSQL.GetDataInt("SELECT * FROM char_items WHERE id='" + item.dbID + "'", "owner");
//If the player really is the owner of this item we continue to drop it.
if (owner == Character.Information.CharacterID)
{
//Check for item amount.
if (item.Amount <= Data.ItemBase[item.ID].Max_Stack)
{
//Spawn new item globally
world_item sitem = new world_item();
sitem.Model = item.ID;
sitem.Ids = new Global.ID(Global.ID.IDS.World);
sitem.UniqueID = sitem.Ids.GetUniqueID;
sitem.amount = item.Amount;
sitem.PlusValue = item.PlusValue;
sitem.x = Character.Position.x;
sitem.z = Character.Position.z;
sitem.y = Character.Position.y;
Systems.aRound(ref sitem.x, ref sitem.y, 1);
sitem.xSec = Character.Position.xSec;
sitem.ySec = Character.Position.ySec;
//Todo sniff structure for ticket / jewelry box item drop
if (Data.ItemBase[sitem.Model].Etctype == Global.item_database.EtcType.EVENT)
sitem.Type = 4;
#region Amount definition
else if (Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.BLADE ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.CH_SHIELD ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_SHIELD ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.BOW ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_AXE ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_CROSSBOW ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_DAGGER ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_DARKSTAFF ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_HARP ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_STAFF ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_SWORD ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_TSTAFF ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EU_TSWORD ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.GLAVIE ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.SPEAR ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.SWORD ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.EARRING ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.RING ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.NECKLACE ||
Data.ItemBase[sitem.Model].Type == Global.item_database.ArmorType.ARMOR ||
Data.ItemBase[sitem.Model].Type == Global.item_database.ArmorType.GARMENT ||
Data.ItemBase[sitem.Model].Type == Global.item_database.ArmorType.GM ||
Data.ItemBase[sitem.Model].Type == Global.item_database.ArmorType.HEAVY ||
Data.ItemBase[sitem.Model].Type == Global.item_database.ArmorType.LIGHT ||
Data.ItemBase[sitem.Model].Type == Global.item_database.ArmorType.PROTECTOR ||
Data.ItemBase[sitem.Model].Itemtype == Global.item_database.ItemType.AVATAR ||
Data.ItemBase[sitem.Model].Type == Global.item_database.ArmorType.ROBE)
sitem.Type = 2;
else
sitem.Type = 3;
#endregion
sitem.fromType = 6;
sitem.fromOwner = Character.Information.UniqueID;
sitem.downType = false;
sitem.Owner = 0;
sitem.Send(Packet.ObjectSpawn(sitem), true);
Systems.WorldItem.Add(sitem);
//Send visual packet for removing the item from inventory.
client.Send(Packet.DespawnFromInventory(sitem.UniqueID));
client.Send(Packet.MoveItem(7, slot, 0, 0, 0, "DELETE_ITEM"));
//Update database and remove the item
MsSQL.UpdateData("delete from char_items where itemnumber='item" + slot + "' AND owner='" + Character.Information.CharacterID + "'");
//Save player information
SavePlayerInfo();
}
else
return;
}
//If the player is not the owner of the item beeing dropped we ban the player.
else
{
Disconnect("ban");
Console.WriteLine("Autobanned user: " + Player.AccountName + " Due to hacking");
}
}
}
catch (Exception ex)
{
Console.WriteLine("Player_DropItem Error {0}", ex);
Systems.Debugger.Write(ex);
}
#endregion
}