Merge pull request #1335 from NyxStudios/mintaka

Do not merge: Move to Mintaka.
This commit is contained in:
Lucas Nicodemus 2016-12-14 10:03:50 -07:00 committed by GitHub
commit 564a80cc5b
36 changed files with 373 additions and 71 deletions

View file

@ -26,6 +26,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
* Added `/uploadssc [player]` which allows someone to upload SSC data for [player] and store it on the server. Adds `tshock.ssc.upload` and `tshock.ssc.upload.others` permission nodes to match (@DogooFalchion). * Added `/uploadssc [player]` which allows someone to upload SSC data for [player] and store it on the server. Adds `tshock.ssc.upload` and `tshock.ssc.upload.others` permission nodes to match (@DogooFalchion).
* Added hardened stone to the whitelist of tiles editable by players (@DogooFalchion). * Added hardened stone to the whitelist of tiles editable by players (@DogooFalchion).
* Added conversion system to send convert old MOTD format into smart text, while preserving initial line starting values to keep byte optimization for background colors Thanks to (@WhiteXZ, @Simon311, and especially @DogooFalchion) for the hard work on this issue. * Added conversion system to send convert old MOTD format into smart text, while preserving initial line starting values to keep byte optimization for background colors Thanks to (@WhiteXZ, @Simon311, and especially @DogooFalchion) for the hard work on this issue.
* Fixed server-sided inventory issues caused by bank3 (@ProfessorXZ)
## TShock 4.3.20 ## TShock 4.3.20
* Security improvement: The auth system is now automatically disabled if a superadmin exists in the database (@Enerdy). * Security improvement: The auth system is now automatically disabled if a superadmin exists in the database (@Enerdy).

View file

@ -1,21 +1,27 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 14
VisualStudioVersion = 12.0.40629.0 VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{755F5B05-0924-47E9-9563-26EB20FE3F67}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{755F5B05-0924-47E9-9563-26EB20FE3F67}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TShockAPI", "TShockAPI\TShockAPI.csproj", "{49606449-072B-4CF5-8088-AA49DA586694}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TShockAPI", "TShockAPI\TShockAPI.csproj", "{49606449-072B-4CF5-8088-AA49DA586694}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TerrariaServer", "TerrariaServerAPI\TerrariaServer.csproj", "{6877506E-ADC6-4142-98A6-79E4FA02855A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TerrariaServerAPI", "TerrariaServerAPI\TerrariaServerAPI\TerrariaServerAPI.csproj", "{6877506E-ADC6-4142-98A6-79E4FA02855A}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Mono|Any CPU = Mono|Any CPU
Mono|Mixed Platforms = Mono|Mixed Platforms
Mono|x64 = Mono|x64
Mono|x86 = Mono|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms Release|Mixed Platforms = Release|Mixed Platforms
Release|x64 = Release|x64
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
@ -23,20 +29,43 @@ Global
{49606449-072B-4CF5-8088-AA49DA586694}.Debug|Any CPU.Build.0 = Debug|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Debug|x64.ActiveCfg = Debug|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Debug|x64.Build.0 = Debug|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Debug|x86.ActiveCfg = Debug|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Debug|x86.ActiveCfg = Debug|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|Any CPU.ActiveCfg = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|Any CPU.Build.0 = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|Mixed Platforms.Build.0 = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|x64.ActiveCfg = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|x64.Build.0 = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|x86.ActiveCfg = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Mono|x86.Build.0 = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Release|Any CPU.ActiveCfg = Release|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Release|Any CPU.Build.0 = Release|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Release|Any CPU.Build.0 = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Release|Mixed Platforms.Build.0 = Release|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Release|x64.ActiveCfg = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Release|x64.Build.0 = Release|Any CPU
{49606449-072B-4CF5-8088-AA49DA586694}.Release|x86.ActiveCfg = Release|Any CPU {49606449-072B-4CF5-8088-AA49DA586694}.Release|x86.ActiveCfg = Release|Any CPU
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|Any CPU.ActiveCfg = Debug|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|Any CPU.ActiveCfg = Debug|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|Mixed Platforms.Build.0 = Debug|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|Mixed Platforms.Build.0 = Debug|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|x64.ActiveCfg = Debug|x64
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|x64.Build.0 = Debug|x64
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|x86.ActiveCfg = Debug|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|x86.ActiveCfg = Debug|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|x86.Build.0 = Debug|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Debug|x86.Build.0 = Debug|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Mono|Any CPU.ActiveCfg = Mono|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Mono|Mixed Platforms.ActiveCfg = Mono|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Mono|Mixed Platforms.Build.0 = Mono|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Mono|x64.ActiveCfg = Mono|x64
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Mono|x64.Build.0 = Mono|x64
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Mono|x86.ActiveCfg = Mono|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Mono|x86.Build.0 = Mono|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|Any CPU.ActiveCfg = Release|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|Any CPU.ActiveCfg = Release|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|Mixed Platforms.ActiveCfg = Release|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|Mixed Platforms.ActiveCfg = Release|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|Mixed Platforms.Build.0 = Release|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|Mixed Platforms.Build.0 = Release|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|x64.ActiveCfg = Release|x64
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|x64.Build.0 = Release|x64
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|x86.ActiveCfg = Release|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|x86.ActiveCfg = Release|x86
{6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|x86.Build.0 = Release|x86 {6877506E-ADC6-4142-98A6-79E4FA02855A}.Release|x86.Build.0 = Release|x86
EndGlobalSection EndGlobalSection

View file

@ -62,7 +62,7 @@ namespace TShockAPI
string worldname = Main.worldPathName; string worldname = Main.worldPathName;
string name = Path.GetFileName(worldname); string name = Path.GetFileName(worldname);
Main.worldPathName = Path.Combine(BackupPath, string.Format("{0}.{1:dd.MM.yy-HH.mm.ss}.bak", name, DateTime.UtcNow)); Main.ActiveWorldFileData._path = Path.Combine(BackupPath, string.Format("{0}.{1:dd.MM.yy-HH.mm.ss}.bak", name, DateTime.UtcNow));
string worldpath = Path.GetDirectoryName(Main.worldPathName); string worldpath = Path.GetDirectoryName(Main.worldPathName);
if (worldpath != null && !Directory.Exists(worldpath)) if (worldpath != null && !Directory.Exists(worldpath))
@ -80,7 +80,7 @@ namespace TShockAPI
Console.ForegroundColor = ConsoleColor.Gray; Console.ForegroundColor = ConsoleColor.Gray;
TShock.Log.Info(string.Format("World backed up ({0}).", Main.worldPathName)); TShock.Log.Info(string.Format("World backed up ({0}).", Main.worldPathName));
Main.worldPathName = worldname; Main.ActiveWorldFileData._path = worldname;
} }
catch (Exception ex) catch (Exception ex)
{ {

8
TShockAPI/Commands.cs Executable file → Normal file
View file

@ -31,6 +31,8 @@ using TShockAPI.DB;
using TerrariaApi.Server; using TerrariaApi.Server;
using TShockAPI.Hooks; using TShockAPI.Hooks;
using Terraria.GameContent.Events; using Terraria.GameContent.Events;
using Microsoft.Xna.Framework;
using OTAPI.Tile;
namespace TShockAPI namespace TShockAPI
{ {
@ -2116,7 +2118,7 @@ namespace TShockAPI
else else
{ {
Main.anglerWhoFinishedToday.Clear(); Main.anglerWhoFinishedToday.Clear();
NetMessage.SendAnglerQuest(); NetMessage.SendAnglerQuest(-1);
args.Player.SendSuccessMessage("Cleared all users from the angler quest completion list for today."); args.Player.SendSuccessMessage("Cleared all users from the angler quest completion list for today.");
} }
} }
@ -4437,7 +4439,7 @@ namespace TShockAPI
// Could be improved by sending raw tile data to the client instead but not really // Could be improved by sending raw tile data to the client instead but not really
// worth the effort as chances are very low that overwriting the wire for a few // worth the effort as chances are very low that overwriting the wire for a few
// nanoseconds will cause much trouble. // nanoseconds will cause much trouble.
Tile tile = Main.tile[boundaryPoint.X, boundaryPoint.Y]; ITile tile = Main.tile[boundaryPoint.X, boundaryPoint.Y];
bool oldWireState = tile.wire(); bool oldWireState = tile.wire();
tile.wire(true); tile.wire(true);
@ -5177,7 +5179,7 @@ namespace TShockAPI
else else
{ {
var plr = players[0]; var plr = players[0];
plr.DamagePlayer(999999); plr.KillPlayer();
args.Player.SendSuccessMessage(string.Format("You just killed {0}!", plr.Name)); args.Player.SendSuccessMessage(string.Format("You just killed {0}!", plr.Name));
plr.SendErrorMessage("{0} just killed you!", args.Player.Name); plr.SendErrorMessage("{0} just killed you!", args.Player.Name);
} }

0
TShockAPI/ConfigFile.cs Executable file → Normal file
View file

0
TShockAPI/DB/BanManager.cs Executable file → Normal file
View file

0
TShockAPI/DB/CharacterManager.cs Executable file → Normal file
View file

0
TShockAPI/DB/GroupManager.cs Executable file → Normal file
View file

0
TShockAPI/DB/ItemManager.cs Executable file → Normal file
View file

0
TShockAPI/DB/ProjectileManager.cs Executable file → Normal file
View file

1
TShockAPI/DB/RegionManager.cs Executable file → Normal file
View file

@ -22,6 +22,7 @@ using System.Data;
using System.Linq; using System.Linq;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using Terraria; using Terraria;
using Microsoft.Xna.Framework;
namespace TShockAPI.DB namespace TShockAPI.DB
{ {

1
TShockAPI/DB/RememberedPosManager.cs Executable file → Normal file
View file

@ -20,6 +20,7 @@ using System;
using System.Data; using System.Data;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using Terraria; using Terraria;
using Microsoft.Xna.Framework;
namespace TShockAPI.DB namespace TShockAPI.DB
{ {

0
TShockAPI/DB/SqlTable.cs Executable file → Normal file
View file

0
TShockAPI/DB/TileManager.cs Executable file → Normal file
View file

0
TShockAPI/DB/UserManager.cs Executable file → Normal file
View file

1
TShockAPI/DB/WarpsManager.cs Executable file → Normal file
View file

@ -23,6 +23,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using Terraria; using Terraria;
using Microsoft.Xna.Framework;
namespace TShockAPI.DB namespace TShockAPI.DB
{ {

4
TShockAPI/GetDataHandlers.cs Executable file → Normal file
View file

@ -32,6 +32,8 @@ using Terraria;
using Terraria.ObjectData; using Terraria.ObjectData;
using Terraria.DataStructures; using Terraria.DataStructures;
using Terraria.GameContent.Tile_Entities; using Terraria.GameContent.Tile_Entities;
using Microsoft.Xna.Framework;
using OTAPI.Tile;
namespace TShockAPI namespace TShockAPI
{ {
@ -2053,7 +2055,7 @@ namespace TShockAPI
Item selectedItem = args.Player.SelectedItem; Item selectedItem = args.Player.SelectedItem;
int lastKilledProj = args.Player.LastKilledProjectile; int lastKilledProj = args.Player.LastKilledProjectile;
Tile tile = Main.tile[tileX, tileY]; ITile tile = Main.tile[tileX, tileY];
if (action == EditAction.PlaceTile) if (action == EditAction.PlaceTile)
{ {

0
TShockAPI/Hooks/AccountHooks.cs Executable file → Normal file
View file

View file

@ -76,6 +76,15 @@ namespace TShockAPI
/// </summary> /// </summary>
public static readonly int MaxInventory = InventorySlots + ArmorSlots + DyeSlots + MiscEquipSlots + MiscDyeSlots + PiggySlots + SafeSlots + ForgeSlots + 1; public static readonly int MaxInventory = InventorySlots + ArmorSlots + DyeSlots + MiscEquipSlots + MiscDyeSlots + PiggySlots + SafeSlots + ForgeSlots + 1;
public static readonly Tuple<int, int> InventoryIndex = new Tuple<int, int>(0, InventorySlots);
public static readonly Tuple<int, int> ArmorIndex = new Tuple<int, int>(InventoryIndex.Item2, InventoryIndex.Item2 + ArmorSlots);
public static readonly Tuple<int, int> DyeIndex = new Tuple<int, int>(ArmorIndex.Item2, ArmorIndex.Item2 + DyeSlots);
public static readonly Tuple<int, int> MiscEquipIndex = new Tuple<int, int>(DyeIndex.Item2, DyeIndex.Item2 + MiscEquipSlots);
public static readonly Tuple<int, int> MiscDyeIndex = new Tuple<int, int>(MiscEquipIndex.Item2, MiscEquipIndex.Item2 + MiscDyeSlots);
public static readonly Tuple<int, int> PiggyIndex = new Tuple<int, int>(MiscDyeIndex.Item2, MiscDyeIndex.Item2 + PiggySlots);
public static readonly Tuple<int, int> SafeIndex = new Tuple<int, int>(PiggyIndex.Item2, PiggyIndex.Item2 + SafeSlots);
public static readonly Tuple<int, int> ForgeIndex = new Tuple<int, int>(SafeIndex.Item2, SafeIndex.Item2 + ForgeSlots);
[JsonProperty("netID")] [JsonProperty("netID")]
private int _netId; private int _netId;
[JsonProperty("prefix")] [JsonProperty("prefix")]

View file

@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using Microsoft.Xna.Framework;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;

View file

@ -16,7 +16,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using Terraria; using Microsoft.Xna.Framework;
using Terraria;
using TShockAPI; using TShockAPI;
namespace TShockAPI namespace TShockAPI
@ -122,64 +123,51 @@ namespace TShockAPI
for (int i = 0; i < NetItem.MaxInventory; i++) for (int i = 0; i < NetItem.MaxInventory; i++)
{ {
if (i < NetItem.InventorySlots) if (i < NetItem.InventoryIndex.Item2)
{ {
//0-58 //0-58
this.inventory[i] = (NetItem)inventory[i]; this.inventory[i] = (NetItem)inventory[i];
} }
else if (i < NetItem.InventorySlots + NetItem.ArmorSlots) else if (i < NetItem.ArmorIndex.Item2)
{ {
//59-78 //59-78
var index = i - NetItem.InventorySlots; var index = i - NetItem.ArmorIndex.Item1;
this.inventory[i] = (NetItem)armor[index]; this.inventory[i] = (NetItem)armor[index];
} }
else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots) else if (i < NetItem.DyeIndex.Item2)
{ {
//79-88 //79-88
var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots); var index = i - NetItem.DyeIndex.Item1;
this.inventory[i] = (NetItem)dye[index]; this.inventory[i] = (NetItem)dye[index];
} }
else if (i < else if (i < NetItem.MiscEquipIndex.Item2)
NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots)
{ {
//89-93 //89-93
var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots); var index = i - NetItem.MiscEquipIndex.Item1;
this.inventory[i] = (NetItem)miscEqups[index]; this.inventory[i] = (NetItem)miscEqups[index];
} }
else if (i < else if (i < NetItem.MiscDyeIndex.Item2)
NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots
+ NetItem.MiscDyeSlots)
{ {
//93-98 //93-98
var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots var index = i - NetItem.MiscDyeIndex.Item1;
+ NetItem.MiscEquipSlots);
this.inventory[i] = (NetItem)miscDyes[index]; this.inventory[i] = (NetItem)miscDyes[index];
} }
else if (i < else if (i < NetItem.PiggyIndex.Item2)
NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots +
NetItem.MiscDyeSlots + NetItem.PiggySlots)
{ {
//98-138 //98-138
var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots var index = i - NetItem.PiggyIndex.Item1;
+ NetItem.MiscEquipSlots + NetItem.MiscDyeSlots);
this.inventory[i] = (NetItem)piggy[index]; this.inventory[i] = (NetItem)piggy[index];
} }
else if (i < else if (i < NetItem.SafeIndex.Item2)
NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots +
NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.SafeSlots)
{ {
//138-178 //138-178
var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots var index = i - NetItem.SafeIndex.Item1;
+ NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots);
this.inventory[i] = (NetItem)safe[index]; this.inventory[i] = (NetItem)safe[index];
} }
else if (i < else if (i < NetItem.ForgeIndex.Item2)
NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots +
NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.SafeSlots + NetItem.ForgeSlots)
{ {
//179-219 //179-219
var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots var index = i - NetItem.ForgeIndex.Item1;
+ NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.ForgeSlots);
this.inventory[i] = (NetItem)forge[index]; this.inventory[i] = (NetItem)forge[index];
} }
else else

0
TShockAPI/Properties/AssemblyInfo.cs Executable file → Normal file
View file

View file

@ -23,6 +23,7 @@ using System.Net;
using HttpServer; using HttpServer;
using TShockAPI; using TShockAPI;
using TShockAPI.DB; using TShockAPI.DB;
using Microsoft.Xna.Framework;
namespace Rests namespace Rests
{ {

View file

@ -15,6 +15,7 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using Microsoft.Xna.Framework;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;

View file

@ -0,0 +1,178 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Terraria;
using Terraria.Localization;
using Terraria.Net;
using Terraria.Net.Sockets;
namespace TShockAPI.Sockets
{
public class LinuxTcpSocket : ISocket
{
private byte[] _packetBuffer = new byte[1024];
private int _packetBufferLength;
private List<object> _callbackBuffer = new List<object>();
private int _messagesInQueue;
private TcpClient _connection;
private TcpListener _listener;
private SocketConnectionAccepted _listenerCallback;
private RemoteAddress _remoteAddress;
private bool _isListening;
public int MessagesInQueue
{
get
{
return this._messagesInQueue;
}
}
public LinuxTcpSocket()
{
this._connection = new TcpClient();
this._connection.NoDelay = true;
}
public LinuxTcpSocket(TcpClient tcpClient)
{
this._connection = tcpClient;
this._connection.NoDelay = true;
IPEndPoint iPEndPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
this._remoteAddress = new TcpAddress(iPEndPoint.Address, iPEndPoint.Port);
}
void ISocket.Close()
{
this._remoteAddress = null;
this._connection.Close();
}
bool ISocket.IsConnected()
{
return this._connection != null && this._connection.Client != null && this._connection.Connected;
}
void ISocket.Connect(RemoteAddress address)
{
TcpAddress tcpAddress = (TcpAddress)address;
this._connection.Connect(tcpAddress.Address, tcpAddress.Port);
this._remoteAddress = address;
}
private void ReadCallback(IAsyncResult result)
{
Tuple<SocketReceiveCallback, object> tuple = (Tuple<SocketReceiveCallback, object>)result.AsyncState;
tuple.Item1(tuple.Item2, this._connection.GetStream().EndRead(result));
}
private void SendCallback(IAsyncResult result)
{
object[] expr_0B = (object[])result.AsyncState;
LegacyNetBufferPool.ReturnBuffer((byte[])expr_0B[1]);
Tuple<SocketSendCallback, object> tuple = (Tuple<SocketSendCallback, object>)expr_0B[0];
try
{
this._connection.GetStream().EndWrite(result);
tuple.Item1(tuple.Item2);
}
catch (Exception)
{
((ISocket)this).Close();
}
}
void ISocket.SendQueuedPackets()
{
}
void ISocket.AsyncSend(byte[] data, int offset, int size, SocketSendCallback callback, object state)
{
byte[] array = LegacyNetBufferPool.RequestBuffer(data, offset, size);
this._connection.GetStream().BeginWrite(array, 0, size, new AsyncCallback(this.SendCallback), new object[]
{
new Tuple<SocketSendCallback, object>(callback, state),
array
});
}
void ISocket.AsyncReceive(byte[] data, int offset, int size, SocketReceiveCallback callback, object state)
{
this._connection.GetStream().BeginRead(data, offset, size, new AsyncCallback(this.ReadCallback), new Tuple<SocketReceiveCallback, object>(callback, state));
}
bool ISocket.IsDataAvailable()
{
return this._connection.GetStream().DataAvailable;
}
RemoteAddress ISocket.GetRemoteAddress()
{
return this._remoteAddress;
}
bool ISocket.StartListening(SocketConnectionAccepted callback)
{
IPAddress any = IPAddress.Any;
string ipString;
if (Program.LaunchParameters.TryGetValue("-ip", out ipString) && !IPAddress.TryParse(ipString, out any))
{
any = IPAddress.Any;
}
this._isListening = true;
this._listenerCallback = callback;
if (this._listener == null)
{
this._listener = new TcpListener(any, Netplay.ListenPort);
}
try
{
this._listener.Start();
}
catch (Exception)
{
return false;
}
ThreadPool.QueueUserWorkItem(new WaitCallback(this.ListenLoop));
return true;
}
void ISocket.StopListening()
{
this._isListening = false;
}
private void ListenLoop(object unused)
{
while (this._isListening && !Netplay.disconnect)
{
try
{
ISocket socket = new LinuxTcpSocket(this._listener.AcceptTcpClient());
Console.WriteLine(Language.GetTextValue("Net.ClientConnecting", socket.GetRemoteAddress()));
this._listenerCallback(socket);
}
catch (Exception)
{
}
}
this._listener.Stop();
// currently vanilla will stop listening when the slots are full, however it appears that this Netplay.IsListening
// flag is still set, making the server loop beleive it's still listening when it's actually not.
// clearing this flag when we actually have stopped will allow the ServerLoop to start listening again when
// there are enough slots available.
Netplay.IsListening = false;
}
}
}

22
TShockAPI/TSPlayer.cs Executable file → Normal file
View file

@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using Microsoft.Xna.Framework;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
@ -24,6 +25,7 @@ using System.IO;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Timers; using System.Timers;
using OTAPI.Tile;
using Terraria; using Terraria;
using Terraria.DataStructures; using Terraria.DataStructures;
using Terraria.ID; using Terraria.ID;
@ -121,12 +123,12 @@ namespace TShockAPI
/// <summary> /// <summary>
/// A queue of tiles destroyed by the player for reverting. /// A queue of tiles destroyed by the player for reverting.
/// </summary> /// </summary>
public Dictionary<Vector2, Tile> TilesDestroyed { get; protected set; } public Dictionary<Vector2, ITile> TilesDestroyed { get; protected set; }
/// <summary> /// <summary>
/// A queue of tiles placed by the player for reverting. /// A queue of tiles placed by the player for reverting.
/// </summary> /// </summary>
public Dictionary<Vector2, Tile> TilesCreated { get; protected set; } public Dictionary<Vector2, ITile> TilesCreated { get; protected set; }
/// <summary> /// <summary>
/// The player's group. /// The player's group.
@ -641,8 +643,8 @@ namespace TShockAPI
/// <param name="index">The player's index in the.</param> /// <param name="index">The player's index in the.</param>
public TSPlayer(int index) public TSPlayer(int index)
{ {
TilesDestroyed = new Dictionary<Vector2, Tile>(); TilesDestroyed = new Dictionary<Vector2, ITile>();
TilesCreated = new Dictionary<Vector2, Tile>(); TilesCreated = new Dictionary<Vector2, ITile>();
Index = index; Index = index;
Group = Group.DefaultGroup; Group = Group.DefaultGroup;
IceTiles = new List<Point>(); IceTiles = new List<Point>();
@ -655,8 +657,8 @@ namespace TShockAPI
/// <param name="playerName">The player's name.</param> /// <param name="playerName">The player's name.</param>
protected TSPlayer(String playerName) protected TSPlayer(String playerName)
{ {
TilesDestroyed = new Dictionary<Vector2, Tile>(); TilesDestroyed = new Dictionary<Vector2, ITile>();
TilesCreated = new Dictionary<Vector2, Tile>(); TilesCreated = new Dictionary<Vector2, ITile>();
Index = -1; Index = -1;
FakePlayer = new Player {name = playerName, whoAmI = -1}; FakePlayer = new Player {name = playerName, whoAmI = -1};
Group = Group.DefaultGroup; Group = Group.DefaultGroup;
@ -1022,6 +1024,14 @@ namespace TShockAPI
NetMessage.SendPlayerHurt(Index, PlayerDeathReason.LegacyDefault(), damage, (new Random()).Next(-1, 1), false, false, 0, -1, -1); NetMessage.SendPlayerHurt(Index, PlayerDeathReason.LegacyDefault(), damage, (new Random()).Next(-1, 1), false, false, 0, -1, -1);
} }
/// <summary>
/// Kills the player.
/// </summary>
public virtual void KillPlayer()
{
NetMessage.SendPlayerDeath(Index, PlayerDeathReason.LegacyDefault(), 99999, (new Random()).Next(-1, 1), false, -1, -1);
}
/// <summary> /// <summary>
/// Sets the player's team. /// Sets the player's team.
/// </summary> /// </summary>

View file

@ -16,6 +16,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using Microsoft.Xna.Framework;
using OTAPI.Tile;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Terraria; using Terraria;
@ -165,10 +167,10 @@ namespace TShockAPI
NetMessage.SendData((int)PacketTypes.NpcStrike, -1, -1, "", npcid, damage, knockBack, hitDirection); NetMessage.SendData((int)PacketTypes.NpcStrike, -1, -1, "", npcid, damage, knockBack, hitDirection);
} }
public void RevertTiles(Dictionary<Vector2, Tile> tiles) public void RevertTiles(Dictionary<Vector2, ITile> tiles)
{ {
// Update Main.Tile first so that when tile sqaure is sent it is correct // Update Main.Tile first so that when tile sqaure is sent it is correct
foreach (KeyValuePair<Vector2, Tile> entry in tiles) foreach (KeyValuePair<Vector2, ITile> entry in tiles)
{ {
Main.tile[(int)entry.Key.X, (int)entry.Key.Y] = entry.Value; Main.tile[(int)entry.Key.X, (int)entry.Key.Y] = entry.Value;
} }

38
TShockAPI/TShock.cs Executable file → Normal file
View file

@ -39,6 +39,8 @@ using TShockAPI.DB;
using TShockAPI.Hooks; using TShockAPI.Hooks;
using TShockAPI.ServerSideCharacters; using TShockAPI.ServerSideCharacters;
using Terraria.Utilities; using Terraria.Utilities;
using Microsoft.Xna.Framework;
using TShockAPI.Sockets;
namespace TShockAPI namespace TShockAPI
{ {
@ -46,13 +48,13 @@ namespace TShockAPI
/// This is the TShock main class. TShock is a plugin on the TerrariaServerAPI, so it extends the base TerrariaPlugin. /// This is the TShock main class. TShock is a plugin on the TerrariaServerAPI, so it extends the base TerrariaPlugin.
/// TShock also complies with the API versioning system, and defines its required API version here. /// TShock also complies with the API versioning system, and defines its required API version here.
/// </summary> /// </summary>
[ApiVersion(1, 26)] [ApiVersion(2, 0)]
public class TShock : TerrariaPlugin public class TShock : TerrariaPlugin
{ {
/// <summary>VersionNum - The version number the TerrariaAPI will return back to the API. We just use the Assembly info.</summary> /// <summary>VersionNum - The version number the TerrariaAPI will return back to the API. We just use the Assembly info.</summary>
public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version;
/// <summary>VersionCodename - The version codename is displayed when the server starts. Inspired by software codenames conventions.</summary> /// <summary>VersionCodename - The version codename is displayed when the server starts. Inspired by software codenames conventions.</summary>
public static readonly string VersionCodename = "Yoraiz0r R0cks"; public static readonly string VersionCodename = "Mintaka";
/// <summary>SavePath - This is the path TShock saves its data in. This path is relative to the TerrariaServer.exe (not in ServerPlugins).</summary> /// <summary>SavePath - This is the path TShock saves its data in. This path is relative to the TerrariaServer.exe (not in ServerPlugins).</summary>
public static string SavePath = "tshock"; public static string SavePath = "tshock";
@ -183,7 +185,20 @@ namespace TShockAPI
string logFilename; string logFilename;
string logPathSetupWarning; string logPathSetupWarning;
TerrariaApi.Reporting.CrashReporter.HeapshotRequesting += CrashReporter_HeapshotRequesting; OTAPI.Hooks.Net.Socket.Create = () =>
{
//Console.WriteLine($"Creating socket {nameof(LinuxTcpSocket)}");
return new LinuxTcpSocket();
//return new OTAPI.Sockets.PoolSocket();
//return new Terraria.Net.Sockets.TcpSocket();
};
OTAPI.Hooks.Player.Announce = (int playerId) =>
{
//TShock handles this
return OTAPI.HookResult.Cancel;
};
TerrariaApi.Reporting.CrashReporter.HeapshotRequesting += CrashReporter_HeapshotRequesting;
try try
{ {
@ -197,6 +212,10 @@ namespace TShockAPI
Main.ServerSideCharacter = ServerSideCharacterConfig.Enabled; Main.ServerSideCharacter = ServerSideCharacterConfig.Enabled;
//TSAPI previously would do this automatically, but the vanilla server wont
if (Netplay.ServerIP == null)
Netplay.ServerIP = IPAddress.Any;
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
// Log path was not already set by the command line parameter? // Log path was not already set by the command line parameter?
if (LogPath == LogPathDefault) if (LogPath == LogPathDefault)
@ -578,7 +597,7 @@ namespace TShockAPI
{ {
if (Main.worldPathName != null && Config.SaveWorldOnCrash) if (Main.worldPathName != null && Config.SaveWorldOnCrash)
{ {
Main.worldPathName += ".crash"; Main.ActiveWorldFileData._path += ".crash";
SaveManager.Instance.SaveWorld(); SaveManager.Instance.SaveWorld();
} }
} }
@ -685,7 +704,7 @@ namespace TShockAPI
} }
case "-autoshutdown": case "-autoshutdown":
{ {
Main.instance.autoShut(); Main.instance.EnableAutoShutdown();
break; break;
} }
case "-autocreate": case "-autocreate":
@ -715,9 +734,11 @@ namespace TShockAPI
int limit; int limit;
if (int.TryParse(parms[++i], out limit)) if (int.TryParse(parms[++i], out limit))
{ {
/* Todo - Requires an OTAPI modification
Netplay.MaxConnections = limit; Netplay.MaxConnections = limit;
ServerApi.LogWriter.PluginWriteLine(this, string.Format( ServerApi.LogWriter.PluginWriteLine(this, string.Format(
"Connections per IP have been limited to {0} connections.", limit), TraceLevel.Verbose); "Connections per IP have been limited to {0} connections.", limit), TraceLevel.Verbose);*/
ServerApi.LogWriter.PluginWriteLine(this, "\"-connperip\" is not supported in this version of TShock.", TraceLevel.Verbose);
} }
else else
ServerApi.LogWriter.PluginWriteLine(this, "Invalid value given for command line argument \"-connperip\".", TraceLevel.Warning); ServerApi.LogWriter.PluginWriteLine(this, "Invalid value given for command line argument \"-connperip\".", TraceLevel.Warning);
@ -1694,7 +1715,10 @@ namespace TShockAPI
invasionSize = 100 + (Config.InvasionMultiplier * Utils.ActivePlayers()); invasionSize = 100 + (Config.InvasionMultiplier * Utils.ActivePlayers());
} }
Main.StartInvasion(type, invasionSize); // Note: This is a workaround to previously providing the size as a parameter in StartInvasion
Main.invasionSize = invasionSize;
Main.StartInvasion(type);
} }
/// <summary>CheckProjectilePermission - Checks if a projectile is banned.</summary> /// <summary>CheckProjectilePermission - Checks if a projectile is banned.</summary>

View file

@ -68,10 +68,14 @@
<HintPath>..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll</HintPath> <HintPath>..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="OTAPI, Version=1.3.4.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\TerrariaServerAPI\TerrariaServerAPI\bin\Debug\OTAPI.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Web" /> <Reference Include="System.Web" />
@ -88,6 +92,7 @@
<Compile Include="ILog.cs" /> <Compile Include="ILog.cs" />
<Compile Include="NetItem.cs" /> <Compile Include="NetItem.cs" />
<Compile Include="PlayerData.cs" /> <Compile Include="PlayerData.cs" />
<Compile Include="Sockets\LinuxTcpSocket.cs" />
<Compile Include="SqlLog.cs" /> <Compile Include="SqlLog.cs" />
<Compile Include="TextLog.cs" /> <Compile Include="TextLog.cs" />
<Compile Include="PaginationTools.cs" /> <Compile Include="PaginationTools.cs" />
@ -178,9 +183,9 @@
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\TerrariaServerAPI\TerrariaServer.csproj"> <ProjectReference Include="..\TerrariaServerAPI\TerrariaServerAPI\TerrariaServerAPI.csproj">
<Project>{6877506E-ADC6-4142-98A6-79E4FA02855A}</Project> <Project>{6877506e-adc6-4142-98a6-79e4fa02855a}</Project>
<Name>TerrariaServer</Name> <Name>TerrariaServerAPI</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
@ -194,7 +199,7 @@
</PropertyGroup> </PropertyGroup>
<ProjectExtensions> <ProjectExtensions>
<VisualStudio> <VisualStudio>
<UserProperties BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildAction="Both" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_StartDate="2011/6/17" BuildVersion_IncrementBeforeBuild="False" /> <UserProperties BuildVersion_IncrementBeforeBuild="False" BuildVersion_StartDate="2011/6/17" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_BuildAction="Both" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
</VisualStudio> </VisualStudio>
</ProjectExtensions> </ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

1
TShockAPI/UpdateManager.cs Executable file → Normal file
View file

@ -22,6 +22,7 @@ using System.IO;
using System.Net; using System.Net;
using System.Threading; using System.Threading;
using Newtonsoft.Json; using Newtonsoft.Json;
using Microsoft.Xna.Framework;
namespace TShockAPI namespace TShockAPI
{ {

View file

@ -31,6 +31,7 @@ using Terraria.ID;
using Terraria.Utilities; using Terraria.Utilities;
using TShockAPI.DB; using TShockAPI.DB;
using BCrypt.Net; using BCrypt.Net;
using Microsoft.Xna.Framework;
namespace TShockAPI namespace TShockAPI
{ {

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<system.data> <system.data>
<DbProviderFactories> <DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" /> <remove invariant="MySql.Data.MySqlClient"/>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
</DbProviderFactories> </DbProviderFactories>
</system.data> </system.data>
</configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>

View file

@ -2,5 +2,5 @@
<packages> <packages>
<package id="BCrypt.Net" version="0.1.0" targetFramework="net45" /> <package id="BCrypt.Net" version="0.1.0" targetFramework="net45" />
<package id="MySql.Data" version="6.9.8" targetFramework="net45" /> <package id="MySql.Data" version="6.9.8" targetFramework="net45" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net45" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
</packages> </packages>

@ -1 +1 @@
Subproject commit 9050642fb6a98d4f50d97db34f837aaf485d3bf7 Subproject commit 302124e1bcf6a6661d518b84f630384a90dbcbcb

0
prebuilts/sqlite3.dll Executable file → Normal file
View file

View file

@ -29,6 +29,7 @@ cur_wd = os.getcwd()
release_dir = os.path.join(cur_wd, "releases") release_dir = os.path.join(cur_wd, "releases")
terraria_bin_name = "TerrariaServer.exe" terraria_bin_name = "TerrariaServer.exe"
otapi_bin_name = "OTAPI.dll"
mysql_bin_name = "MySql.Data.dll" mysql_bin_name = "MySql.Data.dll"
sqlite_dep_name = "sqlite3.dll" sqlite_dep_name = "sqlite3.dll"
sqlite_bin_name = "Mono.Data.Sqlite.dll" sqlite_bin_name = "Mono.Data.Sqlite.dll"
@ -39,13 +40,14 @@ tshock_symbols = "TShockAPI.dll.mdb"
bcrypt_bin_name = "BCrypt.Net.dll" bcrypt_bin_name = "BCrypt.Net.dll"
geoip_db_name = "GeoIP.dat" geoip_db_name = "GeoIP.dat"
terraria_release_bin = os.path.join(cur_wd, "TerrariaServerAPI", "bin", "Release", terraria_bin_name) terraria_release_bin = os.path.join(cur_wd, "TerrariaServerAPI", "TerrariaServerAPI", "bin", "Release", terraria_bin_name)
terraria_debug_bin = os.path.join(cur_wd, "TerrariaServerAPI", "bin", "Debug", terraria_bin_name) terraria_debug_bin = os.path.join(cur_wd, "TerrariaServerAPI", "TerrariaServerAPI", "bin", "Debug", terraria_bin_name)
otapi_bin = os.path.join(cur_wd, "TerrariaServerAPI", "TerrariaServerAPI", "bin", "Release", otapi_bin_name)
mysql_bin = os.path.join(cur_wd, "packages", "MySql.Data.6.9.8", "lib", "net45", mysql_bin_name) mysql_bin = os.path.join(cur_wd, "packages", "MySql.Data.6.9.8", "lib", "net45", mysql_bin_name)
sqlite_dep = os.path.join(cur_wd, "prebuilts", sqlite_dep_name) sqlite_dep = os.path.join(cur_wd, "prebuilts", sqlite_dep_name)
sqlite_bin = os.path.join(cur_wd, "prebuilts", sqlite_bin_name) sqlite_bin = os.path.join(cur_wd, "prebuilts", sqlite_bin_name)
http_bin = os.path.join(cur_wd, "prebuilts", http_bin_name) http_bin = os.path.join(cur_wd, "prebuilts", http_bin_name)
json_bin = os.path.join(cur_wd, "packages", "Newtonsoft.Json.8.0.3", "lib", "net45", json_bin_name) json_bin = os.path.join(cur_wd, "packages", "Newtonsoft.Json.9.0.1", "lib", "net45", json_bin_name)
bcrypt_bin = os.path.join(cur_wd, "packages", "BCrypt.Net.0.1.0", "lib", "net35", bcrypt_bin_name) bcrypt_bin = os.path.join(cur_wd, "packages", "BCrypt.Net.0.1.0", "lib", "net35", bcrypt_bin_name)
geoip_db = os.path.join(cur_wd, "prebuilts", geoip_db_name) geoip_db = os.path.join(cur_wd, "prebuilts", geoip_db_name)
release_bin = os.path.join(cur_wd, "TShockAPI", "bin", "Release", tshock_bin_name) release_bin = os.path.join(cur_wd, "TShockAPI", "bin", "Release", tshock_bin_name)
@ -66,18 +68,20 @@ def copy_dependencies():
def copy_debug_files(): def copy_debug_files():
shutil.copy(terraria_debug_bin, release_dir) shutil.copy(terraria_debug_bin, release_dir)
shutil.copy(otapi_bin, release_dir)
shutil.copy(os.path.join(debug_folder, tshock_bin_name), release_dir) shutil.copy(os.path.join(debug_folder, tshock_bin_name), release_dir)
shutil.copy(os.path.join(debug_folder, tshock_symbols), release_dir) shutil.copy(os.path.join(debug_folder, tshock_symbols), release_dir)
def copy_release_files(): def copy_release_files():
shutil.copy(terraria_release_bin, release_dir) shutil.copy(terraria_release_bin, release_dir)
shutil.copy(release_bin, release_dir) shutil.copy(otapi_bin, release_dir)
shutil.copy(release_bin, release_dir) shutil.copy(release_bin, release_dir)
def create_base_zip(name): def create_base_zip(name):
os.chdir(release_dir) os.chdir(release_dir)
zip = zipfile.ZipFile(name, "w") zip = zipfile.ZipFile(name, "w")
zip.write(terraria_bin_name) zip.write(terraria_bin_name)
zip.write(otapi_bin_name)
zip.write(sqlite_dep_name) zip.write(sqlite_dep_name)
zip.write(geoip_db_name) zip.write(geoip_db_name)
zip.write(http_bin_name, os.path.join("ServerPlugins", http_bin_name)) zip.write(http_bin_name, os.path.join("ServerPlugins", http_bin_name))
@ -136,6 +140,44 @@ def upload_artifacts():
def update_terraria_source(): def update_terraria_source():
subprocess.check_call(['/usr/bin/git', 'submodule', 'init']) subprocess.check_call(['/usr/bin/git', 'submodule', 'init'])
subprocess.check_call(['/usr/bin/git', 'submodule', 'update']) subprocess.check_call(['/usr/bin/git', 'submodule', 'update'])
subprocess.check_call(['nuget', 'restore', 'TerrariaServerAPI/'])
def run_bootstrapper():
for build_config in ['Debug','Release'] :
mod_bootstrapper_proc = subprocess.Popen(['xbuild', './TerrariaServerAPI/TShock.Modifications.Bootstrapper/TShock.Modifications.Bootstrapper.csproj', '/p:Configuration=' + build_config])
mod_clientuuid_proc = subprocess.Popen(['xbuild', './TerrariaServerAPI/TShock.Modifications.ClientUUID/TShock.Modifications.ClientUUID.csproj', '/p:Configuration=' + build_config])
mod_explosives_proc = subprocess.Popen(['xbuild', './TerrariaServerAPI/TShock.Modifications.Explosives/TShock.Modifications.Explosives.csproj', '/p:Configuration=' + build_config])
mod_ssc_proc = subprocess.Popen(['xbuild', './TerrariaServerAPI/TShock.Modifications.SSC/TShock.Modifications.SSC.csproj', '/p:Configuration=' + build_config])
mod_bootstrapper_proc.wait()
mod_clientuuid_proc.wait()
mod_explosives_proc.wait()
mod_ssc_proc.wait()
if (mod_bootstrapper_proc.returncode != 0):
raise CalledProcessError(mod_bootstrapper_proc.returncode)
if (mod_clientuuid_proc.returncode != 0):
raise CalledProcessError(mod_clientuuid_proc.returncode)
if (mod_explosives_proc.returncode != 0):
raise CalledProcessError(mod_explosives_proc.returncode)
if (mod_ssc_proc.returncode != 0):
raise CalledProcessError(mod_ssc_proc.returncode)
# run the bootstrapper to generate the new OTAPI.dll
os.chdir('./TerrariaServerAPI/TShock.Modifications.Bootstrapper/bin/' + build_config)
bootstrapper_proc = subprocess.Popen(['mono', 'TShock.Modifications.Bootstrapper.exe', '-in=OTAPI.dll', '-mod=../../../TShock.Modifications.**/bin/' + build_config + '/TShock.Modifications.*.dll', '-o=Output/OTAPI.dll'])
os.chdir(cur_wd)
bootstrapper_proc.wait()
if (bootstrapper_proc.returncode != 0):
raise CalledProcessError(bootstrapper_proc.returncode)
tsapi_proc = subprocess.Popen(['xbuild', './TerrariaServerAPI/TerrariaServerAPI/TerrariaServerAPI.csproj', '/p:Configuration=' + build_config])
tsapi_proc.wait()
if (tsapi_proc.returncode != 0):
raise CalledProcessError(tsapi_proc.returncode)
def build_software(): def build_software():
release_proc = subprocess.Popen(['xbuild', './TShockAPI/TShockAPI.csproj', '/p:Configuration=Release']) release_proc = subprocess.Popen(['xbuild', './TShockAPI/TShockAPI.csproj', '/p:Configuration=Release'])
@ -147,9 +189,11 @@ def build_software():
if (debug_proc.returncode != 0): if (debug_proc.returncode != 0):
raise CalledProcessError(debug_proc.returncode) raise CalledProcessError(debug_proc.returncode)
if __name__ == '__main__': if __name__ == '__main__':
create_release_folder() create_release_folder()
update_terraria_source() update_terraria_source()
run_bootstrapper();
copy_dependencies() copy_dependencies()
build_software() build_software()
package_release() package_release()