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); } }
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); } }
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); }
/// <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; } } }
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); } }
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; } }