【持ち込み対策のSSC編】Terrariaの鯖立てソフト、TShockのイロハ 

# 初めに
　お久しぶりです。前回の記事で「次回はそちらとSuper adminの付与、権限の付与といったアカウント関連の説明をします」と書きましたがそんなことはありませんでした。
　TShockを使うユーザは恐らく持ち込み制限のためのSSC、サーバサイドキャラクター目当てだと思いますので、その有効化方法とオススメ権限設定を共有することにします。
# SSCについて
　SSCとはなんぞや？という方向けに簡単に説明すると、サーバー側でキャラ管理して持ち込み完全に排除しようぜ！というやつです。
　完全に鯖側で管理するので、参加者がどのキャラを使おうがそのキャラのプレイ時間すら増えません。持ち込みを撲滅せよ。

## 今回の説明について
　細かいこと分からなくていいから動かせるようにしたい！って人向けの解説なので詳細は省きます。自分で色々弄りたい人はこの辺見ながら/group addperm使って弄ってください。
　使用するバージョンはTShock-5.2-for-Terraria-1.4.4.9-win-x64-Releaseですが恐らく大きく今後も使いまわせます。
 
https://tshock.readme.io/docs/permissions#user

 https://tshock.readme.io/docs/server-side-character-config
# SSCの有効化
　まず前回の記事の通りに進めていればtshockのフォルダはこんな感じになってるはずです。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/9f8c32f5-2886-250f-6ed7-b215c409c4cb.png)
　この中からsscconfig.jsonを見つけてメモ帳等で開きます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/f4703aaf-a093-2ed4-cfaa-99575c881dd1.png)

　開くとこんな感じ。この中の```"Enabled: false"```を```"Enabled: true"```に書き換えます。これで有効化完了です。前回と同じように鯖を立ててみましょう。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/f7ff5961-b52e-b43c-59e1-e61ed1c014ee.png)

　試しにこのキャラで鯖に入ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/ac2f2c53-d941-73fb-1038-cb932b8e4601.png)

 すると一見そのまま入れているように見えますが...![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/38aaa123-6371-56fc-682c-a7adbdf28137.png)

　このようにワールドへの干渉がブロックされます。移動してもワープで戻されます。（不具合で伐採だけ防げません）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/0786bb67-aa4a-28bb-36a9-b41356ffe3dc.png)

## ログイン

　これを解除するには、```/register "password"```でアカウントを作った後、```/login "password"```でそのアカウントにログインする必要があります。パスワードは任意の値に置き換えてください。例：```/register test```。この作業は初回だけです。
　入力後はこのように、持ち物等が全て初期状態になり、鯖側で作られたキャラを操作するようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/a5b9df74-4e01-2bea-4810-da69eee706a5.png)

