Merge branch 'general-devel' into all-contributors/add-ndragon798
This commit is contained in:
commit
902b22a3c9
9 changed files with 316 additions and 129 deletions
|
|
@ -47,6 +47,17 @@
|
|||
"projectManagement"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Patrikkk",
|
||||
"name": "Patrikkk",
|
||||
"avatar_url": "https://avatars0.githubusercontent.com/u/58985873?v=4",
|
||||
"profile": "https://aurora-gaming.org/",
|
||||
"contributions": [
|
||||
"code",
|
||||
"doc",
|
||||
"test"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ndragon798",
|
||||
"name": "Nathan Easton",
|
||||
|
|
|
|||
6
.github/workflows/build.yml
vendored
6
.github/workflows/build.yml
vendored
|
|
@ -45,11 +45,15 @@ jobs:
|
|||
run: |
|
||||
nuget restore TShock.sln
|
||||
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe" .\TShockAPI\TShockAPI.csproj /p:Configuration=Release
|
||||
- name: Copy prebuilts into output folders
|
||||
- name: Normalize release packaging
|
||||
shell: cmd
|
||||
run: |
|
||||
xcopy /Y prebuilts\*.* TShockAPI\bin\Release
|
||||
xcopy /Y prebuilts\*.* TShockAPI\bin\Debug
|
||||
mkdir TShockAPI\bin\Debug\ServerPlugins
|
||||
mkdir TShockAPI\bin\Release\ServerPlugins
|
||||
move TShockAPI\bin\Release\TShockAPI.dll TShockAPI\bin\Release\ServerPlugins
|
||||
move TShockAPI\bin\Debug\TShockAPI.dll TShockAPI\bin\Debug\ServerPlugins
|
||||
- uses: actions/upload-artifact@master
|
||||
with:
|
||||
name: Experimental TShock (not debug)
|
||||
|
|
|
|||
23
CHANGELOG.md
23
CHANGELOG.md
|
|
@ -2,6 +2,29 @@
|
|||
|
||||
This is the rolling changelog for TShock for Terraria. Use past tense when adding new entries; sign your name off when you add or change something. This should primarily be things like user changes, not necessarily codebase changes unless it's really relevant or large.
|
||||
|
||||
## TShock 4.4.0 (Pre-release 3)
|
||||
* Fixed `/worldmode` command to correctly target world mode. (@Ristellise)
|
||||
* The following commands have been removed: `tbloodmoon`, `invade`, `dropmeteor`. `fullmoon`, `sandstorm`, `rain`, `eclipse`
|
||||
* The following command has been added to replace them: `worldevent`. This command requires the `tshock.world.events` permission.
|
||||
* `worldevent` can be used as so: `worldevent [event type] [sub type] [wave (if invasion event)]`
|
||||
* Valid event types are `meteor`, `fullmoon`, `bloodmoon`, `eclipse`, `invasion`, `sandstorm`, `rain`
|
||||
* Valid sub types are `goblins`, `snowmen`, `pirates`, `pumpkinmoon`, `frostmoon` for invasions, and `slime` for rain.
|
||||
|
||||
* A new set of permissions has been added under the node `tshock.world.events`:
|
||||
* `tshock.world.events.bloodmoon`: Enables access to the `worldevent bloodmoon` command
|
||||
* `tshock.world.events.fullmoon`: Enables access to the `worldevent fullmoon` command
|
||||
* `tshock.world.events.invasion`: Enables access to the `worldevent invasion` command
|
||||
* `tshock.world.events.eclipse`: Enables access to the `worldevent eclipse` command
|
||||
* `tshock.world.events.sandstorm`: Enables access to the `worldevent sandstorm` command
|
||||
* `tshock.world.events.rain`: Enables access to the `worldevent rain` command
|
||||
* `tshock.world.events.meteor`: Enables access to the `worldevent meteor` command
|
||||
|
||||
Please note that the permissions previously tied to the removed commands are also still used to confirm access to the new commands, so if you have existing configurations no one should have any new or lost access.
|
||||
|
||||
## TShock 4.4.0 (Pre-release 2)
|
||||
* Replaced `/expert` with `/worldmode` command. (@QuiCM)
|
||||
* Fixed NPC buff anticheat issue conflicting with Terraria gameplay changes (whips). (@Patrikkk)
|
||||
|
||||
## TShock 4.4.0 (Pre-release 1)
|
||||
* Added confused debuff to Bouncer for confusion applied from Brain of Confusion
|
||||
* API: Added return in OnNameCollision if hook has been handled. (@Patrikkk)
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ TShock is a toolbox for Terraria servers and communities. That toolbox is jam pa
|
|||
**We are currently polishing on Terraria 1.4.0.2 (curRelease = 226). For updates, check our [twitter, @Pryaxis](https://twitter.com/Pryaxis).**
|
||||
|
||||
* Download: [Stable](https://github.com/TShock/TShock/releases) or [Experimental](#experimental-downloads).
|
||||
* Download: [Plugins and tools](https://github.com/Pryaxis/plugins) that work with TShock, TSAPI, and Terraria.
|
||||
* Read [the documentation](https://tshock.readme.io/) to quickly get up to speed.
|
||||
* Join [Discord](https://discord.gg/Cav9nYX).
|
||||
* Use the ancient [old forums](https://tshock.co/xf/index.php?resources/) to find old stuff.
|
||||
|
|
@ -260,6 +261,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||
<td align="center"><a href="https://sgkoi.dev"><img src="https://avatars2.githubusercontent.com/u/9637711?v=4" width="100px;" alt=""/><br /><sub><b>Stargazing Koishi</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=sgkoishi" title="Code">💻</a> <a href="#infra-sgkoishi" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center"><a href="https://github.com/AxeelAnder"><img src="https://avatars2.githubusercontent.com/u/25691207?v=4" width="100px;" alt=""/><br /><sub><b>Axeel</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=AxeelAnder" title="Documentation">📖</a> <a href="#projectManagement-AxeelAnder" title="Project Management">📆</a></td>
|
||||
<td align="center"><a href="http://www.nathaneaston.com/"><img src="https://avatars2.githubusercontent.com/u/10368650?v=4" width="100px;" alt=""/><br /><sub><b>Nathan Easton</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=ndragon798" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://aurora-gaming.org/"><img src="https://avatars0.githubusercontent.com/u/58985873?v=4" width="100px;" alt=""/><br /><sub><b>Patrikkk</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=Patrikkk" title="Code">💻</a> <a href="https://github.com/Pryaxis/TShock/commits?author=Patrikkk" title="Documentation">📖</a> <a href="https://github.com/Pryaxis/TShock/commits?author=Patrikkk" title="Tests">⚠️</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||
<td align="center"><a href="https://sgkoi.dev"><img src="https://avatars2.githubusercontent.com/u/9637711?v=4" width="100px;" alt=""/><br /><sub><b>Stargazing Koishi</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=sgkoishi" title="Code">💻</a> <a href="#infra-sgkoishi" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center"><a href="https://github.com/AxeelAnder"><img src="https://avatars2.githubusercontent.com/u/25691207?v=4" width="100px;" alt=""/><br /><sub><b>Axeel</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=AxeelAnder" title="Documentation">📖</a> <a href="#projectManagement-AxeelAnder" title="Project Management">📆</a></td>
|
||||
<td align="center"><a href="http://www.nathaneaston.com/"><img src="https://avatars2.githubusercontent.com/u/10368650?v=4" width="100px;" alt=""/><br /><sub><b>Nathan Easton</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=ndragon798" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://aurora-gaming.org/"><img src="https://avatars0.githubusercontent.com/u/58985873?v=4" width="100px;" alt=""/><br /><sub><b>Patrikkk</b></sub></a><br /><a href="https://github.com/Pryaxis/TShock/commits?author=Patrikkk" title="Code">💻</a> <a href="https://github.com/Pryaxis/TShock/commits?author=Patrikkk" title="Documentation">📖</a> <a href="https://github.com/Pryaxis/TShock/commits?author=Patrikkk" title="Tests">⚠️</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
|
|
|||
|
|
@ -1402,7 +1402,8 @@ namespace TShockAPI
|
|||
|
||||
if (detectedNPCBuffTimeCheat)
|
||||
{
|
||||
args.Player.Kick("Added buff to NPC abnormally.", true);
|
||||
|
||||
args.Player.Kick($"Added buff to NPC abnormally.", true);
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -1868,7 +1869,7 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// These time values are references from Projectile.cs, at npc.AddBuff() calls.
|
||||
private static Dictionary<int, short> NPCAddBuffTimeMax = new Dictionary<int, short>()
|
||||
{
|
||||
{ BuffID.Poisoned, 3600 },
|
||||
|
|
@ -1891,7 +1892,16 @@ namespace TShockAPI
|
|||
{ BuffID.BetsysCurse, 600 },
|
||||
{ BuffID.Oiled, 540 },
|
||||
{ BuffID.Confused, 450 }, // Brain of Confusion Internal Item ID: 3223
|
||||
{ BuffID.Daybreak, 300 } // Solar Eruption Item ID: 3473, Daybreak Item ID: 3543
|
||||
{ BuffID.Daybreak, 300 }, // Solar Eruption Item ID: 3473, Daybreak Item ID: 3543
|
||||
{ BuffID.BlandWhipEnemyDebuff, 240 },
|
||||
{ BuffID.SwordWhipNPCDebuff, 240 },
|
||||
{ BuffID.ScytheWhipEnemyDebuff, 240 },
|
||||
{ BuffID.FlameWhipEnemyDebuff, 240 },
|
||||
{ BuffID.ThornWhipNPCDebuff, 240 },
|
||||
{ BuffID.RainbowWhipNPCDebuff, 240 },
|
||||
{ BuffID.MaceWhipNPCDebuff, 240 },
|
||||
{ BuffID.GelBalloonBuff, 1800 }
|
||||
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -400,10 +400,6 @@ namespace TShockAPI
|
|||
{
|
||||
HelpText = "Renames an NPC."
|
||||
});
|
||||
add(new Command(Permissions.invade, Invade, "invade")
|
||||
{
|
||||
HelpText = "Starts an NPC invasion."
|
||||
});
|
||||
add(new Command(Permissions.maxspawns, MaxSpawns, "maxspawns")
|
||||
{
|
||||
HelpText = "Sets the maximum number of NPCs."
|
||||
|
|
@ -470,31 +466,19 @@ namespace TShockAPI
|
|||
});
|
||||
#endregion
|
||||
#region World Commands
|
||||
add(new Command(Permissions.toggleexpert, ToggleExpert, "expert", "expertmode")
|
||||
add(new Command(Permissions.toggleexpert, ChangeWorldMode, "worldmode", "gamemode")
|
||||
{
|
||||
HelpText = "Toggles expert mode."
|
||||
HelpText = "Changes the world mode."
|
||||
});
|
||||
add(new Command(Permissions.antibuild, ToggleAntiBuild, "antibuild")
|
||||
{
|
||||
HelpText = "Toggles build protection."
|
||||
});
|
||||
add(new Command(Permissions.bloodmoon, Bloodmoon, "bloodmoon")
|
||||
{
|
||||
HelpText = "Sets a blood moon."
|
||||
});
|
||||
add(new Command(Permissions.grow, Grow, "grow")
|
||||
{
|
||||
AllowServer = false,
|
||||
HelpText = "Grows plants at your location."
|
||||
});
|
||||
add(new Command(Permissions.dropmeteor, DropMeteor, "dropmeteor")
|
||||
{
|
||||
HelpText = "Drops a meteor somewhere in the world."
|
||||
});
|
||||
add(new Command(Permissions.eclipse, Eclipse, "eclipse")
|
||||
{
|
||||
HelpText = "Sets an eclipse."
|
||||
});
|
||||
add(new Command(Permissions.halloween, ForceHalloween, "forcehalloween")
|
||||
{
|
||||
HelpText = "Toggles halloween mode (goodie bags, pumpkins, etc)."
|
||||
|
|
@ -503,9 +487,9 @@ namespace TShockAPI
|
|||
{
|
||||
HelpText = "Toggles christmas mode (present spawning, santa, etc)."
|
||||
});
|
||||
add(new Command(Permissions.fullmoon, Fullmoon, "fullmoon")
|
||||
add(new Command(Permissions.manageevents, ManageWorldEvent, "worldevent")
|
||||
{
|
||||
HelpText = "Sets a full moon."
|
||||
HelpText = "Enables starting and stopping various world events."
|
||||
});
|
||||
add(new Command(Permissions.hardmode, Hardmode, "hardmode")
|
||||
{
|
||||
|
|
@ -515,14 +499,6 @@ namespace TShockAPI
|
|||
{
|
||||
HelpText = "Toggles spawn protection."
|
||||
});
|
||||
add(new Command(Permissions.sandstorm, Sandstorm, "sandstorm")
|
||||
{
|
||||
HelpText = "Toggles sandstorms."
|
||||
});
|
||||
add(new Command(Permissions.rain, Rain, "rain")
|
||||
{
|
||||
HelpText = "Toggles the rain."
|
||||
});
|
||||
add(new Command(Permissions.worldsave, Save, "save")
|
||||
{
|
||||
HelpText = "Saves the world file."
|
||||
|
|
@ -1978,6 +1954,118 @@ namespace TShockAPI
|
|||
|
||||
#region Cause Events and Spawn Monsters Commands
|
||||
|
||||
static readonly List<string> _validEvents = new List<string>()
|
||||
{
|
||||
"meteor",
|
||||
"fullmoon",
|
||||
"bloodmoon",
|
||||
"eclipse",
|
||||
"invasion",
|
||||
"sandstorm",
|
||||
"rain"
|
||||
};
|
||||
static readonly List<string> _validInvasions = new List<string>()
|
||||
{
|
||||
"goblins",
|
||||
"snowmen",
|
||||
"pirates",
|
||||
"pumpkinmoon",
|
||||
"frostmoon"
|
||||
};
|
||||
|
||||
private static void ManageWorldEvent(CommandArgs args)
|
||||
{
|
||||
if (args.Parameters.Count < 1)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}worldevent <event type>", Specifier);
|
||||
args.Player.SendErrorMessage("Valid event types: {0}", String.Join(", ", _validEvents));
|
||||
args.Player.SendErrorMessage("Valid invasion types if spawning an invasion: {0}", String.Join(", ", _validInvasions));
|
||||
return;
|
||||
}
|
||||
|
||||
var eventType = args.Parameters[0].ToLowerInvariant();
|
||||
|
||||
void FailedPermissionCheck()
|
||||
{
|
||||
args.Player.SendErrorMessage("You do not have sufficient permissions to start the {0} event.", eventType);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (eventType)
|
||||
{
|
||||
case "meteor":
|
||||
if (!args.Player.HasPermission(Permissions.dropmeteor) && !args.Player.HasPermission(Permissions.managemeteorevent))
|
||||
{
|
||||
FailedPermissionCheck();
|
||||
return;
|
||||
}
|
||||
|
||||
DropMeteor(args);
|
||||
return;
|
||||
|
||||
case "fullmoon":
|
||||
case "full moon":
|
||||
if (!args.Player.HasPermission(Permissions.fullmoon) && !args.Player.HasPermission(Permissions.managefullmoonevent))
|
||||
{
|
||||
FailedPermissionCheck();
|
||||
return;
|
||||
}
|
||||
Fullmoon(args);
|
||||
return;
|
||||
|
||||
case "bloodmoon":
|
||||
case "blood moon":
|
||||
if (!args.Player.HasPermission(Permissions.bloodmoon) && !args.Player.HasPermission(Permissions.managebloodmoonevent))
|
||||
{
|
||||
FailedPermissionCheck();
|
||||
return;
|
||||
}
|
||||
Bloodmoon(args);
|
||||
return;
|
||||
|
||||
case "eclipse":
|
||||
if (!args.Player.HasPermission(Permissions.eclipse) && !args.Player.HasPermission(Permissions.manageeclipseevent))
|
||||
{
|
||||
FailedPermissionCheck();
|
||||
return;
|
||||
}
|
||||
Eclipse(args);
|
||||
return;
|
||||
|
||||
case "invade":
|
||||
case "invasion":
|
||||
if (!args.Player.HasPermission(Permissions.invade) && !args.Player.HasPermission(Permissions.manageinvasionevent))
|
||||
{
|
||||
FailedPermissionCheck();
|
||||
return;
|
||||
}
|
||||
Invade(args);
|
||||
return;
|
||||
|
||||
case "sandstorm":
|
||||
if (!args.Player.HasPermission(Permissions.sandstorm) && !args.Player.HasPermission(Permissions.managesandstormevent))
|
||||
{
|
||||
FailedPermissionCheck();
|
||||
return;
|
||||
}
|
||||
Sandstorm(args);
|
||||
return;
|
||||
|
||||
case "rain":
|
||||
if (!args.Player.HasPermission(Permissions.rain) && !args.Player.HasPermission(Permissions.managerainevent))
|
||||
{
|
||||
FailedPermissionCheck();
|
||||
return;
|
||||
}
|
||||
Rain(args);
|
||||
return;
|
||||
|
||||
default:
|
||||
args.Player.SendErrorMessage("Invalid event type! Valid event types: {0}", String.Join(", ", _validEvents));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DropMeteor(CommandArgs args)
|
||||
{
|
||||
WorldGen.spawnMeteor = false;
|
||||
|
|
@ -2035,14 +2123,15 @@ namespace TShockAPI
|
|||
{
|
||||
if (Main.invasionSize <= 0)
|
||||
{
|
||||
if (args.Parameters.Count < 1)
|
||||
if (args.Parameters.Count < 2)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}invade <invasion type> [wave]", Specifier);
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}worldevent invasion [invasion type] [invasion wave]", Specifier);
|
||||
args.Player.SendErrorMessage("Valid invasion types: {0}", String.Join(", ", _validInvasions));
|
||||
return;
|
||||
}
|
||||
|
||||
int wave = 1;
|
||||
switch (args.Parameters[0].ToLower())
|
||||
switch (args.Parameters[1].ToLowerInvariant())
|
||||
{
|
||||
case "goblin":
|
||||
case "goblins":
|
||||
|
|
@ -2064,9 +2153,9 @@ namespace TShockAPI
|
|||
|
||||
case "pumpkin":
|
||||
case "pumpkinmoon":
|
||||
if (args.Parameters.Count > 1)
|
||||
if (args.Parameters.Count > 2)
|
||||
{
|
||||
if (!int.TryParse(args.Parameters[1], out wave) || wave <= 0)
|
||||
if (!int.TryParse(args.Parameters[2], out wave) || wave <= 0)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid wave!");
|
||||
break;
|
||||
|
|
@ -2082,9 +2171,9 @@ namespace TShockAPI
|
|||
|
||||
case "frost":
|
||||
case "frostmoon":
|
||||
if (args.Parameters.Count > 1)
|
||||
if (args.Parameters.Count > 2)
|
||||
{
|
||||
if (!int.TryParse(args.Parameters[1], out wave) || wave <= 0)
|
||||
if (!int.TryParse(args.Parameters[2], out wave) || wave <= 0)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid wave!");
|
||||
return;
|
||||
|
|
@ -2103,6 +2192,10 @@ namespace TShockAPI
|
|||
TSPlayer.All.SendInfoMessage("{0} has started a martian invasion.", args.Player.Name);
|
||||
TShock.Utils.StartInvasion(4);
|
||||
break;
|
||||
|
||||
default:
|
||||
args.Player.SendErrorMessage("Invalid invasion type! Valid invasion types: {0}", String.Join(", ", _validInvasions));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (DD2Event.Ongoing)
|
||||
|
|
@ -2117,6 +2210,71 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
private static void Sandstorm(CommandArgs args)
|
||||
{
|
||||
if (Terraria.GameContent.Events.Sandstorm.Happening)
|
||||
{
|
||||
Terraria.GameContent.Events.Sandstorm.StopSandstorm();
|
||||
TSPlayer.All.SendInfoMessage("{0} stopped the sandstorm.", args.Player.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
Terraria.GameContent.Events.Sandstorm.StartSandstorm();
|
||||
TSPlayer.All.SendInfoMessage("{0} started a sandstorm.", args.Player.Name);
|
||||
}
|
||||
}
|
||||
|
||||
private static void Rain(CommandArgs args)
|
||||
{
|
||||
bool slime = false;
|
||||
if (args.Parameters.Count > 1 && args.Parameters[1].ToLowerInvariant() == "slime")
|
||||
{
|
||||
slime = true;
|
||||
}
|
||||
|
||||
if (!slime)
|
||||
{
|
||||
args.Player.SendInfoMessage("Use \"{0}worldevent rain slime\" to start slime rain!", Specifier);
|
||||
}
|
||||
|
||||
if (slime && Main.raining) //Slime rain cannot be activated during normal rain
|
||||
{
|
||||
args.Player.SendErrorMessage("You should stop the current downpour before beginning a slimier one!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (slime && Main.slimeRain) //Toggle slime rain off
|
||||
{
|
||||
Main.StopSlimeRain(false);
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} ended the slimey downpour.", args.Player.Name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (slime && !Main.slimeRain) //Toggle slime rain on
|
||||
{
|
||||
Main.StartSlimeRain(false);
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} caused it to rain slime.", args.Player.Name);
|
||||
}
|
||||
|
||||
if (Main.raining && !slime) //Toggle rain off
|
||||
{
|
||||
Main.StopRain();
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} ended the downpour.", args.Player.Name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Main.raining && !slime) //Toggle rain on
|
||||
{
|
||||
Main.StartRain();
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} caused it to rain.", args.Player.Name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private static void ClearAnglerQuests(CommandArgs args)
|
||||
{
|
||||
if (args.Parameters.Count > 0)
|
||||
|
|
@ -2143,17 +2301,46 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
private static void ToggleExpert(CommandArgs args)
|
||||
static Dictionary<string, int> _worldModes = new Dictionary<string, int>
|
||||
{
|
||||
const int NormalMode = 0;
|
||||
const int ExpertMode = 1;
|
||||
if (Main.GameMode != ExpertMode)
|
||||
Main.GameMode = ExpertMode;
|
||||
else if (Main.GameMode == ExpertMode)
|
||||
Main.GameMode = NormalMode;
|
||||
{ "normal", 0 },
|
||||
{ "expert", 1 },
|
||||
{ "master", 2 },
|
||||
{ "journey", 3 },
|
||||
{ "creative", 3 }
|
||||
};
|
||||
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
args.Player.SendSuccessMessage("Expert mode is now {0}.", Main.expertMode ? "on" : "off");
|
||||
private static void ChangeWorldMode(CommandArgs args)
|
||||
{
|
||||
if (args.Parameters.Count < 1)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}worldmode <mode>", Specifier);
|
||||
args.Player.SendErrorMessage("Valid mode: {0}", String.Join(", ", _worldModes.Keys));
|
||||
return;
|
||||
}
|
||||
|
||||
int mode;
|
||||
|
||||
if (int.TryParse(args.Parameters[0], out mode))
|
||||
{
|
||||
if (mode < 0 || mode > 3)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid mode! Valid modes: {0}", String.Join(", ", _worldModes.Keys));
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (_worldModes.ContainsKey(args.Parameters[0].ToLowerInvariant()))
|
||||
{
|
||||
mode = _worldModes[args.Parameters[0].ToLowerInvariant()];
|
||||
}
|
||||
else
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid mode! Valid modes: {0}", String.Join(", ", _worldModes.Keys));
|
||||
return;
|
||||
}
|
||||
|
||||
Main.GameMode = mode;
|
||||
args.Player.SendSuccessMessage("World mode set to {0}", _worldModes.Keys.ElementAt(mode));
|
||||
}
|
||||
|
||||
private static void Hardmode(CommandArgs args)
|
||||
|
|
@ -4024,81 +4211,6 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
private static void Sandstorm(CommandArgs args)
|
||||
{
|
||||
if (args.Parameters.Count < 1)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}sandstorm <stop/start>", Specifier);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (args.Parameters[0].ToLowerInvariant())
|
||||
{
|
||||
case "start":
|
||||
Terraria.GameContent.Events.Sandstorm.StartSandstorm();
|
||||
TSPlayer.All.SendInfoMessage("{0} started a sandstorm.", args.Player.Name);
|
||||
break;
|
||||
case "stop":
|
||||
Terraria.GameContent.Events.Sandstorm.StopSandstorm();
|
||||
TSPlayer.All.SendInfoMessage("{0} stopped the sandstorm.", args.Player.Name);
|
||||
break;
|
||||
default:
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}sandstorm <stop/start>", Specifier);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static void Rain(CommandArgs args)
|
||||
{
|
||||
if (args.Parameters.Count < 1 || args.Parameters.Count > 2)
|
||||
{
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}rain [slime] <stop/start>", Specifier);
|
||||
return;
|
||||
}
|
||||
|
||||
int switchIndex = 0;
|
||||
if (args.Parameters.Count == 2 && args.Parameters[0].ToLowerInvariant() == "slime")
|
||||
{
|
||||
switchIndex = 1;
|
||||
}
|
||||
|
||||
switch (args.Parameters[switchIndex].ToLower())
|
||||
{
|
||||
case "start":
|
||||
if (switchIndex == 1)
|
||||
{
|
||||
Main.StartSlimeRain(false);
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} caused it to rain slime.", args.Player.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
Main.StartRain();
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} caused it to rain.", args.Player.Name);
|
||||
}
|
||||
break;
|
||||
case "stop":
|
||||
if (switchIndex == 1)
|
||||
{
|
||||
Main.StopSlimeRain(false);
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} ended the slimey downpour.", args.Player.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
Main.StopRain();
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage("{0} ended the downpour.", args.Player.Name);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}rain [slime] <stop/start>", Specifier);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static void Slap(CommandArgs args)
|
||||
{
|
||||
if (args.Parameters.Count < 1 || args.Parameters.Count > 2)
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ namespace TShockAPI.DB
|
|||
try
|
||||
{
|
||||
database.Query(
|
||||
"INSERT INTO Regions (X1, Y1, width, height, RegionName, WorldID, UserIds, Protected, Groups, Owner, Z) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10);",
|
||||
"INSERT INTO Regions (X1, Y1, width, height, RegionName, WorldID, UserIds, Protected, `Groups`, Owner, Z) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10);",
|
||||
tx, ty, width, height, regionname, worldid, "", 1, "", owner, z);
|
||||
int id;
|
||||
using (QueryResult res = database.QueryReader("SELECT Id FROM Regions WHERE RegionName = @0 AND WorldID = @1", regionname, worldid))
|
||||
|
|
@ -609,7 +609,7 @@ namespace TShockAPI.DB
|
|||
{
|
||||
string mergedGroups = "";
|
||||
using (
|
||||
var reader = database.QueryReader("SELECT Groups FROM Regions WHERE RegionName=@0 AND WorldID=@1", regionName,
|
||||
var reader = database.QueryReader("SELECT `Groups` FROM Regions WHERE RegionName=@0 AND WorldID=@1", regionName,
|
||||
Main.worldID.ToString()))
|
||||
{
|
||||
if (reader.Read())
|
||||
|
|
@ -625,7 +625,7 @@ namespace TShockAPI.DB
|
|||
mergedGroups += ",";
|
||||
mergedGroups += groupName;
|
||||
|
||||
int q = database.Query("UPDATE Regions SET Groups=@0 WHERE RegionName=@1 AND WorldID=@2", mergedGroups,
|
||||
int q = database.Query("UPDATE Regions SET `Groups`=@0 WHERE RegionName=@1 AND WorldID=@2", mergedGroups,
|
||||
regionName, Main.worldID.ToString());
|
||||
|
||||
Region r = GetRegionByName(regionName);
|
||||
|
|
@ -654,7 +654,7 @@ namespace TShockAPI.DB
|
|||
{
|
||||
r.RemoveGroup(group);
|
||||
string groups = string.Join(",", r.AllowedGroups);
|
||||
int q = database.Query("UPDATE Regions SET Groups=@0 WHERE RegionName=@1 AND WorldID=@2", groups,
|
||||
int q = database.Query("UPDATE Regions SET `Groups`=@0 WHERE RegionName=@1 AND WorldID=@2", groups,
|
||||
regionName, Main.worldID.ToString());
|
||||
if (q > 0)
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -271,6 +271,30 @@ namespace TShockAPI
|
|||
|
||||
// tshock.world nodes
|
||||
|
||||
[Description("User can use the 'worldevent' command")]
|
||||
public static readonly string manageevents = "tshock.world.events";
|
||||
|
||||
[Description("User can use the 'bloodmoon' subcommand of the 'worldevent' command")]
|
||||
public static readonly string managebloodmoonevent = "tshock.world.events.bloodmoon";
|
||||
|
||||
[Description("User can use the 'fullmoon' subcommand of the 'worldevent' command")]
|
||||
public static readonly string managefullmoonevent = "tshock.world.events.fullmoon";
|
||||
|
||||
[Description("User can use the 'invasion' subcommand of the 'worldevent' command")]
|
||||
public static readonly string manageinvasionevent = "tshock.world.events.invasion";
|
||||
|
||||
[Description("User can use the 'meteor' subcommand of the 'worldevent' command")]
|
||||
public static readonly string managemeteorevent = "tshock.world.events.meteor";
|
||||
|
||||
[Description("User can use the 'eclipse' subcommand of the 'worldevent' command")]
|
||||
public static readonly string manageeclipseevent = "tshock.world.events.eclipse";
|
||||
|
||||
[Description("User can use the 'sandstorm' subcommand of the 'worldevent' command")]
|
||||
public static readonly string managesandstormevent = "tshock.world.events.sandstorm";
|
||||
|
||||
[Description("User can use the 'rain' subcommand of the 'worldevent' command")]
|
||||
public static readonly string managerainevent = "tshock.world.events.rain";
|
||||
|
||||
[Description("User can change expert state.")]
|
||||
public static readonly string toggleexpert = "tshock.world.toggleexpert";
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue