Merge branch 'general-devel' into general-devel

This commit is contained in:
Chris 2026-01-18 15:52:12 +10:30 committed by GitHub
commit 5dcffe52e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 364 additions and 313 deletions

View file

@ -1309,6 +1309,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

@ -2734,8 +2734,11 @@ namespace TShockAPI
if (OnPlayerSpawn(args.Player, args.Data, player, spawnX, spawnY, respawnTimer, numberOfDeathsPVE, numberOfDeathsPVP, context))
return true;
args.Player.Dead = respawnTimer > 0;
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;
}