Пример #1
0
        public void RemoveItems(byte itemID, int numToRemove)
        {
            if (GetNumItemInInventory(itemID) == 0) return;
            ItemStack i = GetPlayerItemStackFromInventory(itemID);
            ServerItem serverItem = i.Item;
            int index = Array.IndexOf(Inventory, i);
            i.NumberItems -= numToRemove;

            if (i.NumberItems <= 0)
            {
                Packet p = new Packet1SCGameEvent(GameServer.GameEvents.Player_Inventory_Remove, (byte)index);
                GameServer.ServerNetworkManager.SendPacket(p, NetworkPlayer.NetConnection);
                Inventory[index] = new ItemStack();
                if (i.NumberItems < 0)
                {
                    RemoveItems(itemID, -i.NumberItems);
                }
            }
            else
            {
                Inventory[index] = i;
                Packet pack = new Packet1SCGameEvent(GameServer.GameEvents.Player_Inventory_Update, (byte)index, (byte)i.ItemID, i.NumberItems);
                GameServer.ServerNetworkManager.SendPacket(pack, NetworkPlayer.NetConnection);
            }
        }
Пример #2
0
        public void RemoveItemsAtSlot(int slot, byte itemID, int numToRemove)
        {
            if (GetNumItemInInventory(itemID) == 0) return;
            ItemStack i = Inventory[slot];

            if (i.ItemID != itemID)
            {
                RemoveItems(itemID, numToRemove);
                return;
            }

            ServerItem serverItem = i.Item;
            i.NumberItems -= numToRemove;

            if (i.NumberItems <= 0)
            {
                Packet p = new Packet1SCGameEvent(GameServer.GameEvents.Player_Inventory_Remove, (byte)slot);
                GameServer.ServerNetworkManager.SendPacket(p, NetworkPlayer.NetConnection);
                Inventory[slot] = new ItemStack();
                if (i.NumberItems < 0)
                {
                    RemoveItems(itemID, -i.NumberItems);
                }
            }
            else
            {
                Inventory[slot] = i;
                Packet pack = new Packet1SCGameEvent(GameServer.GameEvents.Player_Inventory_Update, (byte)slot, (byte)i.ItemID, i.NumberItems);
                GameServer.ServerNetworkManager.SendPacket(pack, NetworkPlayer.NetConnection);
            }
        }
Пример #3
0
        public void RemoveItemAt(int slot)
        {
            Inventory[slot] = new ItemStack(0, 0);

            Packet p = new Packet1SCGameEvent(GameServer.GameEvents.Player_Inventory_Remove, (byte)slot);
            GameServer.ServerNetworkManager.SendPacket(p, NetworkPlayer.NetConnection);
        }
Пример #4
0
        /// <summary>
        /// Picks up an item into the inventory
        /// </summary>
        /// <param name="item">The ItemStack to pick up</param>
        /// <param name="overflow">If true, then the extra items that are left over (can't be picked up) are dropped.</param>
        public void PickupItem(ItemStack item, bool overflow = false)
        {
            ServerItem serverItem = item.Item;
            ItemStack stack2 = new ItemStack();

            int start = _armorSize;
            int end = NetworkPlayer.PClass.GetPlayerInventorySize() + _armorSize;
            if (end > Inventory.Length) end = Inventory.Length;

            for (int i = start; i < end; i++)
            {
                ItemStack it = Inventory[i];
                if (it.ItemID == 0)
                {
                    if (item.NumberItems > serverItem.GetMaxStack())
                    {
                        stack2 = new ItemStack(item.NumberItems - serverItem.GetMaxStack(), serverItem.GetItemID());
                        item.NumberItems = serverItem.GetMaxStack();
                    }
                    Inventory[i] = item;
                    Packet pack = new Packet1SCGameEvent(GameServer.GameEvents.Player_Inventory_Update, (byte)i, (byte)Inventory[i].ItemID, Inventory[i].NumberItems);
                    GameServer.ServerNetworkManager.SendPacket(pack, NetworkPlayer.NetConnection);
                    if (stack2.ItemID != 0)
                    {
                        PickupItem(stack2);
                    }
                    return;
                }

                ServerItem sItem = it.Item;
                int maxStack = sItem.GetMaxStack();

                if (it.ItemID == item.ItemID)
                {
                    if (maxStack == it.NumberItems) continue;
                    int newTotal = it.NumberItems + item.NumberItems;
                    ItemStack stackTemp = new ItemStack();
                    if (newTotal > maxStack)
                    {
                        int newCur = maxStack - it.NumberItems;
                        stackTemp = new ItemStack(item.NumberItems - newCur, it.ItemID);
                        item.NumberItems = newCur;
                    }

                    Inventory[i] = new ItemStack(it.NumberItems + item.NumberItems, it.ItemID);
                    Packet pack = new Packet1SCGameEvent(GameServer.GameEvents.Player_Inventory_Update, (byte)i,
                                                         (byte)Inventory[i].ItemID,
                                                         Inventory[i].NumberItems);
                    GameServer.ServerNetworkManager.SendPacket(pack, NetworkPlayer.NetConnection);

                    if (stackTemp.NumberItems > 0)
                        PickupItem(stackTemp);
                    return;
                }
            }
        }
Пример #5
0
        public void UpdateCache()
        {
            var blockPos = new Vector2((int)(EntityPosition.X / GameServer.BlockSize), (int)(EntityPosition.Y / GameServer.BlockSize));

            short startX = (short)MathHelper.Clamp((int)blockPos.X - (750 / GameServer.BlockSize), 0, GameServer.WorldSizeX);
            short startY = (short)MathHelper.Clamp((int)blockPos.Y - (750 / GameServer.BlockSize), 0, GameServer.WorldSizeY);
            short endX = (short)MathHelper.Clamp(startX + 64, 0, GameServer.WorldSizeX);
            short endY = (short)MathHelper.Clamp(startY + 64, 0, GameServer.WorldSizeY);

            for (short x = startX; x < endX; x++)
            {
                Packet packet = new Packet();
                //Generate two bitmasks where each bit determines if the block's ID/MD are updated.
                long[] masks = GenerateRowBitMask(x);
                long maskID = masks[0];
                long maskMD = masks[1];
                //No updates
                if (maskID == 0 && maskMD == 0) continue;

                int numBitsID = GetNumBitsSet(maskID);
                int numBitsMD = GetNumBitsSet(maskMD);
                //If we're only setting one block, just ignore the bitmask and send the block itself.
                if (numBitsID == 1 && numBitsMD == 1)
                {
                    int oneX = 0;
                    int oneY = 0;
                    for (int i = 0; i < 64; i++)
                    {
                        if ((maskID & ((long)1 << i)) == 0)
                        {
                            if ((maskMD & ((long)1 << i)) == 0) continue;
                        }

                        oneX = x;
                        oneY = startY + i;
                    }
                    PlayerBlockCache[oneX, oneY].ID = GameServer.WorldBlocks[oneX, oneY].ID;
                    PlayerBlockCache[oneX, oneY].MetaData = GameServer.WorldBlocks[oneX, oneY].MetaData;
                    Packet packet2 = new Packet1SCGameEvent(GameServer.GameEvents.Block_Set, (short)oneX, (short)oneY, GameServer.WorldBlocks[oneX, oneY].ID, GameServer.WorldBlocks[oneX, oneY].MetaData);
                    GameServer.ServerNetworkManager.SendPacket(packet2, NetConnection);
                    continue;
                }

                for (int i = 0; i < endY - startY; i++)
                {
                    BlockData curData = GameServer.WorldBlocks[x, startY + i];
                    bool IDUpdate = (maskID & ((long) 1 << i)) != 0;
                    bool MDUpdate = (maskMD & ((long) 1 << i)) != 0;
                    if (!IDUpdate && !MDUpdate) continue;

                    if (IDUpdate)
                    {
                        packet.WriteShort(curData.ID);
                        PlayerBlockCache[x, startY + i].ID = curData.ID;
                    }
                    if(MDUpdate)
                    {
                        packet.WriteByte(curData.MetaData);
                        PlayerBlockCache[x, startY + i].MetaData = curData.MetaData;
                    }
                }

                Packet p = new Packet1SCGameEvent(GameServer.GameEvents.Block_Set_Line);
                p.WriteShort(x);
                p.WriteShort(startY);
                p.WriteLong(maskID);
                p.WriteLong(maskMD);
                p.WriteBytes(packet.GetData());
                GameServer.ServerNetworkManager.SendPacket(p, NetConnection);
            }
        }
        public void Update()
        {
            if (NetServer == null) return;
            NetIncomingMessage msg;
            while ((msg = NetServer.ReadMessage()) != null)
            {
                switch (msg.MessageType)
                {
                    case NetIncomingMessageType.VerboseDebugMessage:
                    case NetIncomingMessageType.DebugMessage:
                    case NetIncomingMessageType.WarningMessage:
                    case NetIncomingMessageType.ErrorMessage:
                        break;
                    case NetIncomingMessageType.StatusChanged:
                        NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();
                        if (status == NetConnectionStatus.Connected)
                        {
                            //
                            // A new player just connected!
                            //
                            NetworkPlayer player = new NetworkPlayer((byte)++NumNetworkPlayers, msg.SenderConnection, new Vector2(100, 70), "");
                            GameServer.NetworkPlayers.Add(player);
                            HandleClient(player);
                        }

                        if (status == NetConnectionStatus.Disconnected)
                        {
                            NetworkPlayer pl2 = GameServer.NetworkPlayers.Where(pl => pl.NetConnection.RemoteUniqueIdentifier == msg.SenderConnection.RemoteUniqueIdentifier).FirstOrDefault();
                            GameServer.NetworkPlayers.Remove(pl2);
                            Packet1SCGameEvent p2 = new Packet1SCGameEvent(GameServer.GameEvents.Player_Leave, pl2.PlayerID);
                            SendPacket(p2);
                            Packet1SCGameEvent p3 = new Packet1SCGameEvent(GameServer.GameEvents.Player_Chat, (byte)0, false, "Player " + pl2.PlayerName + " has left the game.");
                            SendPacket(p3);

                            ServerConsole.Log("Player " + pl2.PlayerName + " has disconnected.");
                        }

                        break;
                    case NetIncomingMessageType.Data:
                        NetworkPlayer p = GameServer.NetworkPlayers.Where(pl => pl.NetConnection == msg.SenderConnection).FirstOrDefault();
                        HandlePacket(new Packet(msg.m_data), p);
                        break;
                }
                NetServer.Recycle(msg);
            }
        }
Пример #7
0
        public static void HandleGameEvent(byte eventID, Packet p, NetworkPlayer player)
        {
            switch ((GameEvents)eventID)
            {
                case GameEvents.Player_Drop_Item:
                    ServerItem inHand = player.Inventory.GetPlayerItemInHand();
                    if (inHand == null)
                        break;
                    player.DropItem();
                    break;

                case GameEvents.Player_Use_Item:
                    short x = p.ReadShort();
                    short y = p.ReadShort();
                    ServerItem itemInHand = player.Inventory.GetPlayerItemInHand();
                    if (itemInHand == null) break;
                    itemInHand.OnItemUsed(x, y, player);
                    break;

                case GameEvents.Player_Use_Block:
                    x = p.ReadShort();
                    y = p.ReadShort();
                    Block b = GetBlockAt(x, y).Block;
                    b.OnBlockUsed(x, y, player);
                    break;

                case GameEvents.Player_Pickup_Block:
                    x = p.ReadShort();
                    y = p.ReadShort();
                    if (player.PClass is PlayerClassDestroyer) {
                        if (Math.Abs(player.EntityPosition.X / BlockSize - (float)(x)) < 2 && Math.Abs(player.EntityPosition.Y / BlockSize - (float)(y)) < 2)
                            ((PlayerClassDestroyer)player.PClass).PickupBlock(new Vector2(x, y));
                    }
                    break;

                case GameEvents.Player_Place_Block:
                    if (player.PClass is PlayerClassDestroyer)
                    {
                        ((PlayerClassDestroyer)player.PClass).PlaceBlock();
                    }
                    break;

                case GameEvents.Player_Inventory_Selection_Change:
                    player.SetPlayerEquippedSlot(p.ReadByte());
                    player.SendEquippedItemUpdate();
                    break;

                case GameEvents.Player_Chat:
                    bool teamChat = p.ReadBool();
                    string chatText = p.ReadString();

                    ServerConsole.Log(player.PlayerName + ": " + chatText);

                    Packet1SCGameEvent pack = new Packet1SCGameEvent(GameEvents.Player_Chat, (byte)player.PlayerID, (bool)teamChat, chatText);
                    ServerNetworkManager.SendPacket(pack);
                    break;

                case GameEvents.Player_Change_Name:
                    string newName = p.ReadString();
                    if (newName.Length > 0)
                    {
                        player.PlayerName = newName;
                        pack = new Packet1SCGameEvent(GameEvents.Player_Change_Name, (byte)player.PlayerID, newName);
                        ServerNetworkManager.SendPacket(pack);
                    }
                    break;

                case GameEvents.Player_Choose_Team:
                    int team = p.ReadByte();
                    if (team != 0 && team != 1) return;
                    if (team == player.PlayerTeam) return;
                    player.PlayerTeam = team;
                    GameMode.OnPlayerChooseTeam(player, team);
                    player.HurtPlayer(10000);

                    Packet newP = new Packet1SCGameEvent(GameEvents.Player_Choose_Team, (byte)player.PlayerID, (byte)team);
                    ServerNetworkManager.SendPacket(newP);
                    break;
            }
        }