　この初期状態のライフや持ち物は先述したsscconfig.jsonの値を変更することで弄れます。
　HP上限とか上限突破させる場合はそれに合わせてconfig.jsonも弄ってね。
 
 変更例
 ```ruby:sscconfig.json
{
  "Settings": {
    "Enabled": true,
    "ServerSideCharacterSave": 5,
    "LogonDiscardThreshold": 250,
    "StartingHealth": 4000,
    "StartingMana": 200,
    "StartingInventory": [
      {
        "netID": 3510,
        "prefix": 0,
        "stack": 1
      }
    ],
    "WarnPlayersAboutBypassPermission": true
  }
}
```

 ```ruby:config.json
{
  "Settings": {
    "ServerPassword": "",
    "ServerPort": 7777,
#--省略--
    "AnonymousBossInvasions": true,
    "MaxHP": 4000,
    "MaxMP": 200,
    "BombExplosionRadius": 5,
    "GiveItemsDirectly": false,
#--省略--
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/41d5d238-f3c4-5e73-bea3-8ecf3a3be115.png)

 
 itemID等に関しては公式wikiや下の日本語←→英語←→アイテムIDで相互変換できるサイト使ってください。~~URLが怪しいですが初心者が作ったサイトだから許して...~~
 
http://das013.s239.xrea.com/item.php

https://terraria.wiki.gg/wiki/Item_IDs


## 既存キャラのアイテムを引き継ぐには
　既に何度かマルチを行った後にtshock鯖に移行するなど、今後の持ち込みは防ぎたいけど今までのデータは持ち越したい場合は、先ほどやったようにログインしてもらった後に
 
```
/uploadssc "対象プレイヤーの名前"
```
を入力することで、サーバーにデータをアップロードして引き継いで使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/b3b4e66f-6a57-ebdd-e426-6b10df8075fc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/3adfad4f-4406-aa91-6d74-eb8f0365881c.png)


# 権限のオススメ設定
　これはSSCに限った話ではありませんが、tshockでは「権限」が重要になってきます。例：ワームホールポーションを使う許可を持たせる権限、```tshock.tp.wormhole```
　初期設定ではバニラと微妙に違うところがあるので、それらを修正したものを配布します。問題ないとは思いますが使用する際は自己責任でお願いします。
 
 　https://drive.google.com/file/d/13CNu28EKzFSNAz0FoEcqVh-8pGg1qPuI/

　ダウンロードした```tshock.sqlite```を以下のフォルダに上書きしてください。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125835/9f619205-ad13-5b59-884b-98abb5fc0005.png)

　この設定ではログインしたプレイヤーはバニラと同等程度の権限を持っています。
　大抵のコマンドを使える管理者は```/user group "キャラの名前" admin```、ban権限を持った管理者は```/user group "キャラの名前" trustedadmin```で設定できます。
 
# 終わりに
　以上でSSCを有効化した、持ち込み禁止のTShockの鯖建ては完了となります。
　何かありましたらコメント等で指摘お願いします。

# おまけ おすすめconfig.json
　墓の生成がオフになってたり爆破採掘でロックされたりするのを防ぎ、できるだけバニラに近づけたconfigを添付しておきます。コピペでそのまま上書きしてください。
 ```ruby:config.json
{
  "Settings": {
    "ServerPassword": "",
    "ServerPort": 7777,
    "MaxSlots": 8,
    "ReservedSlots": 20,
    "ServerName": "",
    "UseServerName": false,
    "LogPath": "tshock/logs",
    "DebugLogs": false,
    "DisableLoginBeforeJoin": false,
    "IgnoreChestStacksOnLoad": false,
    "WorldTileProvider": "default",
    "AutoSave": true,
    "AnnounceSave": true,
    "ShowBackupAutosaveMessages": true,
    "BackupInterval": 10,
    "BackupKeepFor": 240,
    "SaveWorldOnCrash": true,
    "SaveWorldOnLastPlayerExit": true,
    "InvasionMultiplier": 1,
    "DefaultMaximumSpawns": 5,
    "DefaultSpawnRate": 600,
    "InfiniteInvasion": false,
    "PvPMode": "normal",
    "SpawnProtection": false,
    "SpawnProtectionRadius": 10,
    "RangeChecks": true,
    "HardcoreOnly": false,
    "MediumcoreOnly": false,
    "SoftcoreOnly": false,
    "DisableBuild": false,
    "DisableHardmode": false,
    "DisableDungeonGuardian": false,
    "DisableClownBombs": false,
    "DisableSnowBalls": false,
    "DisableTombstones": false,
    "DisablePrimeBombs": false,
    "ForceTime": "normal",
    "DisableInvisPvP": false,
    "MaxRangeForDisabled": 10,
    "RegionProtectChests": false,
    "RegionProtectGemLocks": true,
    "IgnoreProjUpdate": false,
    "IgnoreProjKill": false,
    "AllowCutTilesAndBreakables": false,
    "AllowIce": false,
    "AllowCrimsonCreep": true,
    "AllowCorruptionCreep": true,
    "AllowHallowCreep": true,
    "StatueSpawn200": 3,
    "StatueSpawn600": 6,
    "StatueSpawnWorld": 10,
    "PreventBannedItemSpawn": false,
    "PreventDeadModification": true,
    "PreventInvalidPlaceStyle": true,
    "ForceXmas": false,
    "ForceHalloween": false,
    "AllowAllowedGroupsToSpawnBannedItems": false,
    "RespawnSeconds": 0,
    "RespawnBossSeconds": 0,
    "AnonymousBossInvasions": true,
    "MaxHP": 600,
    "MaxMP": 200,
    "BombExplosionRadius": 5,
    "GiveItemsDirectly": false,
    "DefaultRegistrationGroupName": "default",
    "DefaultGuestGroupName": "guest",
    "RememberLeavePos": false,
    "MaximumLoginAttempts": 3,
    "KickOnMediumcoreDeath": false,
    "MediumcoreKickReason": "Death results in a kick",
    "BanOnMediumcoreDeath": false,
    "MediumcoreBanReason": "Death results in a ban",
    "DisableDefaultIPBan": false,
    "EnableWhitelist": false,
    "WhitelistKickReason": "You are not on the whitelist.",
    "ServerFullReason": "Server is full",
    "ServerFullNoReservedReason": "Server is full. No reserved slots open.",
    "KickOnHardcoreDeath": false,
    "HardcoreKickReason": "Death results in a kick",
    "BanOnHardcoreDeath": false,
    "HardcoreBanReason": "Death results in a ban",
    "KickProxyUsers": true,
    "RequireLogin": false,
    "AllowLoginAnyUsername": true,
    "AllowRegisterAnyUsername": false,
    "MinimumPasswordLength": 4,
    "BCryptWorkFactor": 7,
    "DisableUUIDLogin": false,
    "KickEmptyUUID": false,
    "TilePaintThreshold": 15,
    "KickOnTilePaintThresholdBroken": false,
    "MaxDamage": 3000,
    "MaxProjDamage": 3000,
    "KickOnDamageThresholdBroken": false,
    "TileKillThreshold": 200,
    "KickOnTileKillThresholdBroken": false,
    "TilePlaceThreshold": 320,
    "KickOnTilePlaceThresholdBroken": false,
    "TileLiquidThreshold": 500,
    "KickOnTileLiquidThresholdBroken": false,
    "ProjIgnoreShrapnel": true,
    "ProjectileThreshold": 100,
    "KickOnProjectileThresholdBroken": false,
    "HealOtherThreshold": 100,
    "KickOnHealOtherThresholdBroken": false,
    "SuppressPermissionFailureNotices": false,
    "DisableModifiedZenith": false,
    "DisableCustomDeathMessages": true,
    "CommandSpecifier": "/",
    "CommandSilentSpecifier": ".",
    "DisableSpewLogs": true,
    "DisableSecondUpdateLogs": false,
    "SuperAdminChatRGB": [
      255,
      255,
      255
    ],
    "SuperAdminChatPrefix": "(Super Admin) ",
    "SuperAdminChatSuffix": "",
    "EnableGeoIP": false,
    "DisplayIPToAdmins": false,
    "ChatFormat": "{1}{2}{3}: {4}",
    "ChatAboveHeadsFormat": "{2}",
    "EnableChatAboveHeads": true,
    "BroadcastRGB": [
      127,
      255,
      212
    ],
    "StorageType": "sqlite",
    "SqliteDBPath": "tshock.sqlite",
    "MySqlHost": "localhost:3306",
    "MySqlDbName": "",
    "MySqlUsername": "",
    "MySqlPassword": "",
    "UseSqlLogs": false,
    "RevertToTextLogsOnSqlFailures": 10,
    "RestApiEnabled": false,
    "RestApiPort": 7878,
    "LogRest": false,
    "EnableTokenEndpointAuthentication": false,
    "RESTMaximumRequestsPerInterval": 5,
    "RESTRequestBucketDecreaseIntervalMinutes": 1,
    "ApplicationRestTokens": {}
  }
}
```