Merge branch 'general-devel' into feature/db-connectionstrings

This commit is contained in:
Chris 2026-01-18 15:52:14 +10:30 committed by GitHub
commit 52d495d1a4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 30334 additions and 28896 deletions

View file

@ -1308,6 +1308,35 @@ namespace TShockAPI
return;
}
// Portal Gun Gate projectiles must meet several validation criteria:
// 1. The angle must be within valid discrete directions (45 degree increments)
// 2. Must have an active PortalGunBolt projectile associated
if (type == ProjectileID.PortalGunGate)
{
// Validate the gate angle is one of 8 possible cardinal directions (every 45 degrees)
var wrappedAngle = MathHelper.WrapAngle(ai[0]);
var discreteDirection = (int)Math.Round(wrappedAngle / (MathF.PI / 4f));
if (discreteDirection is < -3 or > 4)
{
TShock.Log.ConsoleDebug(GetString("Bouncer / OnNewProjectile rejected from portal gate from {0} (invalid angle: {1})", args.Player.Name, discreteDirection));
args.Player.RemoveProjectile(ident, owner);
args.Handled = true;
return;
}
// Validate we found an active bolt projectile
var boltProjectileData = args.Player.RecentlyCreatedProjectiles.FirstOrDefault(p => Main.projectile[p.Index].type == ProjectileID.PortalGunBolt);
if (boltProjectileData.Type == 0 || boltProjectileData.Killed)
{
TShock.Log.ConsoleDebug(GetString("Bouncer / OnNewProjectile rejected from portal gate from {0} (missing active Portal Gun bolt)", args.Player.Name, discreteDirection));
args.Player.RemoveProjectile(ident, owner);
args.Handled = true;
return;
}
boltProjectileData.Killed = true;
}
if (!TShock.Config.Settings.IgnoreProjUpdate && !args.Player.HasPermission(Permissions.ignoreprojectiledetection))
{
if (type == ProjectileID.BlowupSmokeMoonlord

View file

@ -565,7 +565,7 @@ namespace TShockAPI.DB
permissions.ForEach(p => group.AddPermission(p));
if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", group.Permissions, name) == 1)
return "Group " + name + " has been modified successfully.";
return GetString($"Group {name} has been modified successfully.");
// Restore old permissions so DB and internal object are in a consistent state
group.Permissions = oldperms;
@ -588,7 +588,7 @@ namespace TShockAPI.DB
permissions.ForEach(p => group.RemovePermission(p));
if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", group.Permissions, name) == 1)
return "Group " + name + " has been modified successfully.";
return GetString($"Group {name} has been modified successfully.");
// Restore old permissions so DB and internal object are in a consistent state
group.Permissions = oldperms;

View file

@ -2735,7 +2735,10 @@ namespace TShockAPI
if (OnPlayerSpawn(args.Player, args.Data, player, spawnX, spawnY, respawnTimer, numberOfDeathsPVE, numberOfDeathsPVP, context))
return true;
if (!Main.ServerSideCharacter || context != PlayerSpawnContext.SpawningIntoWorld)
{
args.Player.Dead = respawnTimer > 0;
}
if (Main.ServerSideCharacter)
{

View file

@ -1263,6 +1263,11 @@ namespace TShockAPI
/// <returns>True if allowed, otherwise false</returns>
private bool OnCreep(int tileType)
{
if (WorldGen.generatingWorld)
{
return true;
}
if (!Config.Settings.AllowCrimsonCreep && (tileType == TileID.Dirt || tileType == TileID.CrimsonGrass
|| TileID.Sets.Crimson[tileType]))
{
@ -1456,7 +1461,7 @@ namespace TShockAPI
if (!tsplr.FinishedHandshake)
{
tsplr.Kick(GetString("Your client didn't send the right connection information."), true);
tsplr.Kick(GetString("Your client didn't send the right connection information."), true, true);
args.Handled = true;
return;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff