Skip to content

Commit

Permalink
Restrict SyncLoadout with permission, add /tileprovider
Browse files Browse the repository at this point in the history
  • Loading branch information
sgkoishi committed Jan 5, 2023
1 parent ca85484 commit b4c9b21
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 15 deletions.
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# yaaiomni
[![Latest](https://img.shields.io/github/downloads/sgkoishi/yaaiomni/latest/total.svg) | ![Total](https://img.shields.io/github/downloads/sgkoishi/yaaiomni/total.svg)](https://github.com/sgkoishi/yaaiomni/releases)
[![Total Downloads](https://img.shields.io/github/downloads/sgkoishi/yaaiomni/total?label=Downloads%40Total&style=for-the-badge) ![Latest Downloads](https://img.shields.io/github/downloads/sgkoishi/yaaiomni/latest/total?label=Downloads%40Latest&style=for-the-badge)](https://github.com/sgkoishi/yaaiomni/releases)

Yet another misc plugin for TShock

#### Commands
Expand All @@ -12,14 +13,16 @@ Yet another misc plugin for TShock
| `/_pvp` | Toggle PvP. | Hidden by default. | `chireiden.omni.pvp` <br> `chireiden.omni.admin.setpvp` | |
| `/_team` | Toggle team. | Hidden by default. | `chireiden.omni.team` <br> `chireiden.omni.admin.setteam` | |
| `/_debugstat` | Show debug stats. | Hidden by default. | `chireiden.omni.admin.debugstat` | |
| `/_gc` | Trigger garbage collection. | Hidden by default. | `chireiden.omni.admin.gc`, | For admin. |
| `/_gc` | Trigger garbage collection. | Hidden by default. | `chireiden.omni.admin.gc`, `tshock.cfg.maintenance` | For admin. |
| `/maxplayers` | Set max players. | | `chireiden.omni.admin.maxplayers` | Might cause unexpected behaviour if lower than current max. |
| `/tileprovider` | Set tile provider. | | `chireiden.omni.admin.tileprovider` | For admin. |

#### Defaults
* The permission of `/ghost`, `/setlang`, `/_debugstat` is granted to the topmost parent of `owner` with kick permission, or `newadmin`'s parent if `owner` is not found.
* The permission of toggle pvp and team is granted to the guest group as TShock's config.
* Unable to toggle pvp and team without these permissions by default. (`.Permission.Restrict` in config)
* Version check is disabled. (`.SyncVersion` in config)
* The permission of `/_gc`, `/tileprovider` is granted to the topmost parent of `owner` with maintainence permission, or `trustedadmin`'s parent if `owner` is not found.
* The permission of switch loadout, pvp and team is granted to the guest group as TShock's config.
* Unable to switch without these permissions. (`.Permission.Restrict` in config)
* Vanilla version check is disabled. (`.SyncVersion` in config)
* Errors thrown from TShock's update check will be silently ignored. (`.SuppressUpdate` in config)

#### More options
Expand Down
2 changes: 2 additions & 0 deletions src/Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ public class RestrictSettings
public bool Enabled = true;
public bool ToggleTeam = true;
public bool TogglePvP = true;
public bool SyncLoadout = true;
}

public class PresetSettings
Expand Down Expand Up @@ -174,6 +175,7 @@ public class VanillaMode
TShockAPI.Permissions.sendemoji,
Plugin.Consts.Permissions.TogglePvP,
Plugin.Consts.Permissions.ToggleTeam,
Plugin.Consts.Permissions.SyncLoadout,
};
public bool AllowJourney = false;
public bool IgnoreAntiCheat = false;
Expand Down
1 change: 1 addition & 0 deletions src/Consts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public static class Permissions
public readonly static string ToggleTeam = "chireiden.omni.toggleteam";
public readonly static string PvPCommand = "chireiden.omni.setpvp";
public readonly static string TeamCommand = "chireiden.omni.setteam";
public readonly static string SyncLoadout = "chireiden.omni.syncloadout";
public static class Admin
{
public readonly static string Ghost = "chireiden.omni.ghost";
Expand Down
42 changes: 36 additions & 6 deletions src/PermissionRestrict.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ public partial class Plugin : TerrariaPlugin
{
private void Hook_Permission_TogglePvp(object? sender, TogglePvpEventArgs args)
{
var restrict = this.config.Permission.Restrict;
if (!restrict.Enabled)
if (args.Handled)
{
return;
}

if (!restrict.TogglePvP)
var restrict = this.config.Permission.Restrict;
if (!restrict.Enabled || !restrict.TogglePvP)
{
return;
}
Expand All @@ -35,13 +35,13 @@ private void Hook_Permission_TogglePvp(object? sender, TogglePvpEventArgs args)

private void Hook_Permission_PlayerTeam(object? sender, PlayerTeamEventArgs args)
{
var restrict = this.config.Permission.Restrict;
if (!restrict.Enabled)
if (args.Handled)
{
return;
}

if (!restrict.ToggleTeam)
var restrict = this.config.Permission.Restrict;
if (!restrict.Enabled || !restrict.ToggleTeam)
{
return;
}
Expand All @@ -59,4 +59,34 @@ private void Hook_Permission_PlayerTeam(object? sender, PlayerTeamEventArgs args
args.Handled = true;
Terraria.NetMessage.TrySendData((int) PacketTypes.PlayerTeam, -1, -1, NetworkText.Empty, args.PlayerId);
}

private void Hook_Permission_SyncLoadout(object? sender, OTAPI.Hooks.MessageBuffer.GetDataEventArgs args)
{
if (args.Result == OTAPI.HookResult.Cancel)
{
return;
}

if (args.PacketId != (int) PacketTypes.SyncLoadout)
{
return;
}

var restrict = this.config.Permission.Restrict;
if (!restrict.Enabled || !restrict.SyncLoadout)
{
return;
}

var player = TShockAPI.TShock.Players[args.Instance.whoAmI];
if (player == null || player.HasPermission(Consts.Permissions.SyncLoadout))
{
return;
}

args.Result = OTAPI.HookResult.Cancel;
// TSAPI is not respecting args.Result, so we have to craft invalid packet. Switch to Loadout 255 when only 3.
args.Instance.readBuffer[args.ReadOffset + 1] = 255;
Terraria.NetMessage.TrySendData((int) PacketTypes.SyncLoadout, -1, -1, null, args.Instance.whoAmI, player.TPlayer.CurrentLoadoutIndex);
}
}
2 changes: 2 additions & 0 deletions src/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ public override void Initialize()
On.Terraria.WorldGen.clearWorld += this.Hook_TileProvider_ClearWorld;
OTAPI.Hooks.NetMessage.SendBytes += this.Hook_Ghost_SendBytes;
OTAPI.Hooks.NetMessage.SendBytes += this.Hook_DebugPacket_SendBytes;
OTAPI.Hooks.MessageBuffer.GetData += this.Hook_Permission_SyncLoadout;
TerrariaApi.Server.ServerApi.Hooks.NetNameCollision.Register(this, this.Hook_NameCollision);
TerrariaApi.Server.ServerApi.Hooks.GamePostInitialize.Register(this, this.OnGamePostInitialize);
TShockAPI.Hooks.PlayerHooks.PlayerCommand += this.Hook_HideCommand_PlayerCommand;
Expand All @@ -113,6 +114,7 @@ protected override void Dispose(bool disposing)
OTAPI.Hooks.NetMessage.SendBytes -= this.Hook_Ghost_SendBytes;
OTAPI.Hooks.NetMessage.SendBytes -= this.Hook_DebugPacket_SendBytes;
OTAPI.Hooks.MessageBuffer.GetData -= this.Hook_Mitigation_GetData;
OTAPI.Hooks.MessageBuffer.GetData -= this.Hook_Permission_SyncLoadout;
OTAPI.Hooks.Netplay.CreateTcpListener -= this.Hook_Socket_OnCreate;
TerrariaApi.Server.ServerApi.Hooks.NetNameCollision.Deregister(this, this.Hook_NameCollision);
TerrariaApi.Server.ServerApi.Hooks.GamePostInitialize.Deregister(this, this.OnGamePostInitialize);
Expand Down
21 changes: 17 additions & 4 deletions src/Vanilla.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,37 @@ private void VanillaSetup()
private void PermissionSetup()
{
var preset = this.config.Permission.Preset;
if (!preset.Enabled)
var vanillaMode = this.config.Mode.Vanilla.Enabled;
if (!preset.Enabled && !vanillaMode)
{
return;
}

var guest = TShockAPI.TShock.Groups.GetGroupByName(TShockAPI.TShock.Config.Settings.DefaultGuestGroupName);
if (preset.Restrict)
if (preset.Restrict || vanillaMode)
{
guest?.AddPermission(Consts.Permissions.TogglePvP);
guest?.AddPermission(Consts.Permissions.ToggleTeam);
guest?.AddPermission(Consts.Permissions.SyncLoadout);
}

var na = TShockAPI.TShock.Groups.GetGroupByName("owner") ?? TShockAPI.TShock.Groups.GetGroupByName("newadmin");
na = Utils.ParentGroup(na, g => g.HasPermission(TShockAPI.Permissions.kick));
var na = Utils.ParentGroup(
TShockAPI.TShock.Groups.GetGroupByName("owner") ?? TShockAPI.TShock.Groups.GetGroupByName("newadmin"),
g => g.HasPermission(TShockAPI.Permissions.kick));

na?.AddPermission(Consts.Permissions.Admin.Ghost);
na?.AddPermission(Consts.Permissions.Admin.SetLanguage);
na?.AddPermission(Consts.Permissions.Admin.DebugStat);
na?.AddPermission(Consts.Permissions.Admin.MaxPlayers);
na?.AddPermission(Consts.Permissions.Admin.SetPvp);
na?.AddPermission(Consts.Permissions.Admin.SetTeam);
(preset.DebugForAdminOnly ? na : guest)?.AddPermission(Consts.Permissions.Whynot);

var ta = Utils.ParentGroup(
TShockAPI.TShock.Groups.GetGroupByName("owner") ?? TShockAPI.TShock.Groups.GetGroupByName("trustedadmin"),
g => g.HasPermission(TShockAPI.Permissions.maintenance));

ta?.AddPermission(Consts.Permissions.Admin.TileProvider);
ta?.AddPermission(Consts.Permissions.Admin.TriggerGarbageCollection);
}
}

0 comments on commit b4c9b21

Please sign in to comment.