Merge branch 'general-devel' into consistency-playeractive-patch
This commit is contained in:
commit
a42046e79c
23 changed files with 1770 additions and 1040 deletions
|
|
@ -2854,7 +2854,7 @@ namespace TShockAPI
|
|||
{ BuffID.Poisoned, 3600 }, // BuffID: 20
|
||||
{ BuffID.OnFire, 1200 }, // BuffID: 24
|
||||
{ BuffID.Confused, short.MaxValue }, // BuffID: 31 Brain of Confusion Internal Item ID: 3223
|
||||
{ BuffID.CursedInferno, 420 }, // BuffID: 39
|
||||
{ BuffID.CursedInferno, 600 }, // BuffID: 39
|
||||
{ BuffID.Frostburn, 900 }, // BuffID: 44
|
||||
{ BuffID.Ichor, 1200 }, // BuffID: 69
|
||||
{ BuffID.Venom, 1800 }, // BuffID: 70
|
||||
|
|
|
|||
|
|
@ -6462,7 +6462,7 @@ namespace TShockAPI
|
|||
if (target == user)
|
||||
user.SendSuccessMessage(GetString($"You buffed yourself with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds."));
|
||||
else
|
||||
target.SendSuccessMessage(GetString($"You have buffed {user.Name} with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds!"));
|
||||
user.SendSuccessMessage(GetString($"You have buffed {target.Name} with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds!"));
|
||||
if (!args.Silent && target != user)
|
||||
target.SendSuccessMessage(GetString($"{user.Name} has buffed you with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds!"));
|
||||
}
|
||||
|
|
@ -6740,10 +6740,6 @@ namespace TShockAPI
|
|||
|
||||
playerToGod.GodMode = !playerToGod.GodMode;
|
||||
|
||||
var godPower = CreativePowerManager.Instance.GetPower<CreativePowers.GodmodePower>();
|
||||
|
||||
godPower.SetEnabledState(playerToGod.Index, playerToGod.GodMode);
|
||||
|
||||
if (playerToGod != args.Player)
|
||||
{
|
||||
args.Player.SendSuccessMessage(playerToGod.GodMode
|
||||
|
|
|
|||
|
|
@ -320,8 +320,8 @@ namespace TShockAPI.Configuration
|
|||
[Description("The reason given if banning a mediumcore player on death.")]
|
||||
public string MediumcoreBanReason = GetString("Death results in a ban");
|
||||
|
||||
/// <summary>Disbales IP bans by default, if no arguments are passed to the ban command.</summary>
|
||||
[Description("Disbales IP bans by default, if no arguments are passed to the ban command.")]
|
||||
/// <summary>Disables IP bans by default, if no arguments are passed to the ban command.</summary>
|
||||
[Description("Disables IP bans by default, if no arguments are passed to the ban command.")]
|
||||
public bool DisableDefaultIPBan;
|
||||
|
||||
/// <summary>Enable or disable the whitelist based on IP addresses in the whitelist.txt file.</summary>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -529,18 +529,9 @@ namespace TShockAPI
|
|||
field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute;
|
||||
var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : GetString("No description available.");
|
||||
|
||||
var commands = GetCommands(name);
|
||||
foreach (var c in commands)
|
||||
{
|
||||
for (var i = 0; i < c.Names.Count; i++)
|
||||
{
|
||||
c.Names[i] = "/" + c.Names[i];
|
||||
}
|
||||
}
|
||||
var strs =
|
||||
commands.Select(
|
||||
c =>
|
||||
c.Name + (c.Names.Count > 1 ? " ({0})".SFormat(string.Join(" ", c.Names.ToArray(), 1, c.Names.Count - 1)) : ""));
|
||||
var strs = GetCommands(name).Select(c => c.Names.Count > 1
|
||||
? $"/{c.Name} (/{string.Join(" /", c.Names.Skip(1))})"
|
||||
: $"/{c.Name}");
|
||||
|
||||
sb.AppendLine($"## {name}");
|
||||
sb.AppendLine($"{desc}");
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ using TShockAPI.Hooks;
|
|||
using TShockAPI.Net;
|
||||
using Timer = System.Timers.Timer;
|
||||
using System.Linq;
|
||||
using Terraria.GameContent.Creative;
|
||||
|
||||
namespace TShockAPI
|
||||
{
|
||||
|
|
@ -935,9 +936,15 @@ namespace TShockAPI
|
|||
public bool LoginHarassed = false;
|
||||
|
||||
/// <summary>
|
||||
/// Player cant die, unless onehit
|
||||
/// Controls the journey godmode
|
||||
/// </summary>
|
||||
public bool GodMode = false;
|
||||
public bool GodMode
|
||||
{
|
||||
get =>
|
||||
CreativePowerManager.Instance.GetPower<CreativePowers.GodmodePower>().IsEnabledForPlayer(Index);
|
||||
set =>
|
||||
CreativePowerManager.Instance.GetPower<CreativePowers.GodmodePower>().SetEnabledState(Index, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Players controls are inverted if using SSC
|
||||
|
|
@ -981,7 +988,7 @@ namespace TShockAPI
|
|||
get
|
||||
{
|
||||
return RealPlayer
|
||||
&& (Netplay.Clients[Index] != null && Netplay.Clients[Index].IsActive && !Netplay.Clients[Index].PendingTermination);
|
||||
&& (Client != null && Client.IsActive && !Client.PendingTermination);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -998,8 +1005,8 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public int State
|
||||
{
|
||||
get { return Netplay.Clients[Index].State; }
|
||||
set { Netplay.Clients[Index].State = value; }
|
||||
get { return Client.State; }
|
||||
set { Client.State = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -1007,7 +1014,7 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public string UUID
|
||||
{
|
||||
get { return RealPlayer ? Netplay.Clients[Index].ClientUUID : ""; }
|
||||
get { return RealPlayer ? Client.ClientUUID : ""; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -1019,8 +1026,8 @@ namespace TShockAPI
|
|||
{
|
||||
if (string.IsNullOrEmpty(CacheIP))
|
||||
return
|
||||
CacheIP = RealPlayer ? (Netplay.Clients[Index].Socket.IsConnected()
|
||||
? TShock.Utils.GetRealIP(Netplay.Clients[Index].Socket.GetRemoteAddress().ToString())
|
||||
CacheIP = RealPlayer ? (Client.Socket.IsConnected()
|
||||
? TShock.Utils.GetRealIP(Client.Socket.GetRemoteAddress().ToString())
|
||||
: "")
|
||||
: "127.0.0.1";
|
||||
else
|
||||
|
|
@ -1103,6 +1110,11 @@ namespace TShockAPI
|
|||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Player RemoteClient.
|
||||
/// </summary>
|
||||
public RemoteClient Client => Netplay.Clients[Index];
|
||||
|
||||
/// <summary>
|
||||
/// Gets the Terraria Player object associated with the player.
|
||||
/// </summary>
|
||||
|
|
@ -1135,6 +1147,11 @@ namespace TShockAPI
|
|||
get { return TPlayer.team; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets PvP player mode.
|
||||
/// </summary>
|
||||
public bool Hostile => TPlayer.hostile;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the player's X coordinate.
|
||||
/// </summary>
|
||||
|
|
@ -1487,6 +1504,41 @@ namespace TShockAPI
|
|||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Changes the values of the <see cref="RemoteClient.TileSections"/> array.
|
||||
/// </summary>
|
||||
/// <param name="rectangle">The area of the sections you want to set a value to.
|
||||
/// The minimum size should be set to 200x150. If null, then the entire map is specified.</param>
|
||||
/// <param name="isLoaded">Is the section loaded.</param>
|
||||
// The server does not send the player the whole world, it sends it in sections. To do this, it sets up visible and invisible sections.
|
||||
// If the player was not in any section(Client.TileSections[x, y] == false) then the server will send the missing section of the world.
|
||||
// This method allows you to simulate what the player has or has not seen these sections.
|
||||
// For example, we can put some number of earths blocks in some vast area, for example, for the whole world, but the player will not see the changes, because some section is already loaded for him. At this point this method can come into effect! With it we will be able to select some zone and make it both visible and invisible to the player.
|
||||
// The server will assume that the zone is not loaded on the player, and will resend the data, but with earth blocks.
|
||||
public void UpdateSection(Rectangle? rectangle = null, bool isLoaded = false)
|
||||
{
|
||||
if (rectangle.HasValue)
|
||||
{
|
||||
for (int i = Netplay.GetSectionX(rectangle.Value.X); i < Netplay.GetSectionX(rectangle.Value.X + rectangle.Value.Width) && i < Main.maxSectionsX; i++)
|
||||
{
|
||||
for (int j = Netplay.GetSectionY(rectangle.Value.Y); j < Netplay.GetSectionY(rectangle.Value.Y + rectangle.Value.Height) && j < Main.maxSectionsY; j++)
|
||||
{
|
||||
Client.TileSections[i, j] = isLoaded;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < Main.maxSectionsX; i++)
|
||||
{
|
||||
for (int j = 0; j < Main.maxSectionsY; j++)
|
||||
{
|
||||
Client.TileSections[i, j] = isLoaded;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gives an item to the player. Includes banned item spawn prevention to check if the player can spawn the item.
|
||||
/// </summary>
|
||||
|
|
@ -1519,6 +1571,15 @@ namespace TShockAPI
|
|||
GiveItemByDrop(type, stack, prefix);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gives an item to the player.
|
||||
/// </summary>
|
||||
/// <param name="item">Item with data to be given to the player.</param>
|
||||
public virtual void GiveItem(NetItem item)
|
||||
{
|
||||
GiveItem(item.NetId, item.Stack, item.PrefixId);
|
||||
}
|
||||
|
||||
private Item EmptySentinelItem = new Item();
|
||||
|
||||
private bool Depleted(Item item)
|
||||
|
|
@ -1815,7 +1876,17 @@ namespace TShockAPI
|
|||
/// <param name="damage">The amount of damage the player will take.</param>
|
||||
public virtual void DamagePlayer(int damage)
|
||||
{
|
||||
NetMessage.SendPlayerHurt(Index, PlayerDeathReason.LegacyDefault(), damage, (new Random()).Next(-1, 1), false, false, 0, -1, -1);
|
||||
DamagePlayer(damage, PlayerDeathReason.LegacyDefault());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wounds the player with the given damage.
|
||||
/// </summary>
|
||||
/// <param name="damage">The amount of damage the player will take.</param>
|
||||
/// <param name="reason">The reason for causing damage to player.</param>
|
||||
public virtual void DamagePlayer(int damage, PlayerDeathReason reason)
|
||||
{
|
||||
NetMessage.SendPlayerHurt(Index, reason, damage, (new Random()).Next(-1, 1), false, false, 0, -1, -1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -1823,7 +1894,16 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public virtual void KillPlayer()
|
||||
{
|
||||
NetMessage.SendPlayerDeath(Index, PlayerDeathReason.LegacyDefault(), 99999, (new Random()).Next(-1, 1), false, -1, -1);
|
||||
KillPlayer(PlayerDeathReason.LegacyDefault());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Kills the player.
|
||||
/// </summary>
|
||||
/// <param name="reason">Reason for killing a player.</param>
|
||||
public virtual void KillPlayer(PlayerDeathReason reason)
|
||||
{
|
||||
NetMessage.SendPlayerDeath(Index, reason, 99999, (new Random()).Next(-1, 1), false, -1, -1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -1832,6 +1912,8 @@ namespace TShockAPI
|
|||
/// <param name="team">The team color index.</param>
|
||||
public virtual void SetTeam(int team)
|
||||
{
|
||||
if (team < 0 || team >= Main.teamColor.Length)
|
||||
throw new ArgumentException("The player's team is not in the range of available.");
|
||||
Main.player[Index].team = team;
|
||||
NetMessage.SendData((int)PacketTypes.PlayerTeam, -1, -1, NetworkText.Empty, Index);
|
||||
}
|
||||
|
|
@ -1840,6 +1922,7 @@ namespace TShockAPI
|
|||
/// Sets the player's pvp.
|
||||
/// </summary>
|
||||
/// <param name="mode">The state of the pvp mode.</param>
|
||||
/// <param name="withMsg">Whether a chat message about the change should be sent.</param>
|
||||
public virtual void SetPvP(bool mode, bool withMsg = false)
|
||||
{
|
||||
Main.player[Index].hostile = mode;
|
||||
|
|
@ -2064,7 +2147,7 @@ namespace TShockAPI
|
|||
if (!RealPlayer || !ConnectionAlive)
|
||||
return;
|
||||
|
||||
Netplay.Clients[Index].Socket.AsyncSend(data, 0, data.Length, Netplay.Clients[Index].ServerWriteCallBack);
|
||||
Client.Socket.AsyncSend(data, 0, data.Length, Client.ServerWriteCallBack);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ namespace TShockAPI
|
|||
/// <summary>VersionNum - The version number the TerrariaAPI will return back to the API. We just use the Assembly info.</summary>
|
||||
public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version;
|
||||
/// <summary>VersionCodename - The version codename is displayed when the server starts. Inspired by software codenames conventions.</summary>
|
||||
public static readonly string VersionCodename = "Thank you, everyone, for your support of TShock all these years! <3";
|
||||
public static readonly string VersionCodename = "Intensity";
|
||||
|
||||
/// <summary>SavePath - This is the path TShock saves its data in. This path is relative to the TerrariaServer.exe (not in ServerPlugins).</summary>
|
||||
public static string SavePath = "tshock";
|
||||
|
|
@ -428,6 +428,8 @@ namespace TShockAPI
|
|||
Hooks.AccountHooks.AccountDelete += OnAccountDelete;
|
||||
Hooks.AccountHooks.AccountCreate += OnAccountCreate;
|
||||
|
||||
On.Terraria.RemoteClient.Reset += RemoteClient_Reset;
|
||||
|
||||
GetDataHandlers.InitGetDataHandler();
|
||||
Commands.InitCommands();
|
||||
|
||||
|
|
@ -496,6 +498,12 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
private static void RemoteClient_Reset(On.Terraria.RemoteClient.orig_Reset orig, RemoteClient client)
|
||||
{
|
||||
client.ClientUUID = null;
|
||||
orig(client);
|
||||
}
|
||||
|
||||
private static void OnAchievementInitializerLoad(ILContext il)
|
||||
{
|
||||
// Modify AchievementInitializer.Load to remove the Main.netMode == 2 check (occupies the first 4 IL instructions)
|
||||
|
|
|
|||
|
|
@ -18,11 +18,11 @@
|
|||
Also, be sure to release on github with the exact assembly version tag as below
|
||||
so that the update manager works correctly (via the Github releases api and mimic)
|
||||
-->
|
||||
<Version>5.1.3</Version>
|
||||
<Version>5.2.1</Version>
|
||||
<AssemblyTitle>TShock for Terraria</AssemblyTitle>
|
||||
<Company>Pryaxis & TShock Contributors</Company>
|
||||
<Product>TShockAPI</Product>
|
||||
<Copyright>Copyright © Pryaxis & TShock Contributors 2011-2022</Copyright>
|
||||
<Copyright>Copyright © Pryaxis & TShock Contributors 2011-2023</Copyright>
|
||||
<!-- extras for nuget -->
|
||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
|
||||
|
|
@ -34,7 +34,7 @@
|
|||
<ItemGroup>
|
||||
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
|
||||
<PackageReference Include="GetText.NET" Version="1.7.14" />
|
||||
<PackageReference Include="MySql.Data" Version="8.0.31" />
|
||||
<PackageReference Include="MySql.Data" Version="8.4.0" />
|
||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="6.0.11" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,8 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public class TextLog : ILog, IDisposable
|
||||
{
|
||||
private readonly StreamWriter _logWriter;
|
||||
private readonly bool ClearFile;
|
||||
private StreamWriter _logWriter;
|
||||
|
||||
/// <summary>
|
||||
/// File name of the Text log
|
||||
|
|
@ -44,7 +45,7 @@ namespace TShockAPI
|
|||
public TextLog(string filename, bool clear)
|
||||
{
|
||||
FileName = filename;
|
||||
_logWriter = new StreamWriter(filename, !clear);
|
||||
ClearFile = clear;
|
||||
}
|
||||
|
||||
public bool MayWriteType(TraceLevel type)
|
||||
|
|
@ -247,6 +248,10 @@ namespace TShockAPI
|
|||
{
|
||||
if (!MayWriteType(level))
|
||||
return;
|
||||
if (_logWriter is null)
|
||||
{
|
||||
_logWriter = new StreamWriter(FileName, !ClearFile);
|
||||
}
|
||||
|
||||
var caller = "TShock";
|
||||
|
||||
|
|
@ -278,7 +283,10 @@ namespace TShockAPI
|
|||
|
||||
public void Dispose()
|
||||
{
|
||||
_logWriter.Dispose();
|
||||
if (_logWriter != null)
|
||||
{
|
||||
_logWriter.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue