public static void OnSetDefaultsEnd(Terraria.Projectile projectle, int type) { var ctx = new HookContext(); var args = new HookArgs.ProjectileSetDefaults() { Projectile = projectle, Type = type, State = MethodState.End }; HookPoints.ProjectileSetDefaults.Invoke(ref ctx, ref args); }
//Death message //Player killed //Teleport /// <summary> /// Callde via vanilla code when a player has been hurt /// </summary> /// <param name="player">Player.</param> /// <param name="damage">Damage.</param> /// <param name="hitDirection">Hit direction.</param> /// <param name="pvp">If set to <c>true</c> pvp.</param> /// <param name="quiet">If set to <c>true</c> quiet.</param> /// <param name="deathText">Death text.</param> /// <param name="crit">If set to <c>true</c> crit.</param> /// <param name="cooldownCounter">Cooldown counter.</param> public static bool OnPlayerHurt(Terraria.Player player, int damage, int hitDirection, bool pvp = false, bool quiet = false, string deathText = " was slain...", bool crit = false, int cooldownCounter = -1) { var ctx = new HookContext() { // Sender = player, This // Player = player }; var args = new HookArgs.PlayerHurt() { Victim = player, Damage = damage, HitDirection = hitDirection, Pvp = pvp, Quiet = quiet, Obituary = deathText, Critical = crit, CooldownCounter = cooldownCounter }; HookPoints.PlayerHurt.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) return false; return ctx.Result == HookResult.DEFAULT; }
/// <summary> /// Raised by vanilla code when a player has been killed /// </summary> /// <param name="player">Player.</param> /// <param name="dmg">Dmg.</param> /// <param name="hitDirection">Hit direction.</param> /// <param name="pvp">Pvp.</param> /// <param name="deathText">Death text.</param> public static bool OnPlayerKilled(Terraria.Player player, ref double dmg, ref int hitDirection, ref bool pvp, ref string deathText) { var ctx = new HookContext() { Sender = player, Player = player }; var args = new HookArgs.PlayerKilled() { Damage = dmg, HitDirection = hitDirection, PvP = pvp, DeathText = deathText }; HookPoints.PlayerKilled.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) return false; if (ctx.Result == HookResult.DEFAULT) { deathText = player.name + deathText; return true; } dmg = args.Damage; hitDirection = args.HitDirection; pvp = args.PvP; deathText = args.DeathText; return ctx.Result != HookResult.IGNORE; }
public static bool OnDropBossBagBegin(ref int itemId, int x, int y, int width, int height, int type, int stack = 1, bool noBroadcast = false, int prefix = 0, bool noGrabDelay = false, bool reverseLookup = false) { itemId = 0; var ctx = new HookContext(); var args = new HookArgs.NpcDropBossBag() { State = MethodState.Begin, X = x, Y = y, Width = width, Height = height, Type = type, Stack = stack, NoBroadcast = noBroadcast, Prefix = prefix, NoGrabDelay = noGrabDelay, ReverseLookup = reverseLookup }; HookPoints.NpcDropBossBag.Invoke(ref ctx, ref args); if (ctx.ResultParam != null && ctx.ResultParam is int) itemId = (int)ctx.ResultParam; else if (ctx.Result == HookResult.IGNORE) itemId = -1; return ctx.Result == HookResult.DEFAULT; //If default then continue on to vanillacode }
void OnStateChange(ref HookContext ctx, ref HookArgs.ServerStateChange args) { if (args.ServerChangeState == ServerState.Initialising) { ProgramLog.Plugin.Log("MSSQL connector is: " + (_connector == null ? "disabled" : "enabled")); } }
public ClientConnection(Socket sock) : base(sock) { if (SlotId == 0) SlotId = -1; var remoteEndPoint = (IPEndPoint)sock.RemoteEndPoint; _remoteAddress = new TcpAddress(remoteEndPoint.Address, remoteEndPoint.Port); sock.LingerState = new LingerOption(true, 10); sock.NoDelay = true; var ctx = new HookContext { Connection = this }; var args = new HookArgs.NewConnection(); HookPoints.NewConnection.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) return; _isReceiving = true; //The connection was established, so we can begin reading }
/// <summary> /// Sets the authentication of this user /// </summary> /// <param name="auth">Auth.</param> /// <param name="by">By.</param> public static void SetAuthentication(this BasePlayer player, string auth, string by) { var ctx = new HookContext() { Player = (Terraria.Player)player, Connection = player.Connection.Socket }; var changing = new TDSMHookArgs.PlayerAuthenticationChanging() { AuthenticatedAs = auth, AuthenticatedBy = by }; TDSMHookPoints.PlayerAuthenticationChanging.Invoke(ref ctx, ref changing); if (ctx.Result != HookResult.DEFAULT) return; player.SetAuthenticatedAs(auth); player.SetAuthenticatedBy(by); ctx = new HookContext() { Player = (Terraria.Player)player, Connection = player.Connection.Socket }; var changed = new TDSMHookArgs.PlayerAuthenticationChanged() { AuthenticatedAs = auth, AuthenticatedBy = by }; TDSMHookPoints.PlayerAuthenticationChanged.Invoke(ref ctx, ref changed); }
/// <summary> /// Handles the connection state when receiving a packet /// </summary> public static void CheckState(ref HookContext ctx, ref HookArgs.CheckBufferState args) { if (Terraria.Netplay.Clients[args.BufferId].State == (int)ConnectionState.AwaitingUserPassword) { //Since this is a custom state, we accept it [true to kick the connection, false to accept] ctx.SetResult(HookResult.RECTIFY, true, false /* TODO validate packets */); } }
public bool Read(int bufferId, int start, int length) { var buffer = NetMessage.buffer[bufferId]; var player = Main.player[bufferId]; if (Main.netMode != 2) return true; int x = (int)buffer.reader.ReadInt16(); int y = (int)buffer.reader.ReadInt16(); if (Math.Abs(player.position.X / 16 - x) >= 7 || Math.Abs(player.position.Y / 16 - y) >= 7) return true; int chestIndex = Chest.FindChest(x, y); if (chestIndex <= -1 || Chest.UsingChest(chestIndex) != -1) return true; var ctx = new HookContext { Connection = player.Connection.Socket, Player = player, Sender = player }; var args = new TDSMHookArgs.ChestOpenReceived { X = x, Y = y, ChestIndex = chestIndex }; TDSMHookPoints.ChestOpenReceived.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) return true; if (ctx.Result == HookResult.IGNORE) return true; if (ctx.Result == HookResult.DEFAULT && chestIndex > -1) { for (int i = 0; i < 40; i++) { NetMessage.SendData(32, bufferId, -1, "", chestIndex, (float)i, 0, 0, 0, 0, 0); } NetMessage.SendData(33, bufferId, -1, "", chestIndex, 0, 0, 0, 0, 0, 0); Main.player[bufferId].chest = chestIndex; if (Main.myPlayer == bufferId) { Main.recBigList = false; } NetMessage.SendData(80, -1, bufferId, "", bufferId, (float)chestIndex, 0, 0, 0, 0, 0); } return true; }
public bool Read(int bufferId, int start, int length) { var buffer = NetMessage.buffer[bufferId]; byte kind = buffer.reader.ReadByte(); int x = (int)buffer.reader.ReadInt16(); int y = (int)buffer.reader.ReadInt16(); if (!WorldGen.InWorld(x, y, 3)) return true; int direction = (buffer.reader.ReadByte() == 0) ? -1 : 1; var args = new TDSMHookArgs.BarrierStateChange() { X = x, Y = y, Direction = direction, Kind = kind }; var ctx = new HookContext() { Sender = Main.player[bufferId], Player = Main.player[bufferId] }; TDSMHookPoints.BarrierStateChange.Invoke(ref ctx, ref args); if (ctx.Result == HookResult.DEFAULT) { if (kind == 0) WorldGen.OpenDoor(x, y, direction); else if (kind == 1) WorldGen.CloseDoor(x, y, true); else if (kind == 2) WorldGen.ShiftTrapdoor(x, y, direction == 1, 1); else if (kind == 3) WorldGen.ShiftTrapdoor(x, y, direction == 1, 0); else if (kind == 4) WorldGen.ShiftTallGate(x, y, false); else if (kind == 5) WorldGen.ShiftTallGate(x, y, true); if (Main.netMode == 2) NetMessage.SendData((int)Packet.BARRIER_STATE_CHANGE, -1, bufferId, "", (int)kind, (float)x, (float)y, (float)((direction == 1) ? 1 : 0)); } else if (ctx.Result == HookResult.RECTIFY) { if (Main.netMode == 2) { //Teleport ctx.Player.Teleport(args.Position); //I would think to send the real door state if (kind == 0) kind = 1; else if (kind == 1) kind = 0; else if (kind == 2) kind = 3; else if (kind == 3) kind = 2; else if (kind == 4) kind = 5; else if (kind == 5) kind = 4; if (Main.netMode == 2) NetMessage.SendData((int)Packet.BARRIER_STATE_CHANGE, -1, bufferId, "", (int)kind, (float)x, (float)y, (float)((direction == 1) ? 1 : 0)); } } return true; }
public static bool OnStartHardMode() { var ctx = new HookContext(); var args = new HookArgs.StartHardMode(); HookPoints.StartHardMode.Invoke(ref ctx, ref args); return ctx.Result == HookResult.DEFAULT; }
void OnChat(ref HookContext ctx, ref TDSMHookArgs.PlayerChat args) { if (args.Message.Length > 0 && args.Message.Substring(0, 1).Equals("/")) { ProgramLog.Log(ctx.Player.name + " sent command: " + args.Message); ctx.SetResult(HookResult.IGNORE); CommandParser.ParsePlayerCommand(ctx.Player, args.Message); } }
public static void OnAddBanEnd(int player) { var ctx = new HookContext(); var args = new HookArgs.AddBan() { State = MethodState.End, Slot = player }; HookPoints.AddBan.Invoke(ref ctx, ref args); }
public static void OnAIEnd(Terraria.Projectile projectle) { var ctx = new HookContext(); var args = new HookArgs.ProjectileAI() { Projectile = projectle, State = MethodState.End }; HookPoints.ProjectileAI.Invoke(ref ctx, ref args); }
public static void OnWorldClearEnd() { GC.Collect(); var ctx = new HookContext(); var args = new HookArgs.WorldClear() { State = MethodState.End }; HookPoints.WorldClear.Invoke(ref ctx, ref args); }
/// <summary> /// Called when vanilla code successfully summons an Invasion NPC /// </summary> /// <param name="x">The x coordinate.</param> /// <param name="y">The y coordinate.</param> public static void OnInvasionNPCSpawn(int x, int y) { var ctx = new HookContext(); var args = new HookArgs.InvasionNPCSpawn() { X = x, Y = y }; HookPoints.InvasionNPCSpawn.Invoke(ref ctx, ref args); // return ctx.Result == HookResult.DEFAULT; }
public static bool OnAddBanBegin(int player) { var ctx = new HookContext(); var args = new HookArgs.AddBan() { State = MethodState.Begin, Slot = player }; HookPoints.AddBan.Invoke(ref ctx, ref args); return ctx.Result == HookResult.DEFAULT; }
public bool Read(int bufferId, int start, int length) { var buffer = NetMessage.buffer[bufferId]; var x = (int)buffer.reader.ReadInt16(); var y = (int)buffer.reader.ReadInt16(); var colour = buffer.reader.ReadByte(); if (!WorldGen.InWorld(x, y, 3)) { return true; } var player = Main.player[bufferId]; var ctx = new HookContext { Connection = player.Connection.Socket, Sender = player, Player = player, }; var args = new TDSMHookArgs.PaintWall { X = x, Y = y, Colour = colour }; TDSMHookPoints.PaintWall.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) return true; if (ctx.Result == HookResult.IGNORE) return true; if (ctx.Result == HookResult.RECTIFY) { NetMessage.SendTileSquare(bufferId, x, y, 1); return true; } WorldGen.paintWall(x, y, colour, false); if (Main.netMode == 2) { NetMessage.SendData(64, -1, bufferId, "", x, (float)y, (float)colour, 0f, 0, 0, 0); } return true; }
public static bool OnPressurePlateTriggered(OTA.Command.Sender sender, int x, int y) { var ctx = new HookContext(); var args = new HookArgs.PressurePlateTriggered() { Sender = sender, X = x, Y = y }; HookPoints.PressurePlateTriggered.Invoke(ref ctx, ref args); return ctx.Result == HookResult.DEFAULT; }
public static bool OnWorldClearBegin() { MainCallback.ResetTileArray(); var ctx = new HookContext(); var args = new HookArgs.WorldClear() { State = MethodState.Begin }; HookPoints.WorldClear.Invoke(ref ctx, ref args); return ctx.Result == HookResult.DEFAULT; }
/// <summary> /// Handles packets received from OTA /// </summary> public static void HandlePacket(ref HookContext ctx, ref HookArgs.ReceiveNetMessage args) { if (_packetHandlers != null) { if (_packetHandlers[args.PacketId] != null) { if (_packetHandlers[args.PacketId].Read(args.BufferId, args.Start, args.Length)) { //Packet informed us that it was read, let OTA know we consumed the packet ctx.SetResult(HookResult.IGNORE, true); } } } }
/// <summary> /// Determines if can spawn NPC at the specified x y type start. /// </summary> /// <remarks>Called as part of Terraria.NPC.NewNPC</remarks> /// <returns><c>true</c> if can spawn NP the specified x y type start; otherwise, <c>false</c>.</returns> /// <param name="x">The x coordinate.</param> /// <param name="y">The y coordinate.</param> /// <param name="type">Type.</param> /// <param name="start">Start.</param> public static bool CanSpawnNPC(int x, int y, int type, int start = 0) { var ctx = new HookContext(); var args = new HookArgs.NpcSpawn() { X = x, Y = y, Type = type, Start = start }; HookPoints.NpcSpawn.Invoke(ref ctx, ref args); return ctx.Result == HookResult.DEFAULT; }
/// <summary> /// The request from vanilla code to start listening for commands /// </summary> public static void ListenForCommands() { var ctx = new HookContext() { Sender = HookContext.ConsoleSender }; var args = new HookArgs.StartCommandProcessing(); HookPoints.StartCommandProcessing.Invoke(ref ctx, ref args); if (ctx.Result == HookResult.DEFAULT) { //This might change to the vanilla code (allowing for pure vanilla functionalities). but we'll see. System.Threading.ThreadPool.QueueUserWorkItem(ListenForCommands); } }
void OnReadConfig(ref HookContext ctx, ref HookArgs.ConfigurationLine args) { switch (args.Key) { case "sqlite": if (_connector == null) { var cn = new SQLiteConnector(args.Value); cn.Open(); Storage.SetConnector(cn); _connector = cn; } break; } }
public static int OnSetDefaultsBegin(Terraria.Projectile projectle, int type) { var ctx = new HookContext(); var args = new HookArgs.ProjectileSetDefaults() { Projectile = projectle, Type = type, State = MethodState.Begin }; HookPoints.ProjectileSetDefaults.Invoke(ref ctx, ref args); type = args.Type; if (ctx.Result == HookResult.RECTIFY && ctx.ResultParam is Int32) type = (int)ctx.ResultParam; return type; }
public bool Read(int bufferId, int start, int length) { var buffer = NetMessage.buffer[bufferId]; var player = Main.player[bufferId]; if (Main.netMode != 2) { return true; } int x = (int)buffer.reader.ReadInt16(); int y = (int)buffer.reader.ReadInt16(); int id = Sign.ReadSign(x, y, true); if (id >= 0) { var ctx = new HookContext { Connection = player.Connection.Socket, Sender = player, Player = player }; var args = new TDSMHookArgs.SignTextGet { X = x, Y = y, SignIndex = (short)id, Text = (id >= 0 && Main.sign[id] != null) ? Main.sign[id].text : null, }; TDSMHookPoints.SignTextGet.Invoke(ref ctx, ref args); if (ctx.CheckForKick() || ctx.Result == HookResult.IGNORE) return true; if (args.Text != null) { NetMessage.SendData(47, bufferId, -1, "", id, (float)bufferId, 0, 0, 0, 0, 0); } } return true; }
private void Command(ref HookContext ctx, ref TDSMHookArgs.ServerCommand args) { if (args.Prefix == "!") return; //Perhaps here we can use the player's PluginData, and simply store a string for the console if (ctx.Sender is Player) { if (CommandDictionary.ContainsKey(ctx.Player.name)) CommandDictionary[ctx.Player.name] = "/" + args.Prefix + " " + args.ArgumentString; else CommandDictionary.Add(ctx.Player.name, "/" + args.Prefix + " " + args.ArgumentString); } else if (ctx.Sender is ConsoleSender) { if (CommandDictionary.ContainsKey("CONSOLE")) CommandDictionary["CONSOLE"] = args.Prefix + " " + args.ArgumentString; else CommandDictionary.Add("CONSOLE", args.Prefix + " " + args.ArgumentString); } }
/// <summary> /// The callback from Terraria.Netplay.Initialize /// </summary> public static bool Initialise() { #if Full_API if (Terraria.Main.dedServ) { var ctx = new HookContext() { Sender = HookContext.ConsoleSender }; var args = new HookArgs.ServerStateChange() { ServerChangeState = ServerState.Starting }; HookPoints.ServerStateChange.Invoke(ref ctx, ref args); return ctx.Result != HookResult.IGNORE; } #endif return true; //Allow continue }
void OnGreetPlayer(ref HookContext ctx, ref HookArgs.PlayerPreGreeting args) { ctx.SetResult(HookResult.IGNORE); var lines = args.Motd.Split(new string[] { "\\0" }, StringSplitOptions.None); foreach (var line in lines) ctx.Player.SendMessage(line, 255, 0, 0, 255); string list = ""; for (int i = 0; i < 255; i++) { if (Main.player[i].active) { if (list == "") list += Main.player[i].name; else list = list + ", " + Main.player[i].name; } } ctx.Player.SendMessage("Current players: " + list + ".", 255, 255, 240, 20); }
public bool Read(int bufferId, int start, int length) { var buffer = NetMessage.buffer[bufferId]; int npcId = (int)buffer.reader.ReadInt16(); int playerId = (int)buffer.reader.ReadByte(); if (Main.netMode == 2) playerId = bufferId; var ply = Main.player[playerId]; var ctx = new HookContext() { Sender = ply, Player = ply }; var args = new TDSMHookArgs.NpcHurtReceived() { Victim = Terraria.Main.npc[npcId], Damage = ply.inventory[ply.selectedItem].damage, HitDirection = ply.direction, Knockback = ply.inventory[ply.selectedItem].knockBack, Critical = false, FromNet = false, NoEffect = false }; TDSMHookPoints.NpcHurtReceived.Invoke(ref ctx, ref args); if (ctx.CheckForKick() || ctx.Result == HookResult.IGNORE) return true; Terraria.Main.npc[npcId].StrikeNPC(args.Damage, args.Knockback, args.HitDirection, false, false, false); if (Main.netMode == 2) { NetMessage.SendData(24, -1, bufferId, "", npcId, (float)playerId, 0, 0, 0, 0, 0); NetMessage.SendData(23, -1, -1, "", npcId, 0, 0, 0, 0, 0, 0); } return true; }