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