示例#1
0
        /// <summary>
        /// Performs additional actions for projectiles.
        /// </summary>
        public void PerformProjectileAction()
        {
            if (CheckNull() || !OwnerProjectile.TPlayer.hostile)
            {
                return;
            }
            switch (type)
            {
            //Medusa Ray projectile
            case 536:
                var target = PvPUtils.FindClosestPlayer(OwnerProjectile.TPlayer.position, OwnerProjectile.Index,
                                                        Constants.MedusaHeadRange);

                if (target != null)
                {
                    if (Collision.CanHit(OwnerProjectile.TPlayer.position, OwnerProjectile.TPlayer.width, OwnerProjectile.TPlayer.height,
                                         target.TPlayer.position, target.TPlayer.width, target.TPlayer.height))
                    {
                        if (target.CheckMedusa())
                        {
                            string deathmessage = target.Name + " was petrified by " + target.Name + "'s Medusa Head.";
                            target.DamagePlayer(PvPUtils.GetPvPDeathMessage(deathmessage, ItemOriginated),
                                                ItemOriginated, ItemOriginated.ConfigDamage, 0, false);
                            target.SetBuff(Cache.Projectiles[535].InflictBuff);
                        }
                    }
                }
                break;
            }
        }
示例#2
0
        private void OnPlayerUpdated(object sender, PlayerUpdateArgs e)
        {
            e.player.TPlayer.vortexStealthActive = (e.pulley & 8) == 8;

            if (!PvPController.config.enablePlugin)
            {
                return;
            }

            if (e.player.previousSelectedItem != e.selectedSlot)
            {
                if (e.player.seeTooltip)
                {
                    PvPItem item = PvPUtils.ConvertToPvPItem(e.player.TPlayer.inventory[e.selectedSlot]);

                    int damage = TerrariaUtils.GetWeaponDamage(e.player, item);
                    damage += PvPUtils.GetAmmoDamage(e.player, item);
                    damage += PvPUtils.GetVortexDamage(e.player, item, damage);

                    if (damage > 0)
                    {
                        string message = item.Name + ": " + damage + " damage";
                        PvPUtils.PlayerTextPopup(e.player, message, Color.Goldenrod);
                    }
                }

                e.player.previousSelectedItem = e.selectedSlot;
            }
        }
示例#3
0
        /// <summary>
        /// Handles projectile creation.
        /// </summary>
        private void OnNewProjectile(object sender, ProjectileNewArgs e)
        {
            if (!PvPModifier.Config.EnablePlugin)
            {
                return;
            }
            var projectile = Main.projectile[e.Identity];

            if (projectile.active && projectile.type == e.Type)
            {
                return;
            }

            if ((TShock.Players[e.Owner]?.TPlayer?.hostile ?? false) && PvPUtils.IsModifiedProjectile(e.Type))
            {
                e.Args.Handled = true;
                DbProjectile proj = Cache.Projectiles[e.Type];

                projectile.SetDefaults(proj.Shoot != -1 ? proj.Shoot : e.Type);
                projectile.velocity = e.Velocity * proj.VelocityMultiplier;
                projectile.damage   = proj.Damage != -1 ? proj.Damage : e.Damage;
                projectile.active   = true;
                projectile.identity = e.Identity;
                projectile.owner    = e.Owner;
                projectile.position = e.Position;

                NetMessage.SendData(27, -1, -1, null, e.Identity);
            }

            e.Attacker.ProjTracker.InsertProjectile(e.Identity, e.Type, e.Owner, e.Weapon);
            e.Attacker.ProjTracker.Projectiles[e.Type].PerformProjectileAction();
        }
示例#4
0
        /// <summary>
        /// Gets the first available ammo for a weapon.
        /// </summary>
        /// <param Name="weapon">The weapon to find ammo for.</param>
        /// <returns></returns>
        public PvPItem GetFirstAvailableAmmo(PvPItem weapon)
        {
            int useAmmo = weapon.useAmmo;

            if (useAmmo == AmmoID.None)
            {
                return(new PvPItem());
            }

            for (int x = 54; x < NetItem.InventorySlots; x++)
            {
                if (this.TPlayer.inventory[x].ammo == useAmmo)
                {
                    return(PvPUtils.ConvertToPvPItem(this.TPlayer.inventory[x]));
                }
            }

            for (int x = 0; x < NetItem.InventorySlots - 4; x++)
            {
                if (this.TPlayer.inventory[x].ammo == useAmmo)
                {
                    return(PvPUtils.ConvertToPvPItem(this.TPlayer.inventory[x]));
                }
            }

            return(new PvPItem());
        }
示例#5
0
        /// <summary>
        /// Damages players. Criticals and custom knockback will apply if enabled.
        /// </summary>
        public void DamagePlayer(PvPPlayer attacker, PvPItem weapon, int damage, int hitDirection, bool isCrit)
        {
            damage *= isCrit ? 2 : 1;
            string star  = isCrit ? "!!" : "*";
            var    color = isCrit ? Color.SlateBlue : Color.DarkTurquoise;

            NetMessage.SendPlayerHurt(this.Index, PlayerDeathReason.ByCustomReason(PvPUtils.GetPvPDeathMessage(attacker, this, weapon)),
                                      damage, hitDirection, false, true, 5);
            Interface.PlayerTextPopup(attacker, this, star + TerrariaUtils.GetHurtDamage(this, damage) + star, color);
        }
示例#6
0
 private void OnPlayerSlotUpdated(object sender, PlayerSlotArgs e)
 {
     if (e.player.seeTooltip)
     {
         if (e.slotid >= 59 && e.slotid <= 67)
         {
             Task.Delay(50).ContinueWith(t => {
                 PvPUtils.PlayerTextPopup(e.player, e.player.GetPlayerDefense() + " defense", Color.OrangeRed);
             });
         }
     }
 }
示例#7
0
        public int GetDamageDealt(PvPPlayer attacker, PvPItem weapon, PvPProjectile projectile = null)
        {
            int damage = (projectile == null || PvPController.config.projectileInfo[projectile.type].damage < 1) ?
                         weapon.GetPvPDamage(attacker) : projectile.GetConfigDamage();

            damage += PvPUtils.GetAmmoDamage(attacker, weapon);
            damage += PvPUtils.GetDamageVariance();
            damage += PvPUtils.GetVortexDamage(attacker, weapon, damage);

            damage -= (int)(this.GetDefenseDifferenceFromModded() * 0.5);

            return(damage);
        }
示例#8
0
        /// <summary>
        /// Handles pvp attacks.
        /// </summary>
        private void OnPlayerHurt(object sender, PlayerHurtArgs e)
        {
            if (!PvPModifier.Config.EnablePlugin)
            {
                return;
            }
            e.Args.Handled = true;

            if (e.Attacker.TPlayer.immune || !e.Target.CanBeHit())
            {
                return;
            }

            if (PvPModifier.Config.EnableKnockback)
            {
                int    direction = e.HitDirection;
                double angle;
                if (e.PlayerHitReason.SourceProjectileIndex != -1)
                {
                    angle     = Math.Atan2(e.Projectile.velocity.Y, e.Projectile.velocity.X);
                    direction = e.Target.IsLeftFrom(e.Projectile.position) ? -direction : direction;
                }
                else
                {
                    angle     = e.Attacker.AngleFrom(e.Target.TPlayer.position);
                    direction = e.Target.IsLeftFrom(e.Attacker.TPlayer.position) ? -direction : direction;
                }
                e.Target.KnockBack(e.Weapon.GetKnockback(e.Attacker),
                                   angle,
                                   direction);
                e.HitDirection = 0;
            }

            e.Target.DamagePlayer(PvPUtils.GetPvPDeathMessage(e.PlayerHitReason.GetDeathText(e.Target.Name).ToString(), e.Weapon, e.Projectile),
                                  e.Weapon, e.InflictedDamage, e.HitDirection, (e.Flag & 1) == 1);

            e.Attacker.ApplyPvPEffects(e.Target, e.Weapon, e.Projectile, e.InflictedDamage);

            if (PvPModifier.Config.EnableBuffs)
            {
                e.Target.SetBuff(Cache.Projectiles[e.PlayerHitReason.SourceProjectileType].InflictBuff);
                e.Attacker.SetBuff(Cache.Projectiles[e.PlayerHitReason.SourceProjectileType].ReceiveBuff);
                e.Target.SetBuff(Cache.Items[e.Attacker.HeldItem.netID].InflictBuff);
                e.Attacker.SetBuff(Cache.Items[e.Attacker.HeldItem.netID].ReceiveBuff);
                e.Target.ApplyBuffDebuffs(e.Attacker, e.Weapon);
                e.Attacker.ApplyReceiveBuff();
            }
        }
示例#9
0
        /// <summary>
        /// Handles player updates.
        /// </summary>
        private void OnPlayerUpdate(object sender, PlayerUpdateArgs e)
        {
            if (!PvPModifier.Config.EnablePlugin)
            {
                return;
            }
            if (e.Player.TPlayer.dead)
            {
                return;
            }

            //If the player has their pvp turned on without sending a TogglePvP packet (ex. through a /pvp command),
            //The plugin will detect it here and send the modified items.
            if (e.Player.TPlayer.hostile && !e.Player.InvTracker.StartForcePvPInventoryCheck)
            {
                e.Player.InvTracker.StartForcePvPInventoryCheck = true;
                PvPUtils.SendCustomItems(e.Player);
            }

            if (!e.Player.TPlayer.hostile && e.Player.InvTracker.StartForcePvPInventoryCheck)
            {
                PvPUtils.RefreshInventory(e.Player);
                e.Player.InvTracker.Clear();
                e.Player.InvTracker.StartForcePvPInventoryCheck = false;
            }

            //If the player tries to use a modified item in their hand, it will be dumped back into their inventory
            if ((e.PlayerAction & 32) == 32)
            {
                if (e.Player.TPlayer.hostile)
                {
                    Item item = e.Player.TPlayer.inventory[58];

                    if (item.netID != 0 && PvPUtils.IsModifiedItem(item.netID) && e.Player.CanModInventory())
                    {
                        SSCUtils.SetItem(e.Player, 58, 0);
                        CustomWeaponDropper.DropItem(e.Player, new CustomWeapon {
                            ItemNetId     = (short)item.netID, Prefix = item.prefix, Stack = (short)item.stack,
                            DropAreaWidth = short.MaxValue, DropAreaHeight = short.MaxValue
                        });
                        e.Player.SendErrorMessage("You cannot use this weapon in your hand!");
                    }
                }
            }
        }
示例#10
0
        /// <summary>
        /// Handles homing projectiles.
        /// </summary>
        public static void UpdateProjectileHoming(ProjectileAiUpdateEventArgs args)
        {
            if (!PvPModifier.Config.EnableHoming)
            {
                return;
            }

            var projectile = args.Projectile;

            float homingRadius = Cache.Projectiles[projectile.type].HomingRadius;

            if (homingRadius < 0)
            {
                return;
            }

            float angularVelocity = Cache.Projectiles[projectile.type].AngularVelocity;

            PvPPlayer target = PvPUtils.FindClosestPlayer(projectile.position, projectile.owner, homingRadius * Constants.PixelToWorld);

            if (target != null)
            {
                projectile.velocity = MiscUtils.TurnTowards(projectile.velocity, projectile.position, target.TPlayer.Center, angularVelocity);
                foreach (var pvper in PvPModifier.ActivePlayers)
                {
                    pvper.SendRawData(new PacketWriter()
                                      .SetType((short)PacketTypes.ProjectileNew)
                                      .PackInt16((short)projectile.identity)
                                      .PackSingle(projectile.position.X)
                                      .PackSingle(projectile.position.Y)
                                      .PackSingle(projectile.velocity.X)
                                      .PackSingle(projectile.velocity.Y)
                                      .PackSingle(projectile.knockBack)
                                      .PackInt16((short)projectile.damage)
                                      .PackByte((byte)projectile.owner)
                                      .PackInt16((short)projectile.type)
                                      .PackByte(0)
                                      .PackSingle(projectile.ai[0])
                                      .GetByteData());
                }
            }
        }
