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; 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 (!TShock.Config.Settings.IgnoreProjUpdate && !args.Player.HasPermission(Permissions.ignoreprojectiledetection))
{ {
if (type == ProjectileID.BlowupSmokeMoonlord if (type == ProjectileID.BlowupSmokeMoonlord

View file

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

View file

@ -1263,6 +1263,11 @@ namespace TShockAPI
/// <returns>True if allowed, otherwise false</returns> /// <returns>True if allowed, otherwise false</returns>
private bool OnCreep(int tileType) private bool OnCreep(int tileType)
{ {
if (WorldGen.generatingWorld)
{
return true;
}
if (!Config.Settings.AllowCrimsonCreep && (tileType == TileID.Dirt || tileType == TileID.CrimsonGrass if (!Config.Settings.AllowCrimsonCreep && (tileType == TileID.Dirt || tileType == TileID.CrimsonGrass
|| TileID.Sets.Crimson[tileType])) || TileID.Sets.Crimson[tileType]))
{ {
@ -1456,7 +1461,7 @@ namespace TShockAPI
if (!tsplr.FinishedHandshake) 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; args.Handled = true;
return; return;
} }

File diff suppressed because it is too large Load diff