Added IceTile system.

This commit is contained in:
Lucas Nicodemus 2012-01-20 23:25:15 -07:00
parent efee7caed2
commit 11802f2a13
3 changed files with 163 additions and 49 deletions

90
Build/TerrariaServer.XML Normal file
View file

@ -0,0 +1,90 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>TerrariaServer</name>
</assembly>
<members>
<member name="T:TShock.Hooks.IHooks">
<summary>
Hooks interface
</summary>
</member>
<member name="P:TShock.IGame.Players">
<summary>
List of players
</summary>
</member>
<member name="T:TShock.HandlerList">
<summary>
See generic HandlerList
</summary>
</member>
<member name="T:TShock.HandlerList`1">
<summary>
Works like an event. Allows for registering delegates with a higher or lower priority.
</summary>
<typeparam name="T"></typeparam>
</member>
<member name="M:TShock.HandlerList`1.Register(System.EventHandler{`0},TShock.HandlerPriority,System.Boolean)">
<summary>
Register a handler
</summary>
<param name="handler">Delegate to be called</param>
<param name="priority">Priority of the delegate</param>
<param name="gethandled">Should the handler receive a call even if it has been handled</param>
</member>
<member name="M:TShock.IPlayer.Damage(System.Int32)">
<summary>
Attempts to damage the player.
</summary>
<param name="amt">int - how much damage to give</param>
</member>
<member name="M:TShock.IPlayer.SendMessage(System.String,Color)">
<summary>
Sends message to specified player
</summary>
<param name="msg">string - text to send</param>
<param name="color">Color - color for the text</param>
</member>
<member name="P:TShock.IPlayer.Id">
<summary>
Meant to only be used by TServer.
</summary>
</member>
<member name="P:TShock.IPlayer.Name">
<summary>
The character name of the player.
</summary>
</member>
<member name="M:TShock.Plugin.CreateInterfaces">
<summary>
Return a list of interfaces this plugin exposes.
</summary>
<returns></returns>
</member>
<member name="M:TShock.Plugin.SetInterfaces(System.Collections.Generic.IEnumerable{System.Object})">
<summary>
Called before initialize passing all the interfaces gathered from plugins
</summary>
<param name="interfaces"></param>
</member>
<member name="M:TShock.Plugin.GetInterface``1(System.Collections.Generic.IEnumerable{System.Object})">
<summary>
Gets the T interface from the collection. Returns null if its not found.
</summary>
<typeparam name="T"></typeparam>
<param name="interfaces"></param>
<returns></returns>
</member>
<member name="P:TShock.Hooks.Player.PlayerHooks.Join">
<summary>
Called when the player first connects. They are not fully in the game yet, for that see Greet.
</summary>
</member>
<member name="P:TShock.Hooks.Player.PlayerHooks.Greet">
<summary>
Called when the player is actually loaded into the game.
</summary>
</member>
</members>
</doc>

View file

@ -75,6 +75,8 @@ namespace TShockAPI
public PlayerData PlayerData; public PlayerData PlayerData;
public bool RequiresPassword; public bool RequiresPassword;
public bool SilentKickInProgress; public bool SilentKickInProgress;
public List<Point> IceTiles { get; set; }
public bool RealPlayer public bool RealPlayer
{ {
@ -86,7 +88,7 @@ namespace TShockAPI
get get
{ {
return RealPlayer && return RealPlayer &&
(Netplay.serverSock[Index] != null && Netplay.serverSock[Index].active && !Netplay.serverSock[Index].kill); (Netplay.serverSock[Index] != null && Netplay.serverSock[Index].active && !Netplay.serverSock[Index].kill);
} }
} }
@ -105,8 +107,8 @@ namespace TShockAPI
CacheIP = CacheIP =
RealPlayer RealPlayer
? (Netplay.serverSock[Index].tcpClient.Connected ? (Netplay.serverSock[Index].tcpClient.Connected
? TShock.Utils.GetRealIP(Netplay.serverSock[Index].tcpClient.Client.RemoteEndPoint.ToString()) ? TShock.Utils.GetRealIP(Netplay.serverSock[Index].tcpClient.Client.RemoteEndPoint.ToString())
: "") : "")
: ""; : "";
else else
return CacheIP; return CacheIP;
@ -213,28 +215,28 @@ namespace TShockAPI
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {
var msg = new WorldInfoMsg var msg = new WorldInfoMsg
{ {
Time = (int) Main.time, Time = (int) Main.time,
DayTime = Main.dayTime, DayTime = Main.dayTime,
MoonPhase = (byte) Main.moonPhase, MoonPhase = (byte) Main.moonPhase,
BloodMoon = Main.bloodMoon, BloodMoon = Main.bloodMoon,
MaxTilesX = Main.maxTilesX, MaxTilesX = Main.maxTilesX,
MaxTilesY = Main.maxTilesY, MaxTilesY = Main.maxTilesY,
SpawnX = tilex, SpawnX = tilex,
SpawnY = tiley, SpawnY = tiley,
WorldSurface = (int) Main.worldSurface, WorldSurface = (int) Main.worldSurface,
RockLayer = (int) Main.rockLayer, RockLayer = (int) Main.rockLayer,
//Sending a fake world id causes the client to not be able to find a stored spawnx/y. //Sending a fake world id causes the client to not be able to find a stored spawnx/y.
//This fixes the bed spawn point bug. With a fake world id it wont be able to find the bed spawn. //This fixes the bed spawn point bug. With a fake world id it wont be able to find the bed spawn.
WorldID = !fakeid ? Main.worldID : -1, WorldID = !fakeid ? Main.worldID : -1,
WorldFlags = (WorldGen.shadowOrbSmashed ? WorldInfoFlag.OrbSmashed : WorldInfoFlag.None) | WorldFlags = (WorldGen.shadowOrbSmashed ? WorldInfoFlag.OrbSmashed : WorldInfoFlag.None) |
(NPC.downedBoss1 ? WorldInfoFlag.DownedBoss1 : WorldInfoFlag.None) | (NPC.downedBoss1 ? WorldInfoFlag.DownedBoss1 : WorldInfoFlag.None) |
(NPC.downedBoss2 ? WorldInfoFlag.DownedBoss2 : WorldInfoFlag.None) | (NPC.downedBoss2 ? WorldInfoFlag.DownedBoss2 : WorldInfoFlag.None) |
(NPC.downedBoss3 ? WorldInfoFlag.DownedBoss3 : WorldInfoFlag.None) | (NPC.downedBoss3 ? WorldInfoFlag.DownedBoss3 : WorldInfoFlag.None) |
(Main.hardMode ? WorldInfoFlag.HardMode : WorldInfoFlag.None) | (Main.hardMode ? WorldInfoFlag.HardMode : WorldInfoFlag.None) |
(NPC.downedClown ? WorldInfoFlag.DownedClown : WorldInfoFlag.None), (NPC.downedClown ? WorldInfoFlag.DownedClown : WorldInfoFlag.None),
WorldName = Main.worldName WorldName = Main.worldName
}; };
msg.PackFull(ms); msg.PackFull(ms);
SendRawData(ms.ToArray()); SendRawData(ms.ToArray());
} }
@ -277,11 +279,11 @@ namespace TShockAPI
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {
var msg = new SpawnMsg var msg = new SpawnMsg
{ {
PlayerIndex = (byte) Index, PlayerIndex = (byte) Index,
TileX = tilex, TileX = tilex,
TileY = tiley TileY = tiley
}; };
msg.PackFull(ms); msg.PackFull(ms);
SendRawData(ms.ToArray()); SendRawData(ms.ToArray());
} }
@ -292,10 +294,10 @@ namespace TShockAPI
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {
var msg = new ProjectileRemoveMsg var msg = new ProjectileRemoveMsg
{ {
Index = (short) index, Index = (short) index,
Owner = (byte) owner Owner = (byte) owner
}; };
msg.PackFull(ms); msg.PackFull(ms);
SendRawData(ms.ToArray()); SendRawData(ms.ToArray());
} }
@ -323,7 +325,7 @@ namespace TShockAPI
Main.item[itemid].SetDefaults(name); Main.item[itemid].SetDefaults(name);
// The set default overrides the wet and stack set by NewItem // The set default overrides the wet and stack set by NewItem
Main.item[itemid].wet = Collision.WetCollision(Main.item[itemid].position, Main.item[itemid].width, Main.item[itemid].wet = Collision.WetCollision(Main.item[itemid].position, Main.item[itemid].width,
Main.item[itemid].height); Main.item[itemid].height);
Main.item[itemid].stack = stack; Main.item[itemid].stack = stack;
Main.item[itemid].owner = Index; Main.item[itemid].owner = Index;
Main.item[itemid].prefix = (byte) prefix; Main.item[itemid].prefix = (byte) prefix;
@ -349,7 +351,7 @@ namespace TShockAPI
public virtual void DamagePlayer(int damage) public virtual void DamagePlayer(int damage)
{ {
NetMessage.SendData((int) PacketTypes.PlayerDamage, -1, -1, "", Index, ((new Random()).Next(-1, 1)), damage, NetMessage.SendData((int) PacketTypes.PlayerDamage, -1, -1, "", Index, ((new Random()).Next(-1, 1)), damage,
(float) 0); (float) 0);
} }
public virtual void SetTeam(int team) public virtual void SetTeam(int team)
@ -364,14 +366,14 @@ namespace TShockAPI
SetBuff(33, 330, true); //Weak SetBuff(33, 330, true); //Weak
SetBuff(32, 330, true); //Slow SetBuff(32, 330, true); //Slow
SetBuff(23, 330, true); //Cursed SetBuff(23, 330, true); //Cursed
if (!string.IsNullOrEmpty(reason)) if (!string.IsNullOrEmpty(reason))
Log.ConsoleInfo(string.Format("Player {0} has been disabled for {1}", Name, reason)); Log.ConsoleInfo(string.Format("Player {0} has been disabled for {1}", Name, reason));
var trace = new StackTrace(); var trace = new StackTrace();
StackFrame frame = null; StackFrame frame = null;
frame = trace.GetFrame(1); frame = trace.GetFrame(1);
if (frame != null && frame.GetMethod().DeclaringType != null) if (frame != null && frame.GetMethod().DeclaringType != null)
Log.Debug(frame.GetMethod().DeclaringType.Name + " called Disable()"); Log.Debug(frame.GetMethod().DeclaringType.Name + " called Disable()");
} }
public virtual void Whoopie(object time) public virtual void Whoopie(object time)
@ -397,7 +399,7 @@ namespace TShockAPI
//Todo: Separate this into a few functions. SendTo, SendToAll, etc //Todo: Separate this into a few functions. SendTo, SendToAll, etc
public virtual void SendData(PacketTypes msgType, string text = "", int number = 0, float number2 = 0f, public virtual void SendData(PacketTypes msgType, string text = "", int number = 0, float number2 = 0f,
float number3 = 0f, float number4 = 0f, int number5 = 0) float number3 = 0f, float number4 = 0f, int number5 = 0)
{ {
if (RealPlayer && !ConnectionAlive) if (RealPlayer && !ConnectionAlive)
return; return;
@ -489,14 +491,14 @@ namespace TShockAPI
} }
public void SpawnNPC(int type, string name, int amount, int startTileX, int startTileY, int tileXRange = 100, public void SpawnNPC(int type, string name, int amount, int startTileX, int startTileY, int tileXRange = 100,
int tileYRange = 50) int tileYRange = 50)
{ {
for (int i = 0; i < amount; i++) for (int i = 0; i < amount; i++)
{ {
int spawnTileX; int spawnTileX;
int spawnTileY; int spawnTileY;
TShock.Utils.GetRandomClearTileWithInRange(startTileX, startTileY, tileXRange, tileYRange, out spawnTileX, TShock.Utils.GetRandomClearTileWithInRange(startTileX, startTileY, tileXRange, tileYRange, out spawnTileX,
out spawnTileY); out spawnTileY);
int npcid = NPC.NewNPC(spawnTileX*16, spawnTileY*16, type, 0); int npcid = NPC.NewNPC(spawnTileX*16, spawnTileY*16, type, 0);
// This is for special slimes // This is for special slimes
Main.npc[npcid].SetDefaults(name); Main.npc[npcid].SetDefaults(name);

View file

@ -1088,10 +1088,32 @@ namespace TShockAPI
public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType ) public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType )
{ {
if (!player.Group.HasPermission(Permissions.canbuild) && !(TShock.Config.AllowIce && tileType == 127) ) if (!player.Group.HasPermission(Permissions.canbuild))
{ {
player.SendMessage("You do not have permission to build!", Color.Red); if (TShock.Config.AllowIce && tileType == 0)
return true; {
foreach (Point p in player.IceTiles)
{
if (p.X == tileX)
{
if (p.Y == tileY)
{
player.IceTiles.Remove(p);
return false;
}
}
}
}
if (TShock.Config.AllowIce && tileType == 127)
{
player.IceTiles.Add(new Point(tileX, tileY));
}
else
{
player.SendMessage("You do not have permission to build!", Color.Red);
return true;
}
} }
if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) &&
Regions.InArea(tileX, tileY)) Regions.InArea(tileX, tileY))