示例#11
0
        /// <summary>
        /// Mods the player's inventory when their pvp is turned on.
        /// Resets their inventory to Terraria's defaults when their pvp is turned off.
        /// </summary>
        private void OnPvPToggled(object sender, TogglePvPArgs e)
        {
            if (!PvPModifier.Config.EnablePlugin)
            {
                return;
            }

            if (e.Hostile)
            {
                e.Player.InvTracker.StartForcePvPInventoryCheck = true;
                PvPUtils.SendCustomItems(e.Player);
            }

            if (!e.Hostile)
            {
                PvPUtils.RefreshInventory(e.Player);
                e.Player.InvTracker.Clear();
                e.Player.InvTracker.StartForcePvPInventoryCheck = false;
            }
        }
示例#12
0
        /// <summary>
        /// Replaces items placed into the inventory into the pvp versions.
        /// </summary>
        private void CheckIncomingItems(object sender, PlayerSlotArgs e)
        {
            if (!PvPModifier.Config.EnablePlugin)
            {
                return;
            }

            if (!e.Player.TPlayer.hostile)
            {
                return;
            }
            if (e.SlotId >= 58)
            {
                return;
            }

            //Only runs after initial pvp check
            if (e.Player.InvTracker.OnPvPInventoryChecked)
            {
                if (e.Player.InvTracker.LockModifications)
                {
                    return;
                }

                //If the item is being consumed, don't modify the item
                if (Math.Abs(e.Player.TPlayer.inventory[e.SlotId].stack - e.Stack) <= 1 &&
                    e.Player.TPlayer.inventory[e.SlotId].netID == e.NetID)
                {
                    return;
                }

                //If the item is modified, fill empty spaces and add it to queue
                if (PvPUtils.IsModifiedItem(e.NetID))
                {
                    SSCUtils.FillInventoryToIndex(e.Player, Constants.EmptyItem, Constants.JunkItem, e.SlotId);
                    SSCUtils.SetItem(e.Player, e.SlotId, Constants.EmptyItem);
                    e.Player.InvTracker.AddItem(PvPUtils.GetCustomWeapon(e.Player, e.NetID, e.Prefix, e.Stack));
                    e.Player.InvTracker.StartDroppingItems();
                }
            }
        }
示例#13
0
        /// <summary>
        /// Mods the player's inventory when their pvp is turned on.
        /// Resets their inventory to Terraria's defaults when their pvp is turned off.
        /// </summary>
        private void OnPvPToggled(object sender, TogglePvPArgs e)
        {
            //TSPlayer.All.SendMessage(e.Player.Name + " has enabled/disabled pvp (fix 1)", new Microsoft.Xna.Framework.Color(187, 144, 212));
            if (!PvPModifier.Config.EnablePlugin)
            {
                return;
            }

            if (e.Hostile)
            {
                e.Player.InvTracker.StartForcePvPInventoryCheck = true;
                PvPUtils.SendCustomItems(e.Player);
            }

            if (!e.Hostile)
            {
                PvPUtils.RefreshInventory(e.Player);
                e.Player.InvTracker.Clear();
                e.Player.InvTracker.StartForcePvPInventoryCheck = false;
            }
        }
示例#14
0
        private static void DPSify(CommandArgs args)
        {
            List <string> queries = new List <string>();

            if (args.Parameters.Count < 1 || !Double.TryParse(args.Parameters[0], out double dps))
            {
                args.Player.SendErrorMessage("Invalid dps value.");
                return;
            }

            dps = dps * dps;

            for (int x = 0; x < Terraria.Main.maxItemTypes; x++)
            {
                Item item = new Item();
                item.SetDefaults(x);

                int useanimation = Cache.Items[x].UseAnimation != -1 ? Cache.Items[x].UseAnimation.Replace(0, 1) : item.useAnimation;

                if (item.damage > 0 && item.ammo == 0)
                {
                    queries.Add($"UPDATE {DbTables.ItemTable} SET {DbConsts.Damage} = {(int)Math.Sqrt(dps * useanimation / 60.0)} WHERE ID = {x}");
                }
            }

            Database.PerformTransaction(queries.ToArray());
            Database.LoadDatabase();
            string log = $"Set all weapon's pvp dps to be approx {Math.Sqrt(dps)}";

            args.Player.SendSuccessMessage(log);
            PvPModifier.Config.LogChange($"({DateTime.Now}) {log}");

            foreach (var player in PvPModifier.ActivePlayers)
            {
                if (player.TPlayer.hostile)
                {
                    PvPUtils.SendCustomItems(player);
                }
            }
        }
示例#15
0
        /// <summary>
        /// Applies turtle and thorns damage to the attacker.
        /// </summary>
        public void ApplyReflectDamage(PvPPlayer attacker, int damage, PvPItem weapon)
        {
            PvPItem reflectTag   = new PvPItem(1150);
            Random  random       = new Random();
            string  deathmessage = PresetData.ReflectedDeathMessages[random.Next(PresetData.ReflectedDeathMessages.Count)];

            if (PvPModifier.Config.EnableTurtle && attacker.TPlayer.setBonus == Language.GetTextValue("ArmorSetBonus.Turtle") && weapon.melee)
            {
                deathmessage = Name + deathmessage + attacker.Name + "'s Turtle Armor.";
                int turtleDamage = (int)(damage * PvPModifier.Config.TurtleMultiplier);

                NetMessage.SendPlayerHurt(this.Index, PlayerDeathReason.ByCustomReason(PvPUtils.GetPvPDeathMessage(deathmessage, reflectTag, type: 2)),
                                          turtleDamage, 0, false, true, 5);
            }

            if (PvPModifier.Config.EnableThorns && attacker.TPlayer.FindBuffIndex(14) != -1)
            {
                int thornDamage = (int)(damage * PvPModifier.Config.ThornMultiplier);
                deathmessage = Name + deathmessage + attacker.Name + "'s Thorns.";

                NetMessage.SendPlayerHurt(this.Index, PlayerDeathReason.ByCustomReason(PvPUtils.GetPvPDeathMessage(deathmessage, reflectTag, type: 2)),
                                          thornDamage, 0, false, true, 5);
            }
        }
示例#16
0
 public void DamagePlayer(PvPPlayer attacker, PvPItem weapon, int damage, int hitDirection)
 {
     NetMessage.SendPlayerHurt(this.Index, PlayerDeathReason.ByCustomReason(PvPUtils.GetPvPDeathMessage(attacker, this, weapon.name, 1)),
                               damage, hitDirection, false, true, 5);
     PvPUtils.PlayerTextPopup(attacker, this, "*" + TerrariaUtils.GetHurtDamage(this, damage) + "*", Color.DarkTurquoise);
 }
示例#17
0
 /// <summary>
 /// Finds the player's item from its inventory.
 /// </summary>
 public PvPItem FindPlayerItem(int type) => TPlayer.FindItem(type) != -1
     ? PvPUtils.ConvertToPvPItem(TPlayer.inventory[TPlayer.FindItem(type)])
     : new PvPItem(type)
 {
     playerIndexTheItemIsReservedFor = Index
 };
示例#18
0
        /// <summary>
        /// Applies turtle and thorns damage to the attacker.
        /// </summary>
        public void ApplyReflectDamage(PvPPlayer attacker, int damage, PvPItem weapon)
        {
            PvPItem reflectType = new PvPItem();

            if (PvPController.Config.EnableTurtle && this.TPlayer.setBonus == Language.GetTextValue("ArmorSetBonus.Turtle") && weapon.melee)
            {
                reflectType.SpecialName = "Turtle Armor";
                int turtleDamage = (int)(damage * PvPController.Config.TurtleMultiplier);

                NetMessage.SendPlayerHurt(attacker.Index, PlayerDeathReason.ByCustomReason(PvPUtils.GetPvPDeathMessage(this, attacker, reflectType, 2)),
                                          turtleDamage, 0, false, true, 5);
            }

            if (PvPController.Config.EnableThorns && this.TPlayer.FindBuffIndex(14) != -1)
            {
                reflectType.SpecialName = "Thorns";
                int thornDamage = (int)(damage * PvPController.Config.ThornMultiplier);

                NetMessage.SendPlayerHurt(attacker.Index, PlayerDeathReason.ByCustomReason(PvPUtils.GetPvPDeathMessage(this, attacker, reflectType, 2)),
                                          thornDamage, 0, false, true, 5);
            }
        }
示例#19
0
 /// <summary>
 /// Finds the player's item from its inventory.
 /// </summary>
 /// <param Name="type">Type of item being found</param>
 /// <returns>The item in the player's inventory</returns>
 public PvPItem FindPlayerItem(int type) => PvPUtils.ConvertToPvPItem(TPlayer.inventory[TPlayer.FindItem(type)]);
示例#20
0
 /// <summary>
 /// Performs additional actions for projectiles.
 /// </summary>
 public void PerformProjectileAction()
 {
     switch (type)
     {
     //Medusa Ray projectile
     case 536:
         foreach (PvPPlayer pvper in PvPController.PvPers.Where(c => c != null))
         {
             if (OwnerProjectile.Index == pvper.Index)
             {
                 continue;
             }
             if (!pvper.TPlayer.hostile || pvper.Dead)
             {
                 continue;
             }
             if (Vector2.Distance(OwnerProjectile.TPlayer.position, pvper.TPlayer.position) <= 300)
             {
                 if (pvper.CheckMedusa())
                 {
                     pvper.DamagePlayer(OwnerProjectile, ItemOriginated, pvper.GetDamageDealt(OwnerProjectile, ItemOriginated, this), 0, PvPUtils.IsCrit(OwnerProjectile.GetCrit(ItemOriginated)));
                     pvper.SetBuff(Database.GetBuffInfo(DbConsts.ProjectileTable, 535, true));
                 }
             }
         }
         break;
     }
 }
示例#21
0
        /// <summary>
        /// Calculates pvp damage and performs interactions with players,
        /// such as buffs and other miscellaneous broken vanilla pvp mechanics.
        /// </summary>
        /// <param Name="sender"></param>
        /// <param Name="e"></param>
        private void OnPlayerHurt(object sender, PlayerHurtArgs e)
        {
            if (!PvPController.Config.EnablePlugin)
            {
                return;
            }

            if (!e.IsPvPDamage)
            {
                return;
            }

            e.Args.Handled = true;

            if (!e.Target.CanBeHit())
            {
                return;
            }

            if (PvPController.Config.EnableKnockback)
            {
                float knockback = e.Weapon.GetKnockback(e.Attacker);
                if (knockback >= PvPController.Config.KnockbackMinimum)
                {
                    e.Target.KnockBack(e.Weapon.GetKnockback(e.Attacker),
                                       e.Attacker.GetAngleFrom(e.Target.TPlayer.position),
                                       e.Target.IsLeftFrom(e.Attacker.TPlayer.position) ? -e.HitDirection : e.HitDirection);
                    e.HitDirection = 0;
                }
            }

            e.Target.DamagePlayer(e.Attacker, e.Weapon, e.InflictedDamage, e.HitDirection,
                                  PvPController.Config.EnableCriticals && PvPUtils.IsCrit(e.Crit));

            e.Target.ApplyPvPEffects(e.Attacker, e.Weapon, e.Projectile, e.InflictedDamage);

            if (PvPController.Config.EnableProjectileDebuffs)
            {
                e.Target.SetBuff(Database.GetBuffInfo(DbConsts.ProjectileTable,
                                                      e.PlayerHitReason.SourceProjectileType, true));
            }

            if (PvPController.Config.EnableProjectileSelfBuffs)
            {
                e.Attacker.SetBuff(Database.GetBuffInfo(DbConsts.ProjectileTable,
                                                        e.PlayerHitReason.SourceProjectileType, false));
            }

            if (PvPController.Config.EnableWeaponDebuffs)
            {
                e.Target.SetBuff(Database.GetBuffInfo(DbConsts.ItemTable, e.Attacker.GetPlayerItem.netID, true));
            }

            if (PvPController.Config.EnableWeaponSelfBuffs)
            {
                e.Attacker.SetBuff(Database.GetBuffInfo(DbConsts.ItemTable, e.Attacker.GetPlayerItem.netID, false));
            }

            if (PvPController.Config.EnableBuffDebuff)
            {
                e.Target.ApplyBuffDebuffs(e.Attacker, e.Weapon);
            }

            if (PvPController.Config.EnableBuffSelfBuff)
            {
                e.Attacker.ApplyBuffSelfBuff();
            }
        }
示例#22
0
        private static void ModPvP(CommandArgs args)
        {
            var      player   = args.Player;
            var      input    = args.Parameters;
            int      id       = -1;
            DbObject dbObject = null;

            if (input.Count < 1 || !StringConsts.TryGetSectionFromString(input[0], out var section))
            {
                player.SendErrorMessage(HelpModPvP);
                return;
            }

            if (section == StringConsts.Help)
            {
                if (input.Count > 1)
                {
                    StringConsts.TryGetSectionFromString(input[1], out var helpsection);

                    switch (helpsection)
                    {
                    case StringConsts.Database:
                        player.SendMessage(DatabaseAttributes, Color.Yellow);
                        return;

                    case StringConsts.Config:
                        player.SendMessage(ConfigAttributes, Color.Yellow);
                        return;

                    default:
                        player.SendErrorMessage(InvalidSyntax + AttributesHelp);
                        return;
                    }
                }

                player.SendErrorMessage(AttributesHelp);
                return;
            }

            if (section != StringConsts.Config)
            {
                if (input.Count < 3)
                {
                    player.SendErrorMessage(HelpModPvP);
                    return;
                }

                if (!int.TryParse(input[1], out id))
                {
                    var foundItems = TShock.Utils.GetIdFromInput(section, input[1]);
                    if (foundItems.Count == 1)
                    {
                        id = foundItems[0];
                    }
                    else if (foundItems.Count > 1)
                    {
                        player.SendErrorMessage("Found Multiple items");
                        foreach (int item in foundItems)
                        {
                            player.SendMessage($"({item}) {MiscUtils.GetNameFromInput(section, item)}", Color.Yellow);
                        }
                        return;
                    }
                    else
                    {
                        player.SendErrorMessage(NothingFoundError);
                        return;
                    }
                }

                dbObject = Cache.GetSection(section, id);
                if (dbObject == null)
                {
                    player.SendErrorMessage(NothingFoundError);
                    return;
                }

                if (input.Count < 4)
                {
                    player.SendErrorMessage(InvalidSyntax + "Please enter value(s) for the attribute(s).");
                    return;
                }
            }
            else
            {
                if (input.Count < 3)
                {
                    player.SendErrorMessage(HelpModPvP);
                    return;
                }
            }

            var pairedInputs = MiscUtils.SplitIntoPairs(input.Skip((section != StringConsts.Config).ToInt() + 1).ToArray());

            foreach (var pair in pairedInputs)
            {
                var attribute = "";
                if (section != StringConsts.Config)
                {
                    StringConsts.TryGetDatabaseAttributeFromString(pair[0], out attribute);
                }
                else
                {
                    StringConsts.TryGetConfigValueFromString(pair[0], out attribute);
                }

                pair[0] = attribute;
            }

            switch (section)
            {
            case DbTables.ItemTable:
            case DbTables.ProjectileTable:
            case DbTables.BuffTable:
                string name = MiscUtils.GetNameFromInput(section, id);
                player.SendMessage($"Modifying {name} ({id})", Color.Green);

                foreach (var pair in pairedInputs)
                {
                    if (dbObject.TrySetValue(pair[0], pair[1]))
                    {
                        player.SendMessage($"Set {pair[0]} to {pair[1]}", Color.YellowGreen);
                        if (args.Silent)
                        {
                            PvPModifier.Webhook.Send(player.Account.Name, section, name, pair[0], pair[1]);
                        }
                    }
                    else
                    {
                        player.SendErrorMessage(InvalidValue(pair[0], section));
                    }
                }

                if (dbObject is DbItem)
                {
                    foreach (var pvper in PvPModifier.ActivePlayers)
                    {
                        if (!pvper.TPlayer.hostile)
                        {
                            continue;
                        }

                        int itemindex = pvper.TPlayer.FindItem(id);
                        if (itemindex != -1)
                        {
                            SSCUtils.FillInventoryToIndex(pvper, 0, Constants.JunkItem, itemindex);
                            var item = pvper.TPlayer.inventory[itemindex];
                            SSCUtils.SetItem(pvper, (byte)itemindex, 0);
                            pvper.InvTracker.AddItem(PvPUtils.GetCustomWeapon(pvper, id, item.prefix, (short)item.stack));
                        }
                        pvper.InvTracker.StartDroppingItems();
                    }
                }

                break;

            case StringConsts.Config:
                foreach (var pair in pairedInputs)
                {
                    if (MiscUtils.SetValueWithString(PvPModifier.Config, pair[0], pair[1]))
                    {
                        player.SendSuccessMessage($"Set {pair[0]} to {pair[1]}");
                    }
                    else
                    {
                        player.SendErrorMessage(ConfigValueFail(pair[0], pair[1]));
                    }
                }

                PvPModifier.Config.Write(Config.ConfigPath);
                break;

            default:
                player.SendErrorMessage(HelpModPvP);
                return;
            }
        }
示例#23
0
 /// <summary>
 /// Finds the player's item from its inventory.
 /// </summary>
 public PvPItem FindPlayerItem(int type) => TPlayer.FindItem(type) != -1
     ? PvPUtils.ConvertToPvPItem(TPlayer.inventory[TPlayer.FindItem(type)])
     : new PvPItem(type)
 {
     owner = Index
 };
示例#24
0
        private static void ResetPvP(CommandArgs args)
        {
            Console.WriteLine("Enter Cms");
            Console.WriteLine("MaxAI: " + Terraria.Projectile.maxAI);
            args.Player.SendErrorMessage("" + Terraria.Projectile.maxAI);

            var player = args.Player;
            var input  = args.Parameters;

            if (input.Count < 1 || !StringConsts.TryGetSectionFromString(input[0], out var section))
            {
                player.SendErrorMessage(InvalidSyntax + ResetList);
                return;
            }

            switch (section)
            {
            case StringConsts.Database:
                Database.InitDefaultTables();
                Database.LoadDatabase();
                foreach (var pvper in PvPModifier.ActivePlayers)
                {
                    PvPUtils.RefreshInventory(pvper);
                }
                player.SendSuccessMessage("Reset database to default.");
                return;

            case StringConsts.Config:
                PvPModifier.Config.ResetConfigValues();
                PvPModifier.Config.Write(Config.ConfigPath);
                player.SendSuccessMessage("Reset config values to default.");
                return;

            case DbTables.ItemTable:
            case DbTables.ProjectileTable:
            case DbTables.BuffTable:
                if (input.Count < 2)
                {
                    player.SendErrorMessage("Please provide a valid id or name.");
                    return;
                }
                if (!int.TryParse(input[1], out int id))
                {
                    var foundList = TShock.Utils.GetIdFromInput(section, input[1]);
                    id = foundList[0];
                    if (foundList.Count == 0)
                    {
                        player.SendErrorMessage("Please provide a valid id or name.");
                        return;
                    }

                    if (foundList.Count > 1)
                    {
                        player.SendErrorMessage("Found multiple of input");
                        foreach (int items in foundList)
                        {
                            player.SendMessage($"({items}) {MiscUtils.GetNameFromInput(section, items)}", Color.Yellow);
                        }
                        return;
                    }
                }

                /*
                 * if (!int.TryParse(input[1], out int id))
                 * {
                 *  var foundList = TShock.Utils.GetIdFromInput(section, input[1]);
                 *  id = foundList[0];
                 * }
                 */

                Database.DeleteRow(section, id);
                Database.Query(Database.GetDefaultValueSqlString(section, id));

                string log = "Reset the values of {0}".SFormat(MiscUtils.GetNameFromInput(section, id));
                if (section == DbTables.ItemTable)
                {
                    foreach (var pvper in PvPModifier.ActivePlayers)
                    {
                        PvPUtils.RefreshItem(pvper, id);
                    }
                }
                player.SendSuccessMessage(log);
                Database.LoadDatabase();
                PvPModifier.Config.LogChange($"[{player.Name} ({DateTime.Now})] {log}");
                break;

            default:
                player.SendErrorMessage("Invalid parameters. " + ResetList);
                return;
            }
        }
示例#25
0
 public PvPItem GetPlayerItem()
 {
     return(PvPUtils.ConvertToPvPItem(SelectedItem));
 }