Example #1
0
        /// <summary>
        /// Determines if the unlock is valid and the player has permission to perform the unlock.
        /// Syncs unlock status if the packet is accepted
        /// </summary>
        /// <param name="player"></param>
        /// <param name="rejectPacket"></param>
        public void HandlePacket(TSPlayer player, out bool rejectPacket)
        {
            if (!Main.GameModeInfo.IsJourneyMode)
            {
                TShock.Log.ConsoleDebug(
                    "NetModuleHandler received attempt to unlock sacrifice while not in journey mode from",
                    player.Name
                    );

                rejectPacket = true;
                return;
            }

            if (UnknownField != 0)
            {
                TShock.Log.ConsoleDebug(
                    "CreativeUnlocksHandler received non-vanilla unlock request. Random field value: {0} but should be 0 from {1}",
                    UnknownField,
                    player.Name
                    );

                rejectPacket = true;
                return;
            }

            if (!player.HasPermission(Permissions.journey_contributeresearch))
            {
                player.SendErrorMessage("You do not have permission to contribute research.");
                rejectPacket = true;
                return;
            }

            var totalSacrificed = TShock.ResearchDatastore.SacrificeItem(ItemId, Amount, player);

            var response = NetCreativeUnlocksModule.SerializeItemSacrifice(ItemId, totalSacrificed);

            NetManager.Instance.Broadcast(response);

            rejectPacket = false;
        }
Example #2
0
        /// <summary>
        /// Restores a player's character to the state stored in the database
        /// </summary>
        /// <param name="player"></param>
        public void RestoreCharacter(TSPlayer player)
        {
            // Start ignoring SSC-related packets! This is critical so that we don't send or receive dirty data!
            player.IgnoreSSCPackets = true;

            player.TPlayer.statLife    = this.health;
            player.TPlayer.statLifeMax = this.maxHealth;
            player.TPlayer.statMana    = this.maxMana;
            player.TPlayer.statManaMax = this.maxMana;
            player.TPlayer.SpawnX      = this.spawnX;
            player.TPlayer.SpawnY      = this.spawnY;
            player.sX = this.spawnX;
            player.sY = this.spawnY;
            player.TPlayer.hairDye = this.hairDye;
            player.TPlayer.anglerQuestsFinished = this.questsCompleted;
            player.TPlayer.UsingBiomeTorches    = this.usingBiomeTorches == 1;
            player.TPlayer.happyFunTorchTime    = this.happyFunTorchTime == 1;
            player.TPlayer.unlockedBiomeTorches = this.unlockedBiomeTorches == 1;

            if (extraSlot != null)
            {
                player.TPlayer.extraAccessory = extraSlot.Value == 1 ? true : false;
            }
            if (this.skinVariant != null)
            {
                player.TPlayer.skinVariant = this.skinVariant.Value;
            }
            if (this.hair != null)
            {
                player.TPlayer.hair = this.hair.Value;
            }
            if (this.hairColor != null)
            {
                player.TPlayer.hairColor = this.hairColor.Value;
            }
            if (this.pantsColor != null)
            {
                player.TPlayer.pantsColor = this.pantsColor.Value;
            }
            if (this.shirtColor != null)
            {
                player.TPlayer.shirtColor = this.shirtColor.Value;
            }
            if (this.underShirtColor != null)
            {
                player.TPlayer.underShirtColor = this.underShirtColor.Value;
            }
            if (this.shoeColor != null)
            {
                player.TPlayer.shoeColor = this.shoeColor.Value;
            }
            if (this.skinColor != null)
            {
                player.TPlayer.skinColor = this.skinColor.Value;
            }
            if (this.eyeColor != null)
            {
                player.TPlayer.eyeColor = this.eyeColor.Value;
            }

            if (this.hideVisuals != null)
            {
                player.TPlayer.hideVisibleAccessory = this.hideVisuals;
            }
            else
            {
                player.TPlayer.hideVisibleAccessory = new bool[player.TPlayer.hideVisibleAccessory.Length];
            }

            for (int i = 0; i < NetItem.MaxInventory; i++)
            {
                if (i < NetItem.InventoryIndex.Item2)
                {
                    //0-58
                    player.TPlayer.inventory[i].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.inventory[i].netID != 0)
                    {
                        player.TPlayer.inventory[i].stack  = this.inventory[i].Stack;
                        player.TPlayer.inventory[i].prefix = this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.ArmorIndex.Item2)
                {
                    //59-78
                    var index = i - NetItem.ArmorIndex.Item1;
                    player.TPlayer.armor[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.armor[index].netID != 0)
                    {
                        player.TPlayer.armor[index].stack  = this.inventory[i].Stack;
                        player.TPlayer.armor[index].prefix = (byte)this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.DyeIndex.Item2)
                {
                    //79-88
                    var index = i - NetItem.DyeIndex.Item1;
                    player.TPlayer.dye[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.dye[index].netID != 0)
                    {
                        player.TPlayer.dye[index].stack  = this.inventory[i].Stack;
                        player.TPlayer.dye[index].prefix = (byte)this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.MiscEquipIndex.Item2)
                {
                    //89-93
                    var index = i - NetItem.MiscEquipIndex.Item1;
                    player.TPlayer.miscEquips[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.miscEquips[index].netID != 0)
                    {
                        player.TPlayer.miscEquips[index].stack  = this.inventory[i].Stack;
                        player.TPlayer.miscEquips[index].prefix = (byte)this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.MiscDyeIndex.Item2)
                {
                    //93-98
                    var index = i - NetItem.MiscDyeIndex.Item1;
                    player.TPlayer.miscDyes[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.miscDyes[index].netID != 0)
                    {
                        player.TPlayer.miscDyes[index].stack  = this.inventory[i].Stack;
                        player.TPlayer.miscDyes[index].prefix = (byte)this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.PiggyIndex.Item2)
                {
                    //98-138
                    var index = i - NetItem.PiggyIndex.Item1;
                    player.TPlayer.bank.item[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.bank.item[index].netID != 0)
                    {
                        player.TPlayer.bank.item[index].stack  = this.inventory[i].Stack;
                        player.TPlayer.bank.item[index].prefix = (byte)this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.SafeIndex.Item2)
                {
                    //138-178
                    var index = i - NetItem.SafeIndex.Item1;
                    player.TPlayer.bank2.item[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.bank2.item[index].netID != 0)
                    {
                        player.TPlayer.bank2.item[index].stack  = this.inventory[i].Stack;
                        player.TPlayer.bank2.item[index].prefix = (byte)this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.TrashIndex.Item2)
                {
                    //179-219
                    var index = i - NetItem.TrashIndex.Item1;
                    player.TPlayer.trashItem.netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.trashItem.netID != 0)
                    {
                        player.TPlayer.trashItem.stack  = this.inventory[i].Stack;
                        player.TPlayer.trashItem.prefix = (byte)this.inventory[i].PrefixId;
                    }
                }
                else if (i < NetItem.ForgeIndex.Item2)
                {
                    //220
                    var index = i - NetItem.ForgeIndex.Item1;
                    player.TPlayer.bank3.item[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.bank3.item[index].netID != 0)
                    {
                        player.TPlayer.bank3.item[index].stack = this.inventory[i].Stack;
                        player.TPlayer.bank3.item[index].Prefix((byte)this.inventory[i].PrefixId);
                    }
                }
                else
                {
                    //260
                    var index = i - NetItem.VoidIndex.Item1;
                    player.TPlayer.bank4.item[index].netDefaults(this.inventory[i].NetId);

                    if (player.TPlayer.bank4.item[index].netID != 0)
                    {
                        player.TPlayer.bank4.item[index].stack = this.inventory[i].Stack;
                        player.TPlayer.bank4.item[index].Prefix((byte)this.inventory[i].PrefixId);
                    }
                }
            }

            float slot = 0f;

            for (int k = 0; k < NetItem.InventorySlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].inventory[k].Name), player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.ArmorSlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].armor[k].Name), player.Index, slot, (float)Main.player[player.Index].armor[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.DyeSlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].dye[k].Name), player.Index, slot, (float)Main.player[player.Index].dye[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.MiscEquipSlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].miscEquips[k].Name), player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.MiscDyeSlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].miscDyes[k].Name), player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.PiggySlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.SafeSlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank2.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix);
                slot++;
            }
            NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].trashItem.Name), player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix);
            for (int k = 0; k < NetItem.ForgeSlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank3.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.VoidSlots; k++)
            {
                NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank4.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank4.item[k].prefix);
                slot++;
            }


            NetMessage.SendData(4, -1, -1, NetworkText.FromLiteral(player.Name), player.Index, 0f, 0f, 0f, 0);
            NetMessage.SendData(42, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
            NetMessage.SendData(16, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);

            slot = 0f;
            for (int k = 0; k < NetItem.InventorySlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].inventory[k].Name), player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.ArmorSlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].armor[k].Name), player.Index, slot, (float)Main.player[player.Index].armor[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.DyeSlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].dye[k].Name), player.Index, slot, (float)Main.player[player.Index].dye[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.MiscEquipSlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].miscEquips[k].Name), player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.MiscDyeSlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].miscDyes[k].Name), player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.PiggySlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.SafeSlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank2.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix);
                slot++;
            }
            NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].trashItem.Name), player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix);
            for (int k = 0; k < NetItem.ForgeSlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank3.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix);
                slot++;
            }
            for (int k = 0; k < NetItem.VoidSlots; k++)
            {
                NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank4.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank4.item[k].prefix);
                slot++;
            }



            NetMessage.SendData(4, player.Index, -1, NetworkText.FromLiteral(player.Name), player.Index, 0f, 0f, 0f, 0);
            NetMessage.SendData(42, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
            NetMessage.SendData(16, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);

            for (int k = 0; k < 22; k++)
            {
                player.TPlayer.buffType[k] = 0;
            }

            /*
             * The following packets are sent twice because the server will not send a packet to a client
             * if they have not spawned yet if the remoteclient is -1
             * This is for when players login via uuid or serverpassword instead of via
             * the login command.
             */
            NetMessage.SendData(50, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
            NetMessage.SendData(50, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);

            NetMessage.SendData(76, player.Index, -1, NetworkText.Empty, player.Index);
            NetMessage.SendData(76, -1, -1, NetworkText.Empty, player.Index);

            NetMessage.SendData(39, player.Index, -1, NetworkText.Empty, 400);

            if (Main.GameModeInfo.IsJourneyMode)
            {
                var sacrificedItems = TShock.ResearchDatastore.GetSacrificedItems();
                for (int i = 0; i < ItemID.Count; i++)
                {
                    var amount = 0;
                    if (sacrificedItems.ContainsKey(i))
                    {
                        amount = sacrificedItems[i];
                    }

                    var response = NetCreativeUnlocksModule.SerializeItemSacrifice(i, amount);
                    NetManager.Instance.SendToClient(response, player.Index);
                }
            }
